在格式化纯大型视频文件的磁盘时,我计算了我认为合适的每索引节点字节值,以便最大化可用磁盘空间。
然而,迎接我的是:
mkfs.ext4: invalid inode ratio [RATIO] (min 1024/max 67108864)
我假设最小值是从理论上可以使用的值得出的 - 没有必要拥有比可以使用的更多的索引节点。
但最大值从何而来?mkfs
不知道我将放在它创建的文件系统上的文件大小 - 所以除非是这样,否则{disk size} - {1 inode size}
我根本不明白为什么我们有一个最大文件大小,更不用说低至 67MB 了。
答案1
由于文件系统的构建方式。这有点混乱,默认情况下,您甚至不能将比率降低到 1/64 MB。
来自kernel.org 上的 Ext4 磁盘布局文档,我们看到文件系统内部结构与块大小(默认为 4 kB)相关联,块大小控制着文件系统的大小块组,以及块组中 inode 的数量。一个块组具有该组中块的一块大小的位图,以及至少一个索引节点块。
由于位图的原因,最大块组大小为8 blocks * block size in bytes
,因此在具有 4 kB 块的 FS 上,块组的大小为 32768 个块或 128 MB。 inode 至少占用 1 个块,因此对于 4 kB 块,(4096 B/block) / (256 B/inode) = 16 inodes/block
每 128 MB 至少获得 16 个 inode,或每 8 MB 1 个 inode。
对于 256 B/inode,即 256 B / 8 MB,或每 32 kB 1 个字节,或总大小的约 0,003%。
减少索引节点的数量不会有帮助,你只会得到一个部分填充的索引节点块。此外,索引节点的大小也并不重要,因为分配是按块完成的。块组大小才是元数据的真正限制。
增加块大小会有所帮助,理论上,最大块组大小以块大小的平方增加(除了它似乎限制为略小于 64k 块/组)。但是您不能使用大于系统页面大小的块大小,因此在 x86 上,您只能使用 4 kB 块。
然而,有bigalloc
特征这正是你想要的:
对于大部分由大文件组成的文件系统,希望能够以多个块为单位分配磁盘块,以减少碎片和元数据开销。 bigalloc 功能正是提供了这种能力。
管理员可以在mkfs时设置一个块簇大小(存储在超级块中的s_log_cluster_size字段中);从那时起,块位图跟踪簇,而不是单个块。这意味着块组的大小可以是几 GB(而不仅仅是 128MiB);然而,最小分配单元变成簇,而不是块,即使对于目录也是如此。
您可以使用 启用该功能mkfs.ext4 -Obigalloc
,并使用 设定簇大小-C<bytes>
,但mkfs
请注意:
Warning: the bigalloc feature is still under development
See https://ext4.wiki.kernel.org/index.php/Bigalloc for more information
该页面上提到了与延迟分配相结合的问题ext4
手册页,以及单词“风险巨大”也出现在 Bigalloc wiki 页面上。
这些都与该选项设置的 64 MB/inode 限制无关-i
。它似乎只是在接口级别设置的任意限制。索引节点的数量也可以直接使用该-N
选项设置,并且在使用时不会进行检查。还有上限是基于这最大限度文件系统的块大小,而不是实际选择的结构限制的块大小。
由于 64k 块/组的限制,如果没有bigalloc
64 MB/inode 的比率,则无法获得尽可能少的 inode,而如果使用bigalloc
,则可以将 inode 的数量设置得比它低得多。
答案2
您看到的数字是硬编码的,原因如下。
源mke2fs
代码有:
com_err(program_name, 0,
_("invalid inode ratio %s (min %d/max %d)"),
optarg, EXT2_MIN_BLOCK_SIZE,
EXT2_MAX_BLOCK_SIZE * 1024);
(发行说明中甚至有一条消息,关于对用户更好,并在抛出错误时显示可能的最小值和最大值,这比以前更好)。
并且:
#define EXT2_MIN_BLOCK_SIZE (1 << EXT2_MIN_BLOCK_LOG_SIZE)
#define EXT2_MAX_BLOCK_SIZE (1 << EXT2_MAX_BLOCK_LOG_SIZE)
最后:
define EXT2_MIN_BLOCK_LOG_SIZE 10 /* 1024 */
define EXT2_MAX_BLOCK_LOG_SIZE 16 /* 65536 */
这就解释了你所看到的。
我本来期望自己,每https://unix.stackexchange.com/a/193140/211833,该比率最多为最大分区大小除以最大 inode 计数,但事实并非如此。
根据其规范,对于 4k 块,ext4
最大卷大小为 1 exbibyte(2 60字节),最大 inode 数量为 2 32,最大文件大小为 16 TiB (16 * 2 40 = 2 44 )。
因此,最大分区大小除以 inode 计数将为 2 60-32 = 2 28,这不是源文件中硬编码的内容(67108864 是 2 26)。我不知道其中的区别,但我也不是文件系统开发人员。