硬链接似乎仅用于链接本身(而不是文件数据)就需要数百个字节

硬链接似乎仅用于链接本身(而不是文件数据)就需要数百个字节

附加信息

首先,感谢大家的回答。

因此,我再次重新运行测试来测试下面的答案,即目录/文件夹条目占用 4KB,这使我的数字出现偏差,因此这次将 20,000 个文件放在一个目录中,并对另一个目录执行 cp -al。结果非常不同,在去掉文件名的长度后,每个硬链接的长度约为 13 个字节,比 600 个字节好得多。好的,那么为了完整起见,请考虑下面给出的答案,这是由于每个条目造成的对于占用 4KB 的目录/文件夹,我再次进行了测试,但这一次我创建了数千个目录,并在每个目录中放置了一个文件。数学计算后的结果(硬盘上占用的空间增加/文件数量(忽略目录)几乎每个文件正好 4KB,这表明硬链接只占用几个字节,但实际目录/文件夹的条目占用4KB。


所以我正在考虑实施 rsync / 硬链接 / 快照备份策略,并且想知道硬链接占用了多少数据,就像它必须将额外链接的条目作为目录条目等一样。无论如何,我似乎找不到有关于此的任何信息,我猜它取决于文件系统。我能找到的唯一信息是建议他们不占用空间(可能意味着他们不占用文件内容的空间),他们占用的空间可以忽略不计,因为他们只占用几个字节来存储硬链接。

因此,我使用了几个系统(一个是虚拟机,一个是真实硬件),并以 root 身份在根目录中执行了以下操作:

mkdir link
cp -al usr link

usr目录大约有 54,000 个文件。硬盘使用空间增加约34MB。所以每个硬链接大约需要 600 个字节,还是我做错了什么?


我在两个系统上都使用 LVM,格式为 ext4。

文件名大小总共约为 1.5MB(我通过执行 ls -R 并将其重定向到文件来获得)。

老实说,带有硬链接的 rsync 效果非常好,我计划使用它在几个工作服务器上进行日常备份。我还认为在相当长的一段时间内进行这样的增量备份/快照会很容易。然而,十天后,30mb 就是 300mb,依此类推。此外,如果实际文件数据/内容仅进行了一些更改,例如几百 KB,那么每天存储 30+ MB 的硬链接似乎过多,但我同意您关于现代磁盘大小的观点。只是因为我没有看到任何地方提到这个硬链接大小,所以我认为我可能做错了什么。 Linux 操作系统上的硬链接 600 字节正常吗?

为了计算使用的空间,我df在 之前和之后做了一个cp -al

答案1

cp -al usr link创建了一堆硬链接,但它也创建了一些目录。目录无法硬链接,因此它们会被复制。

每个硬链接占用一个目录项的空间,目录项至少需要存储文件名和inode号。每个目录占用一个目录项的空间,加上一个用于其元数据的索引节点。大多数文件系统(包括 ext2 系列)都会单独计算 inode 空间。所有硬链接都位于复制操作创建的目录中。所以你看到的空间实际上是 下目录的大小/usr

在大多数文件系统中,每个目录至少占用一个块。 4kB 是 Linux 上典型的块大小。因此,您可以预期副本需要 4×(目录数)(以 kB 为单位),再加上需要多个块的较大目录的一些更改。假设 4kB 块,您的副本创建了大约 8500 个块,这听起来对于/usr包含 54000 个文件的目录来说是正确的。

目录必须只有一个父目录。事实上,它们确实具有硬链接(或者至少看起来如此,尽管现代文件系统往往不会在幕后使用硬链接):一个用于其父目录中的条目,一个用于其父.目录中的条目,一个用于..每个子目录中的条目。但您不能与它们建立其他硬链接。某些 Unix 变体允许 root 对某些文件系统上的目录建立硬链接,但存在创建无法删除的循环或隐藏无法访问的目录树的风险。

相关内容