Linux中软链接和硬链接的区别

Linux中软链接和硬链接的区别

  • ln 命令用于创建软链接或硬链接
  • 软链接
    软链接又称符号链接,是一类特殊的文件,这个文件包含了另一个文件或目录的路径名(绝对路径或相对路径)。在对符号文件进程读或写操作时,系统会自动把该操作转换为对源文件或目录的操作,但输出链接文件时,系统仅仅删除链接文件,而不会删除源文件或目录本身。软链接可以链接不同文件系统的文件。
  • 硬链接
    硬链接可以理解为一个文件的一个或多个文件名。它引用的是文件在文件系统中的物理索引(也称inode)。当你移动或删除原始文件时,硬链接不会被破坏,因为它所引用的是文件的物理数据而不是文件在文件结构中的位置。硬链接的文件不需要用户有访问原始文件权限,也不会显示原始文件的位置,这样有助于文件的安全。如果你删除的源文件有相应的硬链接,那么这个文件依然会被保留,直到所有对它的引用都被删除,即硬链接数为0时,该文件才会被彻底删除。硬链接只能链接同一个文件系统中的文件。

创建一个软链接

  • 创建源文件
[root@test ~]# mkdir /tmp/shell/test/ -p
[root@test ~]# mkdir /tmp/shell/link/ -p
[root@test ~]# touch /tmp/shell/test/test
  • 创建软链接( ln -s 源文件 指定链接文件)
[root@test ~]# ln -s /tmp/shell/test/test /tmp/shell/link/link
  • 查看软链接
[root@test ~]# ll /tmp/shell/link/
total 0
lrwxrwxrwx. 1 root root 20 May 14 05:39 link -> /tmp/shell/test/test
  • 查看源文件与软链接文件编号(inode)
#可以看到编号不一致
[root@test ~]# ls -i /tmp/shell/link/link 
50381523 /tmp/shell/link/link
[root@test ~]# ls -i /tmp/shell/test/test 
42013236 /tmp/shell/test/test
  • 删除软链接(源文件依然存在)
[root@test ~]# rm -fr /tmp/shell/link/link 
[root@test ~]# ll /tmp/shell/test/test 
-rw-r--r--. 1 root root 0 May 14 05:33 /tmp/shell/test/test

创建一个硬链接

  • 创建源文件
[root@test ~]# mkdir /tmp/shell/test2/ -p
[root@test ~]# touch /tmp/shell/test2/test2
[root@test ~]# mkdir /tmp/shell/link2/
  • 创建硬链接( ln 源文件 指定链接文件)
[root@test ~]# ln /tmp/shell/test2/test2 /tmp/shell/link2/link2
  • 查看硬链接(不会显示原始文件的位置,有助于文件安全)
[root@test ~]# ll /tmp/shell/link2/link2 
-rw-r--r--. 2 root root 0 May 14 05:53 /tmp/shell/link2/link2
  • 查看源文件与软链接文件编号(inode)
#可以看到编号一致
[root@test ~]# ls -i /tmp/shell/test2/test2 
2535047 /tmp/shell/test2/test2
[root@test ~]# ls -i /tmp/shell/link2/link2 
2535047 /tmp/shell/link2/link2
  • 删除硬链接(源文件依然存在)
[root@test ~]# rm -fr /tmp/shell/link2/link2 
[root@test ~]# ll /tmp/shell/test2/test2 
-rw-r--r--. 1 root root 6 May 14 06:18 /tmp/shell/test2/test2

注意:Linux 不允许给目录创建硬链接

[root@test ~]# ln /tmp/shell/test2/ /tmp/shell/link2
ln: ‘/tmp/shell/test2/’: hard link not allowed for directory

对比删除源文件后

  • 删除软链接的源文件
[root@test ~]# echo hello > /tmp/shell/test/test
[root@test ~]# ln -s /tmp/shell/test/test /tmp/shell/link/link
[root@test ~]# cat /tmp/shell/link/link
hello
[root@test ~]# rm -fr /tmp/shell/test/test 

#再建内容不同的“源文件“
[root@test ~]# touch  /tmp/shell/test/test
[root@test ~]# echo hello world > /tmp/shell/test/test 
[root@test ~]# cat /tmp/shell/link/link   ##软链接文件数据已同步
hello world

总结:软链接删除源文件后,链接文件无法使用

  • 删除硬链接的源文件
[root@test ~]# echo hello > /tmp/shell/test2/test2 
[root@test ~]# ln /tmp/shell/test2/test2  /tmp/shell/link2/link2
[root@test ~]# cat /tmp/shell/link2/link2 
hello
[root@test ~]# rm -fr /tmp/shell/test2/test2 

#再建内容不同的“源文件“
[root@test ~]# touch /tmp/shell/test2/test2
[root@test ~]# echo hello world > /tmp/shell/test2/test2 
[root@test ~]# cat /tmp/shell/link2/link2   ##硬链接文件数据不同步(保留硬链接指定的上个源文件内容)
hello
[root@test ~]# ln /tmp/shell/test2/test2  /tmp/shell/link2/link2 
ln: failed to create hard link ‘/tmp/shell/link2/link2’: File exists
[root@test ~]# ln -f /tmp/shell/test2/test2  /tmp/shell/link2/link2   ##参数 -f 可以强制更新硬链接文件(覆盖硬链接文件全部内容)
[root@test ~]# cat /tmp/shell/link2/link2    ##硬链接文件数据已同步
hello world 

总结:硬链接删除源文件后,链接文件仍然可以正常使用

猜你喜欢

转载自blog.csdn.net/sunny_future/article/details/80313417