有些文件,看似两个,实则一个;有些链接,删了原文件它仍能活着。在Linux世界,有两个术语一直让人恍惚——软链接与硬链接。它们之间究竟有什么区别?别着急,这篇文章为您答疑解惑。
一、Linux的“文件”到底是什么?
在Windows里,文件像一个一个的小图标,点击就打开;但是在Linux里,文件的概念更“抽象”。在Linux文件系统中,一个“文件”实际上有两个部分:
文件名:目录项中出现的名字,本质是一个引用。
inode(索引节点):真正的文件内容和属性存在的地方。
通俗理解:文件名是门牌号,inode才是真正的房间。
二、硬链接:房间可以有多个门
硬链接其实很简单,就是给同一个inode添加多个门牌号。
举个生活例子:
你有一间办公室(文件内容),你在两个不同走廊(目录)上分别贴了门牌号(文件名):Room-A 和 Room-B,但这两个门指向的是同一个房间。不管你从哪边进,看到的东西都是一样的。
在终端里看:
$ echo "hello" > file1.txt $ ln file1.txt file2.txt
此时,file1.txt 和 file2.txt 是硬链接,它们指向相同的inode。
查看 inode 和链接数:
$ ls -li 123456 -rw-r--r-- 2 user user 6 Apr 7 10:00 file1.txt 123456 -rw-r--r-- 2 user user 6 Apr 7 10:00 file2.txt
可以看到,两者的 inode 编号相同,说明是硬链接。而 2 是链接计数,表示有两个名字指向这个 inode。
特点总结:
文件内容共享,一个变,两个变;
删除一个不影响另一个,只要还有链接,inode不会被释放;
不支持跨文件系统(分区);
不能对目录创建硬链接(为了防止文件系统结构混乱)。
三、软链接:门外贴个指路牌
软链接更像Windows的“快捷方式”。
生活例子:
你房间在3楼,但你在1楼贴了张纸条:“此房已搬迁至3楼305”。别人拿着这个地址(链接),需要额外“跳转”一层才能找到真实位置。
命令体验:
$ ln -s file1.txt file3.txt
这就是创建了一个指向 file1.txt 的软链接。
查看效果:
$ ls -l -rw-r--r-- 1 user user 6 Apr 7 10:00 file1.txt lrwxrwxrwx 1 user user 9 Apr 7 10:01 file3.txt -> file1.txt
注意:
file3.txt 是链接文件,显示为 -> file1.txt;
它的 inode 是独立的,不是共享的!
如果你把原文件删了:
$ rm file1.txt $ cat file3.txt cat: file3.txt: No such file or directory
软链接失效了,它只是指路牌,指向的对象不在了就没用了。
四、硬链接 vs 软链接:
是否有独立inode:硬链接没有,多个文件共享同一个inode;软连接有,自己是一个新文件,记录路径。
是否可跨文件系统:硬链接没有,软连接有
删除原文件影响:硬链接不会受影响,剩余链接仍然可访问;软链接会受影响,链接失效
是否可用于目录:硬链接不能,除非超级用户用link();软链接可以。
是否能递归链接:硬链接不能;软链接可以,甚至可以链多个路径
总之,在Linux文件中,硬链接和软连接都是令人惊艳的设计,也是高级玩法不可或缺的一部分。硬链接像克隆,同体多名;软链接像镜像,遥控指向。理解链接的本质后,你会发现一个文件,并不总是一张面孔;一条路径,也不一定直达彼岸。