Ned*_*d64 0 ext4 disk-usage inode
我有一个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
Run Code Online (Sandbox Code Playgroud)
尝试巩固:
# 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
Run Code Online (Sandbox Code Playgroud)
(请注意,du甚至没有清单b和c,我觉得好奇)。
问题:如果分配块的大小为 4 KiB,那么在我的 1000 个文件场景中是否真的那么容易并且可以节省 999*4 KiB?
或者,是否ext4有能力透明地“合并尾部”,或将小文件存储在“目录 inode”中(我依稀记得有些文件系统可以做到这一点)?
(我知道文件分配块可能会有所不同,像这样的命令tune2fs -l /dev/sda1可以告诉我。)
存储文件分为三个部分:用于存储文件内容的块、用于存储文件元数据的 inode 以及指向 inode 的目录条目(或多个条目)。
当您创建多个单独的文件时,在最一般的情况下,您需要支付与文件数量一样多的费用。
使用内联数据(如果您的文件系统是使用适当的选项创建的),如果文件足够小,您可以保存用于存储文件内容的块,但您仍然需要每个文件一个 inode 和每个文件至少一个目录条目。
使用硬链接,您可以保存用于存储文件内容和inode 的块:只有一个 inode、一个文件数据实例(无论是内联 inode 还是单独的),以及与链接一样多的目录条目。
鉴于您无论如何都需要存储目录条目,硬链接实际上是免费的。其他任何事情都将涉及更多存储;具体多少取决于您的文件系统的特定设置。