Linux 软链接和硬链接

Linux 软链接和硬链接

在Linux 系统中,链接是一种文件共享的方式,它分为软链接和硬链接,对应的命令是ln

什么是软连接

软链接又叫符号链接, 它类似于 windows系统中的快捷方式,常用于将目录层次较深的文件链接到比较容易访问的目录中

创建软链接

使用 ln -s 源文件 软链接 命令就可以创建一个软链接,软链接可以对文件、目录、跨文件系统的文件或目录

  • 创建文件的软链接
[root@ecs-centos-7 tt]# stat a.txt | grep Links
Device: fd01h/64769d    Inode: 131096      Links: 1

[root@ecs-centos-7 tt]# ln -s a.txt sa.txt
[root@ecs-centos-7 tt]# ls -il
total 4
131096 -rw-r--r-- 1 root root 15 Aug 25 20:19 a.txt
131100 lrwxrwxrwx 1 root root  5 Aug 25 20:22 sa.txt -> a.txt

[root@ecs-centos-7 tt]# stat a.txt | grep Links
Device: fd01h/64769d    Inode: 131096      Links: 1

上面的例子中,创建了 a.txt 的软链接 sa.txt ,创建成功之后,软链接文件名后面会有一个 -> 符号指向原始文件

创建软链接前后的 stat a.txt | grep Links 命令是查看原始文件 a.txt 的链接数量,从例子中可以看出,创建软链接之后,文件链接数保持不变

  • 创建目录的软链接
[root@ecs-centos-7 tt]# mkdir tmp
[root@ecs-centos-7 tt]# ln -s tmp/ stmp
[root@ecs-centos-7 tt]# ll
total 4
lrwxrwxrwx 1 root root    4 Aug 26 00:38 stmp -> tmp/
drwxr-xr-x 2 root root 4096 Aug 26 00:38 tmp
[root@ecs-centos-7 tt]# echo "1234" > stmp/a.txt
[root@ecs-centos-7 tt]# cat tmp/a.txt 
1234
  • 创建跨文件系统的软连接

首先查看所有的文件系统,结果如下:

[root@ecs-centos-7 tt]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        909M     0  909M   0% /dev
tmpfs           919M     0  919M   0% /dev/shm
tmpfs           919M  8.7M  911M   1% /run
tmpfs           919M     0  919M   0% /sys/fs/cgroup
/dev/vda1        40G   20G   18G  53% /
tmpfs           184M     0  184M   0% /run/user/0

从上面的例子可以看到,目前有 devtmpfs, tmpfs, /dev/vda1 三种文件系统,我们选取 tmpfs/dev/vda1来测试跨文件系统的软链接,具体测试如下:

[root@ecs-centos-7 tt]# touch /run/test.txt
[root@ecs-centos-7 tt]# cat /run/test.txt 
[root@ecs-centos-7 tt]# ln -s /run/test.txt /st.txt
[root@ecs-centos-7 tt]# echo "haha" > /st.txt 
[root@ecs-centos-7 tt]# cat /run/test.txt 
haha

上面的测试中,首先在 tmpfs 文件系统的/run目录中创建 test.txt 文件,此时文件是没有内容的

然后,在/dev/vda1文件系统的/ 目录创建 /run/test.txt 的软链接 st.txt, 同时往 st.txt 中写入字符串 haha

最后,查看原始文件 /run/test.txt, 内容和软链接文件是相同的

修改、删除软链接

软链接也是文件的一种,只要有权限,自然是可以修改的

  • 修改软链接

软链接是原始文件的快捷方式,所以修改软链接文件实际上修改的是原始文件,具体的请看以下实例

[root@ecs-centos-7 tt]# cat sa.txt 
this is a file
[root@ecs-centos-7 tt]# cat a.txt 
this is a file
[root@ecs-centos-7 tt]# echo "111" >> sa.txt 
[root@ecs-centos-7 tt]# cat sa.txt 
this is a file
111
[root@ecs-centos-7 tt]# cat a.txt 
this is a file
111

例子中,对软链接 sa.txt 进行了修改,原始文件 a.txt 的内容也跟着同步改变了

  • 删除原始文件

Linux 软链接和硬链接

软链接文件是原始文件的快捷方式,上面的例子中可以看到,删除原始文件之后,软链接文件后面的箭头指向的原始文件 a.txt 在不停机的闪动,表示链接指向的原始文件已经失效了

通过cat sa.txt 命令查看链接内容时会提示文件不存在

什么是硬链接

硬链接可以看成文件的别名, 它和原始文件拥有相同的索引节点(关于索引节点的知识请查看 理解Linux中inodes)

删除任何一处的文件,都不影响另一处文件的正常访问,只有删除最后一个文件之后,文件内容的数据块才会被删除

熟悉 c/c++ 指针的朋友可以把硬链接看成指向同一块内存的多个指针变量,文件内容存储在指针变量指向的内存块中

指针变量超出其作用域时会被系统回收,此时不会回收它所指向的内存的,当所有的指针变量都被回收时,才会回收它们所指向的内存(这里假设应用程序能正确的处理堆内存的回收)

创建、修改、删除硬链接

  • 创建硬链接

创建硬链接命令: ln 源文件 硬链接

[root@ecs-centos-7 tt]# stat b.txt | grep Links
Device: fd01h/64769d    Inode: 131096      Links: 1

root@ecs-centos-7 tt]# ln b.txt hb.txt
[root@ecs-centos-7 tt]# ls -li
total 8
131096 -rw-r--r-- 2 root root 17 Aug 25 23:40 b.txt
131096 -rw-r--r-- 2 root root 17 Aug 25 23:40 hb.txt

[root@ecs-centos-7 tt]# stat b.txt | grep Links
Device: fd01h/64769d    Inode: 131096      Links: 2

上面的例子中,创建了 b.txt 的硬链接 hb.txt

创硬链接前后的 stat b.txt | grep Links 命令是查看 b.txt 的链接数量,从例子中可以看出,创建硬链接后文件链接数增加了

  • 修改硬链接,删除原始文件

Linux 软链接和硬链接

从以上例子中可以看出,修改硬链接文件内容,原始文件也会同步修改,而删除原始文件时,硬链接文件内容没有任何变化

硬链接注意事项

  • 无法跨文件系统创建硬链接
[root@ecs-centos-7 /]# ln /run/test.txt /htest.txt
ln: failed to create hard link ‘/htest.txt’ => ‘/run/test.txt’: Invalid cross-device link
  • 不允许创建目录的硬链接
[root@ecs-centos-7 tt]# ln tmp/ htmp
ln: ‘tmp/’: hard link not allowed for directory

总结

以上分别介绍了软链接和硬链接,下面以图表的形式总结下两者的异同

链接 索引节点号 权限 大小 创建目录链接 跨文件系统 原始文件的链接计数
软链接 新的索引节点 有自己的文件属性和权限 和原始文件不同 不会增加
硬链接 和原始文件相同 和原始文件相同 和原始文件相同 不能 不能 会增加
推荐阅读

理解Linux中inodes

Linux 软链接和硬链接

上一篇:Linux的亿些基础的操作命令


下一篇:Linux主机内存评估手册-从零到无