Loading

Linux中“软链接(符号链接)”和“硬链接”的区别

总结

硬链接: 与普通文件没什么不同,inode 都指向同一个文件在硬盘中的区块。一个硬链接仅仅是一个文件名,多个文件名指向同一索引节点(Inode)。(一个文件可以有好几个文件名,只有将最后一个文件名删除,才能把这个文件从磁盘上删掉)。

软链接: 它是一个包含了路径信息的小小的指定文件,保存了其代表的文件的绝对路径,在硬盘上有独立的区块,访问时替换自身路径。

 

补充:

硬链接是指通过索引节点来进行链接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都会给它分配一个编号,这个编号被称为索引节点编号(Inode Index)或者Inode,它是文件或者目录在一个文件系统中的唯一标识,文件的实际数据放置在数据区域(data block),它存储着文件重要参数信息,也就是元数据 (metadata),比如创建时间、修改时间、文件大小、属主、归属的用户组、读写权限、数据所在block号等,如下图所示。

在Linux系统中,多个文件名指向同一索引节点(Inode)是正常且允许的。一般这种链接就称为硬链接。硬链接的作用之一是允许一个文件拥有多个有效路径名,这样用户就可以建立硬链接到重要的文件,以防止“误删”源数据(很多硬件,如netapp存储中的快照功能就应用了这个原理,增加一个快照就多了一个硬链接)。不过硬链接只能在同一文件系统中的文件之间进行链接,不能对目录进行创建。之所以文件建立了硬链接就会防止数据误删,是因为文件系统的原理是,只要文件的索引节点还有一个以上的链接(仅删除了该文件的指向),只删除其中一个链接并不影响索引节点本身和其他的链接(数据的实体并未删除),只有当最后一个链接被删除后,此时如果有新数据要存储到磁盘上,被删除的文件的数据块及目录的链接才会被释放,空间被新数据暂用覆盖。

 

验证

为了解释清楚,我们首先在自己的一个工作目录下创建一个文件,然后对这个文件进行链接的创建:

$ touch myfile && echo "This is a plain text file." > myfile
$ cat myfile
This is a plain text file.

现在我们创建了一个普通地不能再普通的文件了。然后我们对它创建一个硬链接,并查看一下当前目录:

$ ln myfile hard
$ ls -li
3038268 -rw-rw-r--. 2 zf zf 27 Dec 30 12:01 hard
3038268 -rw-rw-r--. 2 zf zf 27 Dec 30 12:01 myfile

在 ls 结果的最左边一列,是文件的 inode 值,你可以简单把它想成 C 语言中的指针。它指向了物理硬盘的一个区块,事实上文件系统会维护一个引用计数,只要有文件指向这个区块,它就不会从硬盘上消失。

你也看到了,这两个文件就如同一个文件一样,inode 值相同,都指向同一个区块。

然后我们修改一下刚才创建的 hard 链接文件:

$ echo "New line" >> hard
$ cat myfile
This is a plain text file.
New line

可以看到,这两个文件果真就是一个文件。 下面我们看看软链接(也就是符号链接)和它有什么区别。

$ ln -s myfile soft
$ ls -li
  3038268 -rw-rw-r--. 2 zf zf 27 Dec 30 12:01 hard
  3038268 -rw-rw-r--. 2 zf zf 27 Dec 30 12:01 myfile
205429204 lrwxrwxrwx. 1 zf zf 6 Dec 30 12:04 soft -> myfile

诶,你会发现,这个软链接的 inode 竟然不一样啊,并且它的文件属性上也有一个 l 的 flag,这就说明它与之前我们创建的两个文件根本不是一个类型。

下面我们试着删除 myfile 文件,然后分别输出软硬链接的文件内容:

$ rm myfile
$ cat hard
This is a plain text file.
New line
$ cat soft
cat: soft: No such file or directory

之前的硬链接没有丝毫地影响,因为它 inode 所指向的区块由于有一个硬链接在指向它,所以这个区块仍然有效,并且可以访问到。 然而软链接的 inode 所指向的内容实际上是保存了一个绝对路径,当用户访问这个文件时,系统会自动将其替换成其所指的文件路径,然而这个文件已经被删除了,所以自然就会显示无法找到该文件了。

为验证这一猜想,我们再向这个软链接写点东西:

$ echo "Something" >> soft
$ ls -li
total 8
  3038268 -rw-rw-r--. 1 zf zf 27 Dec 30 12:01 hard
205429205 -rw-rw-r--. 1 zf zf 10 Dec 30 12:05 myfile
205429204 lrwxrwxrwx. 1 zf zf 6 Dec 30 12:04 soft -> myfile
$ cat soft 
Something
$ cat myfile 
Something

可以看到,刚才删除的 myfile 文件竟然又出现了!这就说明,当我们写入访问软链接时,系统自动将其路径替换为其所代表的绝对路径,并直接访问那个路径了。

 

参考文章:

https://www.linuxprobe.com/soft-and-hard-links.html

http://linux.51yip.com/search/ln

posted @ 2020-12-27 17:36  拾月凄辰  阅读(773)  评论(1编辑  收藏  举报