Linux 硬链接与软链接

  • 硬链接介绍

一般情况下,文件名和inode编号是一一对应的关系,每个inode号码对应一个文件名。但UNIX/Linux系统多个文件名也可以指向同一个inode号码。这意味着可以用不同的文件名访问同样的内容,对文件内容进行修改,会影响到所有文件名。但删除一个文件名,不影响另一个文件名的访问。这种情况就被称为硬链接(hard link)。

创建硬链接的命令为:ln jf1.txt jf2.txt,其中jf1.txt为源文件,jf2.txt为目标文件。如上命令源文件与目标文件的inode号码相同,都指向同一个inode。inode信息中有一项叫做”链接数”,记录指向该inode的文件名总数,这时会增加1,变成2,如图7-3所示:

图7-3 jf1.txt jf2.txt硬链接inode值变化

同样删除一个jf2.txt文件,就会使得jf1.txt inode节点中的”链接数”减1。如果该inode值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号码,以及其所对应block区域,如图7-4所示:

图7-4 删除jf2.txt硬链接inode值变化

实用小技巧:硬链接不能跨分区链接,硬链接只能对文件生效,对目录无效,也即是目录不能创建硬链接。硬链接源文件与目标文件共用一个inode值,从某种意义上来,节省inode空间。不管是单独删除源文件还是删除目标文件,文件内容始终存在。同时链接后的文件不占用系统多余的空间。

  • 软链接介绍

除了硬链接以外,还有一种链接-软链接。文件jf1.txt和文件jf2.txt的inode号码虽然不一样,但是文件jf2.txt的内容是文件jf1.txt的路径。读取文件jf2.txt时,系统会自动将访问者导向文件jf1.txt。

无论打开哪一个文件,最终读取的都是文件jf1.txt。这时,文件jf2.txt就称为文件jf1.txt的”软链接”(soft link)或者”符号链接(symbolic link)。

文件jf2.txt依赖于文件jf1.txt而存在,如果删除了文件jf1.txt,打开文件jf2.txt就会报错:”No such file or directory”。

软链接与硬链接最大的不同是文件jf2.txt指向文件jf1.txt的文件名,而不是文件jf1.txt的inode号码,因此文件jf1.txt的inode链接数不会发生变化,如图7-5所示:

图7-5 删除jf1.txt源文件链接数不变

实用小技巧:软链接可以跨分区链接,软链接支持目录同时也支持文件的链接。软链接源文件与目标文件Inode不相同,从某种意义上来,会消耗省inode空间。不管是删除源文件还是重启系统,该软链接还存在,但是文件内容会丢失,一旦新建源同名文件名,软链接文件恢复正常。