我必须为大学编写一个 CLI 程序,该程序接受使用 ext2 文件系统格式化的驱动器。我必须恢复某些文件。看完之后这文章我还有一个问题。当读取超级块之后的块组描述符表时,我不知道何时停止。如果我正确理解 FS,它会按块分配。因此,如果表无法放入一个块中,则会为该表分配整个第二个块。但我如何知道为该表分配了多少块呢?
超级块包含这些字段s_blocks_count
,s_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 更少的块数,则它可以低于先前的计算。它必须等于每个块组中定义的块的总和。