Unix系统中的inode

每一个文件的诞生, 都需要向系统注册, 以宣告自己的到来; 而这些注册信息, 则存储在inode中.

inode

每个文件的创建都对应着一个 inode(索引节点)的生成, 它记录着该文件的元信息:

  • 文件的字节数

  • 文件的拥有者信息、读写权限

  • 文件的时间戳, 分别是: ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。

  • 链接数, 即有多少文件名指向这个inode

  • 文件数据block的位置

每个inode都有一个号码, 操作系统用inode号码来识别不同文件. 当我们打开一个文件时, 系统会找到该文件的 inode 号码; 通过 inode 号码获取inode信息; 最后通过inode信息获取文件数据所在的block.

目录文件

Unix/Linux 系统中, 目录 (directory) 也是一种文件. 打开目录, 实际上就是打开目录文件.

目录文件是一系列目录项的列表. 每个目录项, 由两部分组成: 所包含文件的文件名, 以及该文件名的inode号码.

因此, 目录文件的读和写权限, 都是针对目录文件本身. 如果只有读权限, 只能获取文件名, 无法获取其它信息, 因为其它信息都存储在inode节点中, 而读取inode节点内的信息需要目录文件的执行权限.

硬链接

每个 inode 可以对应多个文件名. 当创建硬链接时, 相当于增加了一个指向该inode节点的链接数. 反过来, 当删除一个文件时, 则指向该文件的链接数减 1, 当链接数减少到0时, 表示没有文件指向这个inode, 系统就会回收这个inode号码, 以及其所对应block区域.

创建目录时,默认会生成两个目录项:"."和".."。前者的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的文件名,而不是文件B的inode号码,文件B的inode"链接数"不会因此发生变化。

ln -s命令可以创建软链接。


参考: Unix系统中的inode

updatedupdated2023-06-052023-06-05
Update https-ca.md