创建硬链接

创建硬链接
$ 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是不同的目录条目,它们都引用相同的索引节点及其数据块。如果我更改其中一个的修改时间和另一个的内容,则所有四个内容都会更改 - 这些内容只有一个副本。特别是,不存在哪个是“原创”的概念——它们全部是。

索引节点保存硬链接的计数,因此文件管理器知道链接计数何时变为零,此时数据将无法访问并可以释放回可用空间。但索引节点不记录这些链接的来源。另一方面,目录确实拥有与其直接父级的链接。

相关内容