当我在一个稀疏的 16GB 文件上创建 ext4 文件系统而不保留根空间时,实际可用大小为 15.58GB。为什么会发生这种情况?我使用的命令:
fallocate -l 16G test.img
mkfs -t ext4 -m 0 test.img
mount test.img test
在tune2fs中有一个值Overhead clusters: 109857
可以乘以4096(块大小)并除以1024^3以获得以GB为单位的值,然后得到缺失的~0.41 GB。https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout说了一些关于开销集群的非常奇怪的事情:
fs 中的开销块/簇。 (嗯?这个字段总是零,这意味着内核会动态计算它。)
这是什么意思?和这个问题有关系吗?我应该在 Fallocate 中设置什么大小,以便安装的映像的总大小为 16 GB?
答案1
“开销簇”是文件系统用来管理磁盘的所有元数据。通常,ext4 最大的组件是 inode 表和日志;您可以使用 来查看它们的大小tune2fs
。
默认 inode_ratio 为 16KiB;这将在您的示例中提供 1M inode 乘以 256 字节,是您的神秘 0.41GiB 中的 0.25。
您可以在启动时设置 inode 数量和日志大小文件系统已创建。正如前面的评论者指出的那样,您不能将它们设置为零。
答案2
我应该在 Fallocate 中设置什么大小,以便安装的映像的总大小为 16 GB?
16 GB,就像您当前所做的那样。
当我在一个稀疏的 16GB 文件上创建 ext4 文件系统而不保留根空间时,实际可用大小为 15.58GB。为什么会发生这种情况?
存储文件的设备的大小永远不会与文件的空间相同 - 整个文件系统信息(文件名、属性以及属于文件的数据实际存储在块设备上的位置)需要去某处!
和这个问题有关系吗?
这不是问题!这就是现实。
事实是,除非您有一个大小正好为 16 GB 的单个文件,否则您无法计算所需的“开销”:每个文件都需要一些额外的空间 - 在经典文件系统中,小文件/文件尾部无法计算甚至可以合并在一个块中,这样你就总是需要四舍五入每个文件大小为块大小的下一个倍数(例如 4 kB)。
所以,这个问题有点没有实际意义。如果您想要 16 GB 存储空间(您需要什么确切地16 GB 文件存储空间?使用 16 GB 映像不是更现实吗?),您需要“稍微”过度配置,而这在不知道未来文件系统内容的情况下是尽可能精确的精确到字节。那么,17 GB 吧?