通过用 999 个硬链接和 1 个文件替换 1000 个相同的 1 字节文件,在 ext4 上可以节省多少空间?

通过用 999 个硬链接和 1 个文件替换 1000 个相同的 1 字节文件,在 ext4 上可以节省多少空间?

我有一个ext4格式化的磁盘,其中有数千个自动生成的并且需要的文件。其中几千个只有一个字节长,有些是两个字节。两组小文件中的所有文件都是相同的。

通过定位这些(例如 1000 个)1 字节长度的文件,删除每个文件并硬链接到单个代表性文件,可以节省多少空间?

像这样:

# ls -l
-rw-r----- 1 john john 1 Feb 25 10:29 a
-rw-r----- 1 john john 1 Feb 25 10:29 b
-rw-r----- 1 john john 1 Feb 25 10:29 c
# du -kcs ?
4   a
4   b
4   c
12  total

尝试整合:

# rm b c
# ln a b
# ln a c
ll
total 12
-rw-r----- 3 john john 1 Feb 25 10:29 a
-rw-r----- 3 john john 1 Feb 25 10:29 b
-rw-r----- 3 john john 1 Feb 25 10:29 c
# du -kcs ?
4   a
4   total

(请注意,du甚至没有列出bc我对此感到好奇)。

问题:如果分配块大小为 4 KiB,真的那么容易吗?在我的 1000 个文件场景中可以节省 999*4 KiB?

或者,是否ext4有能力透明地“合并尾部”,或在“目录索引节点”中存储小文件(我隐约记得某些文件系统可以做到这一点)?

(我知道文件分配块可能会有所不同,并且类似的命令tune2fs -l /dev/sda1可以告诉我。)

答案1

存储文件分为三个部分:用于存储文件内容的块、用于存储文件元数据的索引节点以及指向索引节点的目录项(或多个条目)。

当您创建多个单独的文件时,在最常见的情况下,您需要根据文件的数量多次支付此费用。

使用内联数据(如果您的文件系统是使用适当的选项创建的),如果文件足够小,则可以保存用于存储文件内容的块,但每个文件仍然需要一个索引节点,并且每个文件至少需要一个目录条目。

使用硬链接,您可以保存用于存储文件内容的块inode:只有一个 inode、文件数据的一个实例(无论是内联在 inode 中还是单独的)以及与链接一样多的目录条目。

考虑到无论如何您都需要存储目录条目,硬链接实际上是免费的。其他任何事情都会涉及更多的存储空间;到底多少取决于您的文件系统的具体设置。

相关内容