$ ln fun fun-hard
$ ln fun dir1/fun-hard
$ ln fun dir2/fun-hard
$ ls -1
total 16
drwxrwxr-x 2 me 4096 2018-01-14 16:17 dir1
drwxrwxr-x 2 me 4096 2018-01-14 16:17 dir2
-rw-r—-r—- 4 me 1650 2018-01-10 16:33 fun
-rw-r—-r—- 4 me 1650 2018-01-10 16:33 fun-hard
因此,文件 fun 有 4 个实例 fun 和 fun-hard 列表中的第二个字段都包含 4,它是该文件现在存在的硬链接数。
drwxrwxr-x 2 me 4096 2018-01-14 16:17 dir1
drwxrwxr-x 2 me 4096 2018-01-14 16:17 dir2
为什么 dir1 和 dir2 上有 2 个文件 fun-hard 实例?不是只有一个硬链接:有趣-困难吗?
-rw-r—-r—- 4 me 1650 2018-01-10 16:33 fun
-rw-r—-r—- 4 me 1650 2018-01-10 16:33 fun-hard
您能详细解释一下这 4 个 fun 和 fun-hard 的例子吗?为什么它们会重复出现?
dir1 和 dir2 上有 2 个硬链接,如果……:
-rw-r—-r—- 4 me 1650 2018-01-10 16:33 fun
-rw-r—-r—- 4 me 1650 2018-01-10 16:33 fun-hard
…有 4 个硬链接实例,为什么 dir1 和 dir2 也不是 4 个实例?
答案1
最多目录至少有两个硬链接;通常有三个或更多。如果执行以下两个命令,您将看到存在三个硬链接,foo
并且它们当然都具有相同的 inode(因为它们是指向同一目录的链接):
$ mkdir -p foo/bar
$ ls -ldi foo foo/. foo/bar/..
一个目录一般会有至少以下硬链接:
- 本身(例如
foo
) - 它自己的链接(例如
foo/.
) foo/bar/..
从它作为父目录的每个子目录(例如)(如果有)到其自身的链接。
这些目录自身的硬链接完全与其内容无关,并且与每个目录中每个文件的硬链接的计数完全分开进行计数。
答案2
ls
使用更多选项来显示索引节点号和目录树可能更容易可视化。
$ ls -l --inode --recursive
.:
total 16
6299664 drwxrwxr-x 2 paul paul 4096 Jan 24 10:42 dir1
6299832 drwxrwxr-x 2 paul paul 4096 Jan 24 10:42 dir2
6299812 -rw-rw-r-- 4 paul paul 1970 Jan 24 10:41 fun
6299812 -rw-rw-r-- 4 paul paul 1970 Jan 24 10:41 fun-hard
./dir1:
total 4
6299812 -rw-rw-r-- 4 paul paul 1970 Jan 24 10:41 fun-hard
./dir2:
total 4
6299812 -rw-rw-r-- 4 paul paul 1970 Jan 24 10:41 fun-hard
$
标记的四个条目6299812
是不同的目录条目,它们都引用相同的索引节点及其数据块。如果我更改其中一个的修改时间和另一个的内容,则所有四个内容都会更改 - 这些内容只有一个副本。特别是,不存在哪个是“原创”的概念——它们全部是。
索引节点保存硬链接的计数,因此文件管理器知道链接计数何时变为零,此时数据将无法访问并可以释放回可用空间。但索引节点不记录这些链接的来源。另一方面,目录确实拥有与其直接父级的链接。