了解Ext-2文件系统:第1章

了解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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值