【补坑】Linux中软连接与硬链接的区分 - Go语言中文社区

【补坑】Linux中软连接与硬链接的区分


在Linux中文件存储分为两个部分:

1. 数据块:保存文件中存储的数据

2. 索引节点( inode ):存储文件的大小、创建日期、读写权限等信息(文件元数据)

inode包括:

  • 文件数据block的位置
  • 文件的字节数
  • 文件拥有者的User ID
  • 文件的Group ID
  • 文件的读、写、执行权限
  • 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
  • 链接数,即有多少文件名指向这个inode

每一个inode有自己唯一的inode号,可以通过ls -i显示

文件名对inode号来说只是一个绰号,一个inode号可以有多个绰号或者说是别名。

硬连接:

1. 为test文件创建硬链接如下:

shell-test:/u/nanaal/shell$ cp -l test test1

shell-test:/u/nanaal/shell$ ln -l test test2

shell-test:/u/nanaal/shell$ ls -li

total 12

4298659818 -rw-rw-r--. 3 nanaal nanaal 6 Apr 19 06:24 test

4298659818 -rw-rw-r--. 3 nanaal nanaal 6 Apr 19 06:24 test1

4298659818 -rw-rw-r--. 3 nanaal nanaal 6 Apr 19 06:24 test2

       命令ls显示的第一列为文件索引,在文件系统每个文件都有一个唯一的索引值。从上面的信息可以知道,test、test1、test2共享一份文件,且链接计数为3(ls显示结果的第三列)。根据上面信息,硬链接可表示为:

 

Note:

硬链接的所有文件必须在一个硬盘上,如test在磁盘/dev/sda1上面,那么test1和test2也必须在/dev/sda1上面

硬链接相当于一个文件的别名

 

硬链接有如下特点:

  • 文件有相同的 inode 及 data block;
  • 不能对目录进行创建,只可对文件创建;
  • 不能交叉文件系统进行硬链接的创建;
  • 删除一个硬链接文件并不影响其他有相同 inode 号的文件

 

软连接:

2. 为test文件创建软链接如下:

shell-test:/u/nanaal/shell$ cp -s test test3

shell-test:/u/nanaal/shell$ ln -s test test4

shell-test:/u/nanaal/shell$ ls -li

total 12

4298659818 -rw-rw-r--. 3 nanaal nanaal 6 Apr 19 06:24 test

4298659818 -rw-rw-r--. 3 nanaal nanaal 6 Apr 19 06:24 test1

4298659818 -rw-rw-r--. 3 nanaal nanaal 6 Apr 19 06:24 test2

4298103063 lrwxrwxrwx. 1 nanaal nanaal 4 Apr 19 06:43 test3 -> test

4304030281 lrwxrwxrwx. 1 nanaal nanaal 4 Apr 19 06:43 test4 -> test

      从ls命令的输出结果可以看到, test3和test4的文件索引值均与test的索引值不同,即test3和test4均是新的文件,但是文件大小比test小,且链接计数为1. 软链接文件test3、test4只保存了源文件test的文件信息并没有对test文件指定的数据进行拷贝。根据上面信息,软链接可表示为如下:

 

Note:

软链接的所有文件可以保存在不同的磁盘上。如test在磁盘/dev/sda1上面,test3和test4可以保存在/dev/sda2上面。

软链接是一个普通的文件,拥有自己独立的inode号以及数据块,只不过软链接的数据块中存储的是源文件的路径

类似于windows中的快捷方式

 

软连接有如下特点:

  • 软链接有自己的文件属性及权限等;
  • 可对不存在的文件或目录创建软链接;
  • 软链接可交叉文件系统
  • 软链接可对文件或目录创建
  • 创建软链接时,链接计数不会增加;
  • 删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接,若被指向路径文件被重新创建,死链接可恢复为正常的软链接。

 

修改文件

1) 修改源文件test

2) 修改硬链接文件test1或test2

3) 修改软链接文件test3或test4

修改上面的文件,会发现所有的文件均跟着修改了,这个方面,软链接和硬链接没有区别。

 

删除文件:删除软硬连接,都不影响其他链接阅读。但删除源文件,会影响软连链接阅读,硬链接不影响

 

1) 删除硬链接文件

shell-test:/u/nanaal/shell$ rm -rf test1

shell-test:/u/nanaal/shell$ ls -li

total 8

4298659818 -rw-rw-r--. 2 nanaal nanaal 6 Apr 19 06:24 test

4298659818 -rw-rw-r--. 2 nanaal nanaal 6 Apr 19 06:24 test2

4298103063 lrwxrwxrwx. 1 nanaal nanaal 4 Apr 19 06:43 test3 -> test

4304030281 lrwxrwxrwx. 1 nanaal nanaal 4 Apr 19 06:43 test4 -> test

从ls的输出可以看到,删除文件test1后,test和test2的链接计数由3变成了2. 文件test和test2可以正常阅读。

 

2) 删除软链接文件

shell-test:/u/nanaal/shell$ ls -li

total 8

4298659818 -rw-rw-r--. 2 nanaal nanaal 6 Apr 19 06:24 test

4298659818 -rw-rw-r--. 2 nanaal nanaal 6 Apr 19 06:24 test2

4304030281 lrwxrwxrwx. 1 nanaal nanaal 4 Apr 19 06:43 test4 -> test

从ls的输出来看,删除文件test3,对其他文件没有任何影响。且文件test和test4可以正常阅读。

 

3) 删除源文件

shell-test:/u/nanaal/shell$ rm -rf test

shell-test:/u/nanaal/shell$ ls -li

total 4

4298659818 -rw-rw-r--. 1 nanaal nanaal 6 Apr 19 06:24 test2

4304030281 lrwxrwxrwx. 1 nanaal nanaal 4 Apr 19 06:43 test4 -> test

从ls的输出可以看出,删除文件test后,test2的链接计数由2变为1,可以阅读。

文件test4属性没有任何变化,但是已经不能阅读。

硬链接和软链接在这点的不同,可以表示如下:

 

硬链接文件删除操作:

软链接文件删除操作: 

 

 

总结:

  • 是否自身具备inode号?硬链接只是指向inode号的一个别称,自身不具有inode号和数据块,而软链接有自身的inode号和数据块
  • 硬链接只能对存在的文件创建,软链接可以对不存在的文件创建,可以之后再创建源文件
  • 硬链接不能交叉系统创建,而软链接可以
  • 硬链接不可对目录创建,软链接可以
  • 创建硬链接会增加文件的连接数,软链接不会
  • 删除软链接不会删除文件,删除硬链接时若剩余硬链接数大于0不会删除文件,若某文件的所有硬链接都被删除,该文件会被删除。

参考:https://segmentfault.com/a/1190000010029786

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/victorzzzz/article/details/82733205
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-07 23:23:31
  • 阅读 ( 1013 )
  • 分类:Linux

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢