Unix中的硬链接和符号链接

9

我想澄清一下,硬链接/符号链接实际上是创建的文件吗?

我运行了以下命令:

ln source hardlink
ln -s source softlink

-- ls命令将这2个链接显示为文件。因此我的问题是,ln / ln -s实际上是否会创建一个文件?祝好,darkie15
2个回答

14

是的,也不完全是 :-)

在UNIX中,文件的内容与该文件的目录条目是不同的。您可以有多个目录条目指向相同的内容(查找inode以了解其工作原理的描述),并且这里是棘手的部分:

所有这些目录条目都是相等的。 即使其中一个是首先创建的,它也没有什么特别之处。如果您删除它,则内容不会消失,只会删除目录条目。一旦inode具有零个目录条目指向它(并且所有进程关闭文件 - 我曾经因尝试清除磁盘空间而删除日志文件而被咬伤,结果发现因为一个进程仍然打开文件,即使没有目录条目指向它们,文件内容也不会恢复)。

这是针对硬链接的。

软链接有点棘手。它们确实创建了一种“文件”(单独的inode),其中包含指向目标文件的路径。那些链接并不相等。删除原件将使您拥有一个指向无处的软链接。

由于在给定文件系统上inode是唯一的,因此硬链接不能引用不同文件系统上的数据。

软链接没有这种限制,因为它们存储到目标文件的路径,而不是它的inode。

以下记录可能有所帮助:

$ echo hello >f1
$ ln f1 f2
$ ln -s f1 f3
$ ls -ial f*
    7385 -rw-r--r-- 2 pax None 6 May 11 14:09 f1
    7385 -rw-r--r-- 2 pax None 6 May 11 14:09 f2
    4672 lrwxrwxrwx 1 pax None 6 May 11 14:09 f3 -> f1
$ cat f1
    hello
$ cat f2
    hello
$ cat f3
    hello
$ rm f1
$ ls -ial f*
    7385 -rw-r--r-- 2 pax None 6 May 11 14:09 f2
    4672 lrwxrwxrwx 1 pax None 6 May 11 14:09 f3 -> f1
$ cat f1
    cat: f1: No such file or directory
$ cat f2
    hello
$ cat f3
    cat: f3: No such file or directory

我只使用了inode号的最后四位来保持条目简短(而不是给你展示像43910096366994672这样的inode号),但你可以看到f1和f2具有完全相同的inode,而f3则不同。你还可以看到最初创建为f1的文件的内容在其删除后仍然存在,因为f2仍然引用它。然而,由于f3引用的是f1的名称而不是其inode,因此尝试使用它会出现错误。

顺便说一句:当UNIX像这样与你戏弄时,你一定会喜欢它:

$ ls f*
    f2  f3
$ cat f3 # What the ...?
    cat: f3: No such file or directory

创建一个名为spacebackspacex的文件,然后看着别人试图删除它,几乎和编程一样有趣 :-)


rm \<TAB>?我不认为退格符 (^?) 会让它变得更复杂 :) - unode

3
没有一个创建文件。
磁盘上的文件由“inode”标识。目录将文件名映射到inodes。硬链接意味着“在此目录中创建一个新的文件名,该文件名指向我命名的文件相同的inode”。符号链接意味着“在此目录中创建一个新的文件名,该文件名指向其他文件所指向的任何inode”。
正如mangoman在评论中指出的那样,符号链接确实会创建一个具有链接目标名称的文件,但您不应关注它。这是一个特殊的文件,与您无关。

2
在软链接的情况下,会创建一个文件,其中包含指向目标文件的绝对路径。 - Chintan Parikh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接