参考资料:
linux之EXT2文件系统--理解block/block group/索引结点inode/索引位图_一个块组中索引节点表和数据块区最多占用字节-CSDN博客
linux环境:
Linux version 5.15.146.1-microsoft-standard-WSL2 (root@65c757a075e2) (gcc (GCC) 11.2.0, GNU ld (GNU Binutils) 2.37) #1 SMP Thu Jan 11 04:09:03 UTC 2024
创建文件系统
mke2fs -b 2048 vdisk 1000 # 创建ext2文件系统,含有1000个大小为2048字节的块
读取超级块的信息
typedef struct ext2_super_block SUPER; // 在<ext2fs/ext2_fs.h>头文件中,有这个结构体ext2_super_block
SUPER* sp; // 定义一个超级块的结构体指针
char buf[1024];// 保存超级块的数据
char* device = "vdisk"; // 文件系统名称
fd = open(device, O_RDONLY); //打开
lseek(fd, (long)1024*1, SEEK_SET); // 指针偏移到1024字节处
read(fd, buf, 1024); // 读出1024字节,存到buf中
sp = (SUPER *)buf; // 解析成超级块结构体
printf("%-30s = %8d\n", "块大小", sp->s_log_block_size); // 根据文章开头的命令,应该为2048
printf("%-30s = %8d\n", "块的数量", sp->s_blocks_count); // 根据文章开头的命令,应该为1000
超级块的结构体,大小固定为1024字节
==》 引导块 | 超级块 | 组描述块 | 保留 | 块位图 | 索引节点位图 | 数据块
其中引导块与超级块,大小都为1024字节 (与块大小2048无关)
组描述块的起始位置(块号),是不定的,由超级块的 (s_first_data_blcok+1)确定
为什么是不定的?
如果块大小1024,则引导块是0,超级块是1,组描述块是2
如果块大小2048,则引导块和超级块是0(正好占满一个块),组描述块是1
如果块大小4096,则引导块和超级块是0(只占了半个块,剩下的部分补0),组描述块是1
目录条目
需要补充的是,name以4字节为一个单位进行对齐。若文件名是A,仅一个字节,实际上name[]的大小是4字节,用0填充