为什么硬链接似乎占用与原始链接相同的空间?

为什么硬链接似乎占用与原始链接相同的空间?

感谢这里的一些很好的问答这一页,我现在理解链接了。我看到硬链接用不同的名称引用相同的索引节点,并且副本是不同的“节点”,具有不同的名称。此外,软链接将原始文件名和路径作为其索引节点,因此如果移动文件,链接就会中断。

因此,我用一些文件(下面的“saluton_mondo.cpp”)测试了我学到的内容,制作了硬链接和软链接以及副本。

jmcf125@VMUbuntu:~$ ls -lh soft hard copy s*.cpp
-rw-rw-r-- 1 jmcf125 jmcf125 205 Aŭg 27 16:10 copy
-rw-rw-r-- 2 jmcf125 jmcf125 205 Aŭg 25 13:34 hard
-rw-rw-r-- 2 jmcf125 jmcf125 205 Aŭg 25 13:34 saluton_mondo.cpp
lrwxrwxrwx 1 jmcf125 jmcf125  17 Aŭg 27 16:09 soft -> saluton_mondo.cpp

然而,我发现硬链接与原始链接的大小相同,从逻辑上讲,与副本的大小相同,这让我感到很尴尬。如果硬链接和原始文件共享相同的 inode,具有数据,并且仅文件名不同,那么硬链接不应该只占用其名称的空间,而不是 205 个字节吗?或者这是返回的原始文件的大小ls -lh?但是我怎么知道文件名占用了多少空间呢?这里它说硬链接没有大小。它们的文件名是否与原始文件名一起保存?硬链接的文件名存储在哪里?

答案1

文件是带有元数据的索引节点,其中包含指向在何处查找数据的指针列表。

为了能够访问文件,您必须关联它到一个目录(将目录视为电话目录,而不是文件夹),即将一个或多个条目添加到多个目录之一以关联一个姓名与该文件。

所有这些链接、这些文件名都指向同一个文件。没有一个是原创的,其他的都是链接。它们都是目录树中同一文件(同一 inode)的访问点。当您获取文件的大小(lstat系统调用)时,您正在检索存储在 inode 中的信息(上面提到的元数据),哪个文件名、您使用哪个链接来引用该文件并不重要。

相比之下,符号链接是另一个文件(另一个 inode),其内容是小路到目标文件。与任何其他文件一样,这些符号链接必须链接到目录(必须有名称),以便您可以访问它们。您还可以有多个指向符号链接的链接,或者换句话说,可以为符号链接指定多个名称(在一个或多个目录中)。

$ touch a
$ ln a b
$ ln -s a c
$ ln c d
$ ls -li [a-d]
10486707 -rw-r--r-- 2 stephane stephane 0 Aug 27 17:05 a
10486707 -rw-r--r-- 2 stephane stephane 0 Aug 27 17:05 b
10502404 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:05 c -> a
10502404 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:05 d -> a

文件号10486707上方是普通文件。当前目录中的两个条目(一个带有 name a,一个带有 name b)链接到它。因为链接数是 2,我们知道当前目录或任何其他目录中没有该文件的其他名称。文件号 10502404 是另一个文件,这次是符号链接类型,两次链接到当前目录。其内容(目标)是相对路径“a”。

请注意,如果 10502404 链接到当前目录之外的另一个目录,则它通常会指向不同的文件,具体取决于访问方式。

$ mkdir 1 2
$ echo foo > 1/a
$ echo bar > 2/a
$ ln -s a 1/b
$ ln 1/b 2/b
$ ls -lia 1 2
1:
total 92
10608644 drwxr-xr-x   2 stephane stephane  4096 Aug 27 17:26 ./
10485761 drwxrwxr-x 443 stephane stephane 81920 Aug 27 17:26 ../
10504186 -rw-r--r--   1 stephane stephane     4 Aug 27 17:24 a
10539259 lrwxrwxrwx   2 stephane stephane     1 Aug 27 17:26 b -> a

2:
total 92
10608674 drwxr-xr-x   2 stephane stephane  4096 Aug 27 17:26 ./
10485761 drwxrwxr-x 443 stephane stephane 81920 Aug 27 17:26 ../
10539044 -rw-r--r--   1 stephane stephane     4 Aug 27 17:24 a
10539259 lrwxrwxrwx   2 stephane stephane     1 Aug 27 17:26 b -> a
$ cat 1/b
foo
$ cat 2/b
bar

除了链接文件的目录之外,文件没有与其关联的名称。它们的名称占用的空间是这些目录中的条目,它计入目录的文件大小/磁盘使用情况。

您会注意到删除文件的系统调用是unlink.也就是说,您不删除文件,而是从它们引用的目录中取消链接。一旦从具有给定文件条目的最后一个目录取消链接,该文件就会被销毁(只要没有进程拥有它)打开)。

答案2

硬链接本质上是原始文件。因此,您看到的报告大小是链接到的文件的大小。这是柔软的只占用其名称空间的链接(有点)。

就文件系统而言,硬链接和原始链接是同一件事,它们指向相同的 inode,因此报告的大小相同。

相关内容