GDT
= Group Descriptor Table
; GD
= Group Descriptor
。我试图弄清楚在超级块之后我需要读取多少字节才能提取整个GDT
,因为我正在编写的程序需要它。众所周知,每个 都是GD
,64B
并且每个块组都应该有 GD
,但是由于存在特殊标志(例如flex_bg
或sparse_super
或meta_bg
),这将使 少于GD
应有的长度。在这种情况下,我应该如何知道 的长度GDT
?
GDT
= Group Descriptor Table
; GD
= Group Descriptor
。我试图弄清楚在超级块之后我需要读取多少字节才能提取整个GDT
,因为我正在编写的程序需要它。众所周知,每个 都是GD
,64B
并且每个块组都应该有 GD
,但是由于存在特殊标志(例如flex_bg
或sparse_super
或meta_bg
),这将使 少于GD
应有的长度。在这种情况下,我应该如何知道 的长度GDT
?
为什么不使用作为 e2fsprogs 的一部分提供的 libext2fs 库?这实际上是访问 ext2/ext3/ext4 文件系统的最佳方式,因为它受到上游的支持,由支持 ext4 Linux kenel 代码的同一批开发人员提供支持。
回答您的问题,从历史上看,单个块组描述符的大小为 32 字节。如果设置了 INCOPAT_64BIT 功能标志,则单个块组描述符的大小由 ext4 超级块中的 s_desc_size 字段定义。实际上,至少在今天,即撰写本文时的 2025 年,如果设置了 64BIT 功能标志,s_desc_size 将为 64。而今天,如果 s_desc_size 小于 32 字节,或大于 64 字节,或不是 2 的幂,则文件系统将被视为已损坏。但在将来,可能会有 bean 扩展会增加块组描述符的大小。这只有在定义和设置一些新的不兼容功能标志时才会发生,但这就是最好使用 libext2fs 的原因。如果我们扩展文件系统格式,则 libext2fs 的新版本将更新以支持新的文件系统功能。如果您自行处理,(a) 您可能会出错,并且 (b) 您可能会遇到未来的兼容性问题。
现在,块组描述符的大小基于块组数乘以块组描述符的大小,四舍五入为文件系统块大小。块组数可以通过将文件系统中的块数(可在超级块中找到)除以块组中的块数(也可在超级块中找到)四舍五入为下一个整数值来计算。对于什么是合法值和什么不是合法值存在各种限制,但这就是您应该使用 libext2fs 的原因。
sparse_super 和 sparse_super2 等功能与块组描述符或块组描述符表的大小无关。它只与哪些块组包含超级块的备份有关。