Linux讲解 文件系统 inode节点

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Hanani_Jia/article/details/82776984

我们可以通过stat命令来查看更加详细的文件属性。

  这里边其中有几个概念我们是要了解清楚的,就是Block,IO Block,以及Inode。

  Inode是一个很重要的概念,理解透彻inode对整个文件系统的了解层次就会提升一个等级。

  我们需要一点一点说起我们文件存储在磁盘上,磁盘存储的最小单位是扇区,每一个扇区的大小是512字节也就是0.5kb,但是我们的操作系统在读取磁盘的时候一般不会一个扇区一个扇区的读取,因为这样读取的效率是比较低的,他一般会连续读取好几个扇区。也就是一次性读取一个块block,这种由扇区组成的块,就是文件读取的最小单位,一般来说块的大小就是4个字节,也就是我们上边看到的IO Block 4096,也就是八个扇区组成了一个块。

 我们在存储一个文件的时候不能只单纯的存储文件的内容,还需要存储文件的创建者,文件的创建日期,文件的大小等等一系列内容,这种存储文件元信息的区域就叫做inode,中文我们把它叫做索引节点。每一个文件都有一个数字自己的inode。

  Stat就能显示出来我们的inode里边所存储的内容,总结的来说inode里边包括:

文件的字节数

文件的所有者ID

文件的所在组ID

文件的读写执行权限

文件的时间戳就是我们stat显示出来下边的最大的一块。Inode上次变动的时间,文件上次变动的时间,文件上次打开的时间。

文件的链接数

文件数据block的位置信息

  但是我们的inode里边是不存储我们文件的名称的。这里需要注意。之后我们会介绍为什么没有文件名字。

  Inode也会占用我们的磁盘空间,所以在磁盘格式化的时候,操作系统会自动把硬盘分为两个区,一个区域来存储我们的数据信息,另一个区域来存储我们的inode结点信息。每个inode结点一般大小是128k或者256k,并且inode结点总数是在系统初始化的时候就已经给定好的。一般来说1k或者2k就会有一个inode结点,我们在Linux下可以通过df -i命令来查看磁盘分区下边的inode使用情况。

这里可以看到我们当前系统的三个分区的使用情况,分别显示了系统分区的名字,inode结点的总数,已经用了多少个,还空闲多少个,使用的占的百分比。

 每一个文件都必须有一个inode结点,但是我们的inode结点是有限的,所以就可能存在我们的磁盘还有空间但是没有inode结点的情况,但是这种情况几乎是不太可能发生的,总不能所有文件都比1k要小吧。

  每隔inode都是一个数字,操作系统可以通过这个数字来识别不同的文件,Linux中系统识别文件是不通过文件名的,文件名只是我们inode的一个别称,操作系统真正访问数据通过的都是inode号码。系统打开文件分成三步:首先找到这个文件名所对应的inode号码。然后通过inode号码获取inode结点上边的信息。之后根据inode的信息找到数据所在磁盘上边的block位置进行数据访问,我们可以通过ls -i 文件名来查看某个文件所对应的inode结点号是多少。

136467就是我们cheng.c这个文件的inode结点号。但是这个结点号是不会被保存在我们的inode之中的,因为inode结点是顺序排列,系统可以通过简单的算法来得出inode节点号。

  Inode中还有一个十分重要的信息,是一个指针数组,这些指针指向了数据磁盘块的地址,如果这些指针出现错误那操作系统就不能读取这个文件的数据。所以我们经常操作的删除文件,只不过是让对应的inode结点和对应的磁盘数据分开了,所以有一些工具是可以帮助我们找到我们之前所删除掉的文件。所以真正删除文件只能是通过格式化,或者通过大文件来把他覆盖掉。

  之后我们要介绍另一个东西就是超级块,如果说inode文件系统的核心,那超级块就是我们文件系统的心脏。为什么超级块会这么重要,超级块中保存了磁盘的已用空间,数据可用的空间,inode结点信息等等十分重要的全局信息。操作系统启动之后,内核会把超级块中的内容复制到内存中,并且会利用内存中的最新数据来更新超级块中的内容,但是这个过程不是时时刻刻都在同步的,通常是在进行开关机操作的时候操作系统才会进行同步,所以异常断电,可能会造成我们文件的损坏,甚至可能会对我们的文件系统造成很大的破坏。当出现这种情况的时候,我们的操作系统经常会自己进行同步,所以这也就是为什么我们的Linux操作系统的稳定性要高于我们的windows系统。当操作系统重新启动的时候,操作系统内核会把两者进行比较根据他们的差异来给文件系统打上标签。可以看出来超级块对文件系统是十分重要的,一旦出现问题会有很大的安全隐患,所以之后就引入了一个安全机制,操作系统会把超级块的内容放到硬盘的不同的多个区域中,如果其中一个出现问题,操作系统就会采用其他的超级块,除非所有超级块都损坏了,否则系统依然可以正常运行。等系统运行正常之后,系统会把正确的超级块内容替换掉错误的那个超级块。现在大部分Linux系统都已经采用了这个机制。

  数据块中包括一是保存了文件系统的大小以及所用块的大小;二是保存了可用数据库的数量和部分可以及时分配的空闲数据块列表;三是最近一次的更新时间与文件系统的 状态;四是空闲Inode结点的个数和部分可以及时使用的inode结点列表。

  

当我们创建一个新的文件的时候分为以下几步:

 第一步:内核首先找到一个空闲的inode结点,然后内核把文件的一些信息写入进去。

 第二步:存储数据,看文件需要分配几个内存块,看上图假如我们分配三个数据块,然后内存找到三个空闲的数据区,这里不一定是连续的,上边找的是300,500,800三个,然后首先把缓冲区中的数据复制到第一块数据区,然后复制到500中....

 第三步:内核记录文件存储的情况。内核在inode上边记录数据在磁盘的分布情况。

第四步:添加文件名到目录,假如我们文件名字叫做test,内核会把文件的inode结点这里就是263466和我们的文件名字test添加到我们的目录文件。

当我们的文件系统进行读文件的时候,会先从我们的directory里边找到和我们文件名字对应的inode节点号,然后再根据inode节点去查看信息找到对应的数据区,然后去数据区里边读取我们的文件内容。

这里还有一个内容就是我们的directory他不是我们通常说的目录,而是一个列表,记录了一个文件/目录名称对应的Inode number。

由于inode号码与文件名分离,这种机制导致了一些Linux系统特有的现象。

1. 有时文件名包含特殊字符,无法正常删除。这时,直接删除inode节点,就能起到删除文件的作用。

2. 移动文件或重命名文件,只是改变文件名,不影响inode号码。

3. 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名。

第3点使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。因为系统通过inode号码,识别运行中的文件,不通过文件名。更新的时候,新版文件以同样的文件名,生成一个新的inode,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的inode则被回收。

 

猜你喜欢

转载自blog.csdn.net/Hanani_Jia/article/details/82776984