最近在一次工作面试中,我被问到了这个问题。我很诚实地回答说,我知道符号链接的行为方式以及如何创建它,但是不理解硬链接的用途以及与符号链接的区别。
最近在一次工作面试中,我被问到了这个问题。我很诚实地回答说,我知道符号链接的行为方式以及如何创建它,但是不理解硬链接的用途以及与符号链接的区别。
在文件系统的下层,文件是由索引节点(inode)表示的。(或者说是由多个inode表示?不确定。)
文件系统中的文件基本上是指向一个inode的链接。
硬链接(hard link)会创建另一个文件,并链接到相同的基础inode。
当你删除一个文件时,它会删除对基础inode的一个链接。只有当所有对inode的链接都被删除时,inode才会被删除(或可删除/覆盖)。
符号链接是指向文件系统中另一个名称的链接。
一旦创建了硬链接,它链接的是inode。删除、重命名或移动原始文件不会影响硬链接,因为它链接到基础inode。对inode上的数据所做的任何更改都会反映在引用该inode的所有文件中。
注意:硬链接仅在同一文件系统内有效。符号链接可以跨文件系统,因为它们只是另一个文件的名称。
readlink -f <fileName>
将跟随符号链到真实文件。 - Martin York俗话说得好,一张图片胜过千言万语。我是这样想象的:
下面是如何得到这张图片的过程:
在文件系统中创建名为 myfile.txt
的文件,该文件指向一个新的 inode(其中包含文件的元数据,并指向包含其内容的数据块,即文本“Hello, World!”):
$ echo 'Hello, World!' > myfile.txt
创建一个硬链接my-hard-link
到文件myfile.txt
,意思是"创建一个文件,它应该指向与myfile.txt
指向相同的inode":
$ ln myfile.txt my-hard-link
创建一个软链接my-soft-link
指向文件myfile.txt
,意思是“创建一个文件,该文件应指向文件myfile.txt
”:
$ ln -s myfile.txt my-soft-link
如果删除(或移动)myfile.txt
,现在会发生什么: my-hard-link
仍然指向相同的内容,因此不受影响,而 my-soft-link
现在指向空。其他答案讨论了每个链接类型的优缺点。
myfile.txt
所引用的相同inode)。而对于符号链接,它的引用不是inode(inode包含数据),而是文件系统路径到myfile.txt
(例如/home/Documents/myfile.txt
)。 - akivajgordon以下是一些可能有帮助的例子。
创建两个文件,并在其中填充数据:
$ printf Cat > foo
$ printf Dog > bar
创建一个硬链接和软链接(也称为符号链接):$ ln foo foo-hard
$ ln -s bar bar-soft
按大小升序列出长格式的目录内容:
ls -lrS
lrwxr-xr-x 1 user staff 3 3 Apr 15:25 bar-soft -> bar
-rw-r--r-- 2 user staff 4 3 Apr 15:25 foo-hard
-rw-r--r-- 2 user staff 4 3 Apr 15:25 foo
-rw-r--r-- 1 user staff 4 3 Apr 15:25 bar
这告诉我们:
第一个列:软链接和硬链接的文件模式不同
lrwxr-xr-x
l
= 符号链接rwx
= 可读,可写,可执行r-x
= 可读,不可写,可执行r-x
= 可读,不可写,可执行-rw-r--r--
-
= 普通文件rw-
= 可读,可写,不可执行r--
= 可读,不可写,不可执行r--
= 可读,不可写,不可执行第二个列:硬链接文件的链接数更高
第五个列:软链接的大小更小,因为它是引用而不是副本
最后一列:符号链接通过 ->
显示其链接到的文件
更改 foo 的文件名不会影响 foo-hard。
$ mv foo foo-new
$ cat foo-hard
Cat
修改foo的内容会反映在foo-hard中:
$ printf Dog >> foo
$ cat foo-hard
CatDog
像 foo-hard 这样的硬链接指向文件的inode节点,即文件的内容。
而对于 bar-soft 这样的软链接,则不是这种情况:
$ mv bar bar-new
$ ls bar-soft
bar-soft
$ cat bar-soft
cat: bar-soft: No such file or directory
由于软链接指向的是名称而非内容,因此找不到该文件的内容。
同样地,如果删除了foo
,foo-hard
仍然保存着内容;如果删除了bar
,bar-soft
只是指向一个不存在的文件的链接。
touch blah1; touch blah2
can be shortened to touch blah1 blah2
- Dmitri Zaitsev软链接:
软链接或者符号链接更多地是原文件的快捷方式,如果你删除了原文件,快捷方式也会失效,而如果你只删除了快捷方式,则不会对原文件产生任何影响。
软链接语法:ln -s 被链接文件路径 链接名称
输出:链接名称 -> ./被链接文件
验证:readlink 链接名称
,另外在ls -l 链接名称
的输出中你将会看到lrwxrwxrwx
的第一个字母为l,这表明该文件是一个软链接。
删除链接:unlink 链接名称
注意:如果希望软链接即使在当前目录下移动后仍然可以工作,确保在创建软链接时使用绝对路径而不是相对路径,即从 /root/user/Target_file
开始而不是./Target_file
。
硬链接:
硬链接更多地是镜像副本或指向同一文件的多个路径。对文件1进行操作后,它将出现在文件2中,删除一个链接仍然会保留另一个链接。
只有在所有的(硬)链接或指向相同文件的所有路径被删除后,inode(或文件)才会被删除。
一旦创建了硬链接,该链接具有原始文件的inode。删除、重命名或移动原始文件都不会影响硬链接,因为它链接到底层inode。对inode上的数据所做的任何更改都会反映在引用该inode的所有文件中。
硬链接语法:ln 被链接文件 链接名称
输出:将创建一个名为链接名称的文件,其inode号与Targetfile相同。
验证:ls -i 链接名称 Target_file
(检查它们的inode)
删除链接:rm -f 链接名称
(像普通文件一样删除链接)
注意:符号链接可以跨越文件系统,因为它们只是另一个文件的名称。而硬链接仅在同一个文件系统内有效。
符号链接比硬链接多了一些功能:
使用符号链接时,你可以立即知道它指向哪里,而对于硬链接,你需要探索整个文件系统才能找到共享相同inode的文件。
# find / -inum 517333
/home/bobbin/sync.sh
/root/synchro
硬链接不能指向目录。
硬链接有两个限制:
理解硬链接和符号链接之间的区别的简单方法是通过一个简单的例子。硬链接指向文件存储的位置,或该文件的索引节点(inode)。而符号链接将指向实际文件本身。
因此,如果我们有一个名为“a”的文件,并创建一个硬链接“b”和一个符号链接“c”,它们都将引用文件“a”:
echo "111" > a
ln a b
ln -s a c
"a", "b", 和 "c" 的输出为:
cat a --> 111
cat b --> 111
cat c --> 111
现在让我们删除文件"a",看看输出的"a"、"b"和"c"会发生什么:
rm a
cat a --> No such file or directory
cat b --> 111
cat c --> No such file or directory
发生了什么?
因为文件"c"指向文件"a"本身,如果文件"a"被删除,那么文件"c"将没有指向任何东西,实际上它也被删除了。
然而,文件"b"指向存储位置或文件"a"的索引节点。因此,如果文件"a"被删除,则不再指向该索引节点,但是由于文件"b"指向它,该索引节点将继续存储原先属于"a"的所有内容,直到没有更多的硬链接指向它为止。
符号链接指向一个路径名,它可以位于系统文件树的任何位置,甚至在创建链接时可能并不存在。目标路径可以是相对路径或绝对路径。
硬链接是对inode的附加指针,这意味着它们只能存在于与目标相同的卷上。对文件的其他硬链接与用于引用文件的“原始”名称无法区分。