#对Linux中inode的感悟

时间:2022-05-02 05:14:22

一、什么是inode?

什么是inode?这要讲一点文件的存储方面的知识了!计算机专业的差不多都学过《操作系统》这门课,这门课就讲了操作系统是怎样进行文件的保存、删除、移动、读取等。文件是要保存在硬盘上的,硬盘是以扇区为存储单位保存数据的,但是扇区又太小了,操作系统为了更有效率的进行文件的读取便采用了"块"的形式——连续对多个扇区进行读取。

操作系统为了更有效率的实现对文件的管理,就对这些"块"中所存储的文件元数据进行了单独的存储。对于这些单独存储文件元数据的区域,就称之为inode,中文称之为"索引节点"。

文件系统在被创建时,也同时创建了大量的inode,这些inode会组成一个inode表,以供操作系统查找。inode 表包含一份清单,其中列出了对应文件系统的所有 inode 编号。当用户搜索或者访问一个文件时,操作系统通过 inode 表查找正确的 inode 编号。在找到 inode 编号之后,根据inode中的信息访问文件。

二、 inode内容

\* 文件的字节数(文件大小)

\* 文件拥有者的UID

\* 文件的GID

\* 文件的读、写、执行权限

\* 文件的访问时间、修改时间、改变时间等时间戳

\* 链接数,有多少个硬链接(就是有多少个文件名指向这个inode)

\* 文件数据block的位置

文件的inode信息可通过该命令查看:stat 文件名

如图:
#对Linux中inode的感悟

至于inode信息中为什么不记录文件名,我个人的理解(因为学的时候老师没有讲,我也没有问,网上也没有搜着)是:Linux系统是通过inode来访问文件的,不是通过文件名访问文件的,通过创建硬链接可以有多个文件名指向同一个inode,不对文件名进行记录也可以节省一定的磁盘空间。

三、inode大小

inode既然要存储文件的元数据,就一定也会占用磁盘空间的。文件系统在被创建时,磁盘空间会被分成两部分,一部分是数据区,就是用来存放数据内容的区域;另一部分就是inode区域,就是用来存放文件元数据的区域。

每个inode节点的大小一般是128字节或256字节。inode节点总数由系统设定,也可以自己根据实际情况进行设定。

可以使用 df –i 命令来查看每个硬盘分区的inode总数和已经使用的数量。

如图:
#对Linux中inode的感悟

由于这种文件系统的特殊性,有可能会出现,磁盘空间还有足够的剩余,但却无法存储新文件的情况,这种状况可能是由于inode号用尽造成的。

四、inode号码

每一个文件在被创建时都会由系统分配一个inode号,操作系统是通过这些inode号来识别文件的。文件名可能是为了方便我们人来识别文件的,但是其对于操作系统来说只是一串字符串,是为了方便inode识别的别称或者绰号。

我们在访问一个文件时,表面上是通过文件名来进行访问的,实质上在操作系统执行时,首先操作系统通过文件名找到与之匹配的inode号;然后通过inode号,获取相关的inode的信息;最后根据inode信息访问相关的数据块,完成对数据的访问。

我们可以通过在命令行中输入 ls –i 文件名 的方式查看该文件所对应的inode号:

如图:
#对Linux中inode的感悟

五、目录文件

在Linux系统中,一切皆是文件。所以目录也是一种文件,打开目录其实就是在打开一个目录文件。

这个目录文件其实就是一系列的目录项列表,这个目录项包含两部分标的信息,一部分是目录名,另一部分是目录名所对应的inode号。

如图:
#对Linux中inode的感悟

在命令行中我们可以通过 ls –id 目录名 的方式查看指定目录的inode号:

如图:
#对Linux中inode的感悟

六、硬链接

通常情况下,文件名和inode号是一一对应的,但是Linux系统是允许多个文件名指向一个inode号的。

需要注意一点的是虽然有多个文件名指向了同一个inode号,但inode号没有变,所以系统并没有为其他这几个文件名重新创建新的物理文件,使用的都还是原先的那份物理文件。

这种多个文件名指向同一个inode的方式,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。这种情况就被称为"硬链接"(hard link)。

可以使用 ln 源文件名 目标文件名 的方式创建硬链接

如图:
#对Linux中inode的感悟

关于硬链接应注意的地方:

    创建硬连接会增加额外记录项以引用文件
对应于同一文件系统上的一个物理文件
每一个目录引用相同的inode号
创建时硬连接数是递增的
删除文件时:
使用rm命令删除文件时,硬连接数会递减
文件要存在至少要有一个链接数,当链接数为零时,文件就要被删除
不能跨越驱动器或者分区,即硬链接只能在同一分区内创建

创建目录时,默认会生成两个目录项:"."和".."。前者的inode号码就是当前目录的inode号码,等同于当前目录的"硬链接";后者的inode号码就是当前目录的父目录的inode号码,等同于父目录的"硬链接"。所以,任何一个目录的"硬链接"总数,总是等于2加上它的子目录总数(含隐藏目录)。

七、软链接

文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的"软链接"(soft link)或者"符号链接(symbolic link)。

这意味着,文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错:"No such file or directory"。软链接与硬链接最大的不同:文件A指向文件B的文件名(文件A保存的只是能找到文件B的路径),而不是文件B的inode号码,文件B的inode"链接数"不会因此发生变化。

可以使用" ln -s 源文文件或目录 目标文件或目录 "命令创建软链接

如图:
#对Linux中inode的感悟
#对Linux中inode的感悟
#对Linux中inode的感悟

关于软链接应注意的地方:

    ls –l 可以用来查看链接的名称和引用的文件
一个符号链接的内容是它引用文件的名称
可以跨分区
指向的是另一个文件的路径,文件大小以保存的路径长度而定
不增加或减少目标文件inode的引用计数

八、特殊作用

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

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

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

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

九、此篇博文是本人根据所学知识及实际操作感悟,同时又参考借鉴了他人文章写成的。
在此给出参考链接:http://www.ruanyifeng.com/blog/2011/12/inode.html