为纯大型视频文件格式化磁盘,我计算了我认为合适的每 inode 字节值,以最大化可用磁盘空间。
然而,我受到了欢迎:
mkfs.ext4: invalid inode ratio [RATIO] (min 1024/max 67108864)
我假设最小值是从理论上可以使用的东西中得出的——没有比以往任何时候都可以使用的更多的 inode。
但最大值从何而来?mkfs
不知道我将放在它创建的文件系统上的文件大小 - 所以除非是这样,否则{disk size} - {1 inode size}
我不明白为什么我们有一个最大值,更不用说一个低至 67MB 的文件了。
由于文件系统的构建方式。这有点混乱,默认情况下,您甚至不能将比率降至 1/64 MB。
从kernel.org 上的 Ext4 磁盘布局文档中,我们看到文件系统内部与块大小(默认为 4 kB)相关联,它控制块组的大小和块组中的 inode 数量. 一个块组具有该组中块的一个块大小的位图,以及至少一个 inode 块。
由于位图,最大块组大小为
8 blocks * block size in bytes
,因此在具有 4 kB 块的 FS 上,块组大小为 32768 个块或 128 MB。inode 至少占用一个块,因此对于 4 kB 块,每 128 MB 至少(4096 B/block) / (256 B/inode) = 16 inodes/block
或 16 个 inode,或每 8 MB 1 个 inode。对于 256 B/inode,即 256 B / 8 MB,或每 32 kB 1 个字节,或约 0,003% 的 inode 总大小。
减少 inode 的数量无济于事,您只会得到一个部分填充的 inode 块。此外,inode 的大小也并不重要,因为分配是按块完成的。块组大小才是元数据的真正限制。
增加块大小会有所帮助,理论上,最大块组大小会以块大小的平方增加(除了它似乎上限略低于 64k 块/组)。但是您不能使用大于系统页面大小的块大小,因此在 x86 上,您只能使用 4 kB 块。
但是,有一个正是您想要的
bigalloc
功能:您可以使用 启用它
mkfs.ext4 -Obigalloc
,并使用 设置集群大小-C<bytes>
,但mkfs
请注意:ext4
在该页面和手册页上提到了与延迟分配相结合的问题,并且Bigalloc wiki 页面上也出现了“巨大风险”一词。-i
这些都与该选项设置的 64 MB / inode 限制无关。它似乎只是在接口级别设置的任意限制。inode 的数量也可以直接使用该-N
选项设置,并且在使用时,没有检查。此外,上限是基于文件系统的最大块大小,而不是实际选择作为结构限制的块大小。由于 64k 块/组的限制,如果
bigalloc
没有 64 MB / inode 的比率所暗示的那样少的 inode,则无法获得尽可能少的 inode,并且bigalloc
可以将 inode 的数量设置得比它低得多。您看到的数字是硬编码的,原因如下。
mke2fs
源代码有:(发行说明中甚至有一条消息是关于对用户更好,并在抛出错误时显示可能的最小值和最大值,这比以前更好)。
并且:
最后:
所以这解释了你所看到的。
根据https://unix.stackexchange.com/a/193140/211833 ,我本来希望自己的比率最多是最大分区大小除以最大 inode 数,但事实并非如此。
根据其规范,
ext4
最大卷大小为 1 exbibyte(2 60字节),最大 inode 数为 2 32,最大文件大小为 16 TiB (16 * 2 40 = 2 44 ),4k 块。因此,最大分区大小除以 inode 计数将为 2 60-32 = 2 28,这不是源文件中硬编码的内容(67108864 是 2 26)。我不知道有什么区别,但我也不是文件系统开发人员。