在*nix
文件系统上,每个文件的存储实际可以看成包含两部分:inode
和实际存储文件内容的数据块。其中inode
存储文件的metadata
,包含创建时间,访问权限,等等,当然还有指向文件具体数据块的指针。正是通过这个指针,将indoe
和数据块关联起来。
要注意,inode
中并不保存文件的名字。关于文件名字和inode
的映射存储在目录文件中。因此,当访问一个文件时,其实是通过这个文件所在的目录文件访问到这个文件的inode
信息,继而进行文件操作的。
接下来,看一下hard link
,symbol link
和inode
之间的关系。首先创建一个文件和指向这个文件的hard link
和symbol link
:
# echo 'Hello, World!' > myfile.txt
# ln myfile.txt my-hard-link
# ln -s myfile.txt my-soft-link
查看这3
个文件的inode
信息:
# ls -ailt my*
325332 lrwxr-xr-x 1 root wheel 10 Oct 24 05:26 my-soft-link -> myfile.txt
325331 -rw-r--r-- 2 root wheel 14 Oct 24 05:25 my-hard-link
325331 -rw-r--r-- 2 root wheel 14 Oct 24 05:25 myfile.txt
可以看到myfile.txt
和my-hard-link
其实对应的是同一个inode
节点:325331
,而my-soft-link
对应的是另一个inode
节点:325332
。接下来删除myfile.txt
,然后分别读取my-hard-link
和my-soft-link
文件内容:
# rm myfile.txt
# ls -ailt my*
325332 lrwxr-xr-x 1 root wheel 10 Oct 24 05:26 my-soft-link -> myfile.txt
325331 -rw-r--r-- 1 root wheel 14 Oct 24 05:25 my-hard-link
# cat my-hard-link
Hello, World!
# cat my-soft-link
cat: my-soft-link: No such file or directory
可以看到,因为my-hard-link
和myfile.txt
对应相同的inode
节点:325331
,因此删除myfile.txt
后,仍然可以通过my-hard-link
读取325331
这个inode
节点所对应的文件内容。而my-soft-link
仅仅是指向myfile.txt
这个文件名字,因此一旦myfile.txt
被删除,也就无法读取文件内容了。
参考资料:
Inodes – an Introduction;
What is the difference between a symbolic link and a hard link?。