答:inode(即index node,索引节点)是类Unix OS中保存文件系统中的对象元数据的数据结构。全文完,谢谢食用。

……开玩笑的,下面稍微深入地谈谈inode,以及与它相关的一些小知识。
所谓“文件系统中的对象”,是个非常广义的概念,毕竟Linux中几乎一切都是文件,包括普通文件、目录、设备、管道、Socket等等。inode就用来保存这些东西的元数据,不包括具体的数据,也不包含文件名。具体来讲,inode中主要存储以下这些元数据:
- inode编号
- 文件大小
- 占用的块数目与块大小
- 文件类型(普通文件、目录、管道,etc.)
- 存储该文件的设备号
- 链接数目
- 读、写、执行权限
- 拥有者的用户ID和组ID
- 文件的最近访问、数据最近修改时间
- inode最近修改时间
其中,inode编号相当于这个结构中的“主键”,也就是说操作系统用inode编号唯一标识一个文件。利用stat
命令可以查看元数据信息,如下图所示。通过ls -i
也可以仅查看一个或一批文件的inode编号。

inode存储的元数据也是要占用文件系统空间的,每个inode的大小一般是128B或者256B,这可以通过查询superblock信息的dumpe2fs
命令查到。

Linux在格式化硬盘分区(即初始化文件系统)时,就会将inode的区域(称为inode table)与文件数据的区域分开,一般每1KB或2KB数据分配一个inode编号。也就是说,每个分区的inode总数从格式化之后就固定了,因此有可能会出现存储空间没有占满,但因为小文件太多而耗尽了inode的情况。
利用df -i
命令可以查看inode数量方面的信息,如下图所示。

下面我们来看看Linux系统中最常见的几种文件操作是如何体现inode的。
复制
当复制一个文件时,会创建一个包含新inode的新文件。

移动
当移动一个文件时,仅仅是inode指向的位置发生变化,inode编号与实际数据存储的块的位置都不会变化。

硬链接(hard link)
Linux系统允许同一个inode号代表的文件有多个文件名,即可以用不同的文件名访问同一份数据,这叫做硬链接。对一个文件创建硬链接,其inode编号都相同,并且链接数会增加。

特别地,目录中默认包含的两个项.
和..
实际上就是对当前目录和父目录的硬链接,inode编号也对应。

但是Linux系统不允许用户对目录创建硬链接,因为Linux的目录结构是无环图,随意创建硬链接之后会产生环。
软链接(soft link)
软链接的本质也是一个文件,其存储的内容是对另一个文件的指针。所以对一个文件创建软链接,inode编号会不同,被指向文件的链接数不会增加。并且可以对目录与不存在的文件创建软链接。

删除
当删除文件时,会先检查inode中的链接数。如果链接数大于1,就只会删掉一个硬链接,不影响数据。如果链接数等于1,那么这个inode就会被释放掉,对应的块也会被标记为空闲的。

由上图可以看出,如果把上述profile_copy文件删掉,那么原先创建的两个hardlink文件就变为了两个不同的文件(其中一个文件会继承原来的inode编号),其链接数为1,并且仍然可以正常访问。相对地,softlink文件就变成了悬挂链接(dangling link),不能正常访问了。
利用inode还可以删除一些文件名中有转义字符或控制字符的文件,最典型的就是开头为减号-
的文件。这种无法直接用rm命令来搞,就可以先查出它们的inode编号再删除:
find ./ -inum 10086 -exec rm {} \:
全文完,谢谢食用。
网友评论