unix文件系统:链接与文件
说明:以下是在读小骆驼书《Perl 语言入门》第十二章 目录操作 中“链接与文件”一节(P189-193)中的读书笔记。
目录是一种由系统管理的特殊文件,它基本上是一份列表。
每份文件都会存储在一个编好号的inode里,我们可以把它想象成磁盘上的门牌号码。
ls -l命令,硬链接的数量会显示在权限标记的右边。
每个目录都会有 . 这个项目,它会指回目录本身的inode。所以任何目录的链接数都至少是2.一般来说,目录的链接数等于子目录的数量加上2.
链接分硬链接和软链接(又叫符号链接)。
【硬链接】
硬链接的本质是:不同的文件名指向同样的inode,文件事实上只有一份。
建立硬链接:
shell命令:ln file1 file2
perl命令:link file1 file2
此时,file1和file2指向同一个inode(假定inode为12345),文件事实上只有1份,修改file1的时候同时会修改file2(因为只有一个文件)。但是要注意用文本编辑器进行修改的时候,可能会导致变成两份文件,视文本编辑器的原理而定。
当删除file1的时候,inode 12345的链接数减一,file2并不会删除。只删除file2的时候,也是一样原理。
当该inode的链接数等于0的时候,数据就丢失了。
因为硬链接的性质,所以在某种程度上可以防止数据的流失(只要inode的链接数大于0,数据就还在)。
perl的rename函数可以将文件搬移到别的目录里,但是来源和目的地必须在同一个文件系统上(同一个磁盘上),因为rename的原理是基于文件的 inode 列表。如果跨磁盘搬移文件,那inode里的数据就必须重新部署。
目录不能建立硬链接(从文件系统基于inode的原理很容易理解为什么。如果可以的话,文件系统那就乱套了,而且整个系统的性能不知道要低成什么样了)
【软链接】
软链接又叫符号链接。它是目录里的一种特殊项目,用来告诉系统到别的方向找找看。
建立软链接:
shell命令:ln -s fileA fileB
perl命令:symlink "fileA" "fileB"
假定fileA的inode为34567,inode的链接数为1.那么在建立软链接之后,inode的链接数仍然为1,保持不变。
符号链接只是告诉系统:如果你是来找fileB的,请到fileA那边去。仅此而已。
如果删除fileA,那么该inode的链接数就减到0,则文件内容永久丢失了。
目录可以建立软链接。
perl里面使用readlink可以取得软链接所指向的位置。
硬链接和软链接都非常有用。但unix之外的很多系统对此两者都不支持。
这两种链接都可以用unlink移除,unlink只是从目录里移除该文件名的链接项目,将它的链接数递减,如有需要再释放inode。这也是为什么perl和php中的文件删除函数取名为 unlink 的原因。