一位讲师向我们提出了一个问题:
如果文件大小为 54 KB,块大小为 4 KB,则需要多少个数据块才能使用 inode 收集 EXT4 文件系统中的所有数据。
答案:15
我能找到的唯一解释是 54/4 = 13.5,它向上舍入为 14 个数据块,我们添加 1 个 inode 块,因此总共 15 个块。让我困惑的是,这个问题明确询问数据块,而不是索引节点块。这是否意味着索引节点块与数据块相同?不管怎样,声明是每个文件都有一个 inode 块是的,这仅适用于 EXT4 文件系统吗?
我还没有得到讲师的解释,网上也找不到,所以我在这里问一下。如果这不是正确的提问地点,请告诉我。
我提前感谢您的答复。
答案1
很难确切地知道他们在想什么(你必须问他们),特别是因为他们谈论“FS 上的所有数据”(不仅仅是一个文件),并提到“使用索引节点”(复数形式)。
但是,他们可能指的一件事是基本块寻址,它直接从 inode 寻址前 12 个数据块,然后分配一个额外的块来包含接下来的 1024 个数据块的地址(假设通常的 4 个数据块) kB 文件系统块大小)。对于 14 个数据块,除了 inode 本身之外,您还需要 1 个间接块,总共 15 个数据块。
然而,这有点过时了,因为 AFAIK ext4 现在通常使用基于范围的映射,这意味着它只为每个连续的数据块存储一个条目。这意味着所需的元数据量取决于文件的碎片程度,但我假设常见情况是只需要几个扩展,并且它们可以直接存储在 inode 中:
盘区树的根节点存储在 inode.i_block 中,这允许在不使用额外元数据块的情况下记录前四个盘区。
看“inode.i_block 的内容”位于 wiki.kernel.org 上的 Ext4 磁盘布局文档中。
答案2
默认情况下,ext4 文件系统目前使用 512 字节 inode 进行格式化,因此每个 4KB 块将有 8 个 inode 共享。然而,索引节点是在格式化时静态分配的,而不是像数据块那样分配。