每一个文件的诞生, 都需要向系统注册, 以宣告自己的到来; 而这些注册信息, 则存储在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