我有一个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
甚至没有列出b
,c
我对此感到好奇)。
问题:如果分配块大小为 4 KiB,真的那么容易吗?在我的 1000 个文件场景中可以节省 999*4 KiB?
或者,是否ext4
有能力透明地“合并尾部”,或在“目录索引节点”中存储小文件(我隐约记得某些文件系统可以做到这一点)?
(我知道文件分配块可能会有所不同,并且类似的命令tune2fs -l /dev/sda1
可以告诉我。)
答案1
存储文件分为三个部分:用于存储文件内容的块、用于存储文件元数据的索引节点以及指向索引节点的目录项(或多个条目)。
当您创建多个单独的文件时,在最常见的情况下,您需要根据文件的数量多次支付此费用。
使用内联数据(如果您的文件系统是使用适当的选项创建的),如果文件足够小,则可以保存用于存储文件内容的块,但每个文件仍然需要一个索引节点,并且每个文件至少需要一个目录条目。
使用硬链接,您可以保存用于存储文件内容的块和inode:只有一个 inode、文件数据的一个实例(无论是内联在 inode 中还是单独的)以及与链接一样多的目录条目。
考虑到无论如何您都需要存储目录条目,硬链接实际上是免费的。其他任何事情都会涉及更多的存储空间;到底多少取决于您的文件系统的具体设置。