EXT2 - 组描述符表的边界

EXT2 - 组描述符表的边界

我必须为大学编写一个 CLI 程序,该程序接受使用 ext2 文件系统格式化的驱动器。我必须恢复某些文件。看完之后文章我还有一个问题。当读取超级块之后的块组描述符表时,我不知道何时停止。如果我正确理解 FS,它会按块分配。因此,如果表无法放入一个块中,则会为该表分配整个第二个块。但我如何知道为该表分配了多少块呢?

超级块包含这些字段s_blocks_counts_blocks_per_group但它们仅在我的碎片率为 0% 时才有用。例如,如果我有 8 个组,每个组由于碎片而只有一个数据块,我将无法猜测组的数量。

然后s_first_data_block我认为这就是我需要的确切信息

decriptor_table_range = end_of_superblock..(s_first_data_block - block_bitmap - inode_bitmap - inode_table)

inode 表的大小由 和s_inodes_per_group定义s_inode_size。但文章指出,s_first_data_block只能是0或1。

标识第一个数据块的 32 位值,换句话说,包含超级块结构的块的 id。

请注意,对于块大小大于 1KB 的文件系统,该值始终为 0;对于块大小为 1KB 的文件系统,该值始终为 1。超级块始终从磁盘的第 1024 个字节开始,通常恰好是第 3 个扇区的第一个字节。

所以这也没有帮助。我看到的唯一机会是获取驱动器的大小,并检查驱动器中可以容纳多少个组,同时考虑到不断增长的组描述符表。但是,如果我将 .img 文件安装为驱动器怎么办?我认为这个文件会动态增长,所以这里我不知道最大大小是多少。

那么我如何知道块描述符表使用了多少个块,即有多少个块组?

编辑:

对不起,我犯了一个大错误。尽管我读了这篇文章,但我认为s_blocks_count包含了当前使用的块的数量。但它包含包括空闲块在内的总数。所以s_blocks_count / s_blocks_per_group实际上确实有效。

32位值表示系统中的块总数,包括所有已使用的、空闲的和保留的。该值必须小于或等于(s_blocks_per_group * 块组数量)。如果最后一个块组由于卷大小而具有比 s_blocks_per_group 更少的块数,则它可以低于先前的计算。它必须等于每个块组中定义的块的总和。

相关内容