了解Ext-2文件系统:第1章
每个Ext2分区中的第一个块都不由Ext2文件系统管理,
因为它是为分区引导扇区保留的。
Ext2分区的其余部分分为多个块组,
每个布局都如图2所示。
从图中您会注意到,某些数据结构必须恰好位于一个块中,
而其他的则可能需要多个障碍。
文件系统中的所有块组具有相同的大小,并按顺序存储,
因此,内核可以简单地从其整数索引中得出块组在磁盘中的位置。
ext2分区。
| 引导块| 块组0 | -----| 第n组
单个ext2块组。
| 超级街区 组描述符| 数据块位图| Inode位图| 索引表| 数据块|
如您所见,超级块和组描述符在每个块组中重复。
这样做是因为要保持冗余。 如果发生任何崩溃,我们可以轻松地更换超级块
和其他分区的组描述符。
在本文中,我们将从编程的角度讨论超级块。
我们将看到如何读取超级块。
当然,有一个名为libext2fs的库可以很容易地为我们提供上述所有数据结构。
但是不要忘了本文的标题,我们将了解ext2内部的内容。
在其他文档中,我还将探讨其他数据结构。
Ext2磁盘超级块存储在ext2_super_block结构中,其字段在下面列出
s_inodes_count:索引节点总数
s_blocks_count:文件系统大小(以块为单位)
s_r_blocks_count:保留块数
s_free_blocks_count:可用块计数器
s_free_inodes_count:可用的inode计数器
s_first_data_block:第一个有用块的数量(总是1)
s_log_block_size:块大小
s_log_frag_size:片段大小
s_blocks_per_group:每组的块数
s_frags_per_group:每组的片段数
s_inodes_per_group:每组的索引节点数
s_mtime:上次安装操作的时间
s_wtime:上次写入操作的时间
s_mnt_count:挂载操作计数器
s_max_mnt_count:检查之前的安装操作数
s_magic:魔术签名
s_state:状态标志
s_errors:检测错误时的行为
s_minor_rev_level:次要修订级别
s_lastcheck:上次检查时间
s_checkinterval:检查之间的时间
s_creator_os:创建文件系统的操作系统
s_rev_level:文件系统的修订级别
s_def_resuid:保留块的默认UID
s_def_resgid:保留块的默认用户组ID
s_first_ino:第一个非保留索引节点的数量
s_inode_size:磁盘上inode结构的大小
s_block_group_nr:此超级块的块组号
s_feature_compat:兼容功能位图
s_feature_incompat:不兼容的功能位图
s_feature_ro_compat:只读兼容功能位图
s_uuid:128位文件系统标识符
s_volume_name:卷名
s_last_mount:上一个安装点的路径名
s_algorithm_usage_bitmap:用于压缩
s_prealloc_blocks:要预分配的块数
s_prealloc_dir_blocks:要为目录预分配的块数
s_padding1:与单词对齐
s_reserved:空出1,024字节
很小的结构不是吗?
现在,我们将看到访问超级块的代码。
#include<linux/ext2_fs.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<stdlib.h>
#include<string.h>
#define boot_block_size 1024
int main()
{
char *buff = (char *)malloc(sizeof(struct ext2_super_block));
struct ext2_super_block * sblock = (struct ext2_super_block *)malloc(sizeof(struct ext2_super_block));
//open any partition for testing,must be ext2/ext3.
int fd = open("/dev/hda3",O_RDONLY);
//skip the boot block
lseek(fd,boot_block_size,SEEK_CUR);
//read the superblock raw data from disk to buff
read(fd,buff,sizeof(struct ext2_super_block));
//copy buffer to sblock, you can use casting or union for this.
memcpy((void *)sblock,(void *)buff,sizeof(struct ext2_super_block));
printf("\nmagic number:%u\n",sblock->s_magic);
close(fd);
return 0;
}
如果您得到的幻数为61267。则您成功读取了超级块。
我将在下一篇文章中向您展示如何读取组描述符
From: https://bytes.com/topic/unix/insights/771405-understanding-ext-2-file-system-chapter-1-a