硬链接是“硬”的,因为它直接指向了inode。
软链接是“软”的,因为它是通过其他文件才指向了inode(就像是双节棍或多节棍,比较灵活,所以是软的)。
软硬链接均可以理解成“无需copy文件,创建一个文件的别名”。示意图如下:
硬链接一旦创建后就无法区分哪个是“源文件”,也就是说指向同一个inode的所有硬链接都是等价的。对应到上图中,“硬链接A1”和“硬链接A2”是等价的,没有主次之分。
使用ln
命令创建:
ln [-s] old_path new_path
不带-s表示创建硬链接,带上-s表示创建软链接。这里的s其实是symbolic(符号)的意思,不过记成soft也没啥影响。
有时可能容易混淆old_path
和new_path
的顺序,可以通过下面这句话帮助记忆:
软硬链接不能“无中生有”,所以要先指定现有文件,再指定需要新建的链接。
链接类型 | 能否对目录创建该链接 | 能否跨文件系统创建该链接 |
---|---|---|
硬链接 | 不能 | 不能 |
软链接 | 能 | 能 |
注:Linux的文档明确说明不能跨挂载点创建硬链接(
new_path
和old_path
必须在同一个挂载点上),即比“不能跨文件系统创建”的限制更加严格。
在Mac上实际测试,可以跨挂载点创建硬链接(两个挂载点文件系统相同)。
因为硬链接有上述两条限制,所以一般用软链接实现快捷方式。
例如系统的libc.so.6通常只是一个软链接,链接到实际使用的libc.so.6的具体版本(一般位于同目录下)。这样不仅能方便地看出当前使用的libc.so.6的实际版本,还大大简化了libc.so.6的升级工作。
只有当指向一个文件的所有硬链接都被删除后,系统才会真正删除文件。所以通过创建硬链接可以避免文件被错误删除(不能防止文件被修改!)。
硬链接是link
,软链接是symlink
(即符号链接)。
硬链接:
具有相同inode的所有硬链接始终具有相同的权限和归属,即改变其中一个硬链接的权限和归属,其他硬链接的权限和归属也会变化。
软链接:
文档说“软链接的权限是无关紧要的”,在Linux系统上实际测试,chmod命令操作的是软链接对应的目标文件(chmod的文档也有说明),软链接始终具有读、写、执行的所有权限。
因为软链接始终具有读、写、执行的所有权限,所以基本不需要关心其归属问题。
总结:软链接的权限和归属问题基本可以忽略,只需要关心其目标文件的权限和归属即可。
没有影响,还是能正常工作。测试命令如下:
echo "abc" > test.txt
ln -s test.txt test_1
ln -s test_1 test_2
ln -s test_2 test_3
cat test_3
输出为"abc"
会链接到新创建的文件。
能够创建循环软链接(即系统没有检测),但是读取文件时会报错。测试命令如下:
touch abc1
ln -s abc1 abc2
rm abc1
-s abc2 abc1
cat abc1
输出是
cat: abc1: Too many levels of symbolic links
https://mp.weixin.qq.com/s/Cu55Sck9FSXLHE0oEVuKQg