【发布时间】:2010-05-11 06:03:03
【问题描述】:
我只是想澄清一下硬/符号链接是否实际上是一个创建的文件??
我运行了命令:
ln source hardlink
ln -s source softlink
-- ls 命令将这两个链接显示为一个文件。
所以我的问题是,ln / ln -s 是否真的创建了一个文件?
问候, 黑暗15
【问题讨论】:
我只是想澄清一下硬/符号链接是否实际上是一个创建的文件??
我运行了命令:
ln source hardlink
ln -s source softlink
-- ls 命令将这两个链接显示为一个文件。
所以我的问题是,ln / ln -s 是否真的创建了一个文件?
问候, 黑暗15
【问题讨论】:
是的,也不是:-)
在 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> ?我看不出退格(^?)如何使它变得更复杂:)
两者都没有创建文件。
磁盘上的文件由“inode”标识。目录将文件名映射到 inode。硬链接的意思是“在这个目录中创建一个新的文件名,它指向与我命名的文件相同的 inode。”
符号链接意味着“在此目录中创建一个新文件名,该文件名指向其他文件指向的任何 inode。”
正如 mangoman 在评论中指出的那样,符号链接确实会创建一个带有链接目标名称的文件,但您不应该注意它。这是一个与您无关的特殊文件。
【讨论】: