Linux内核文件系统-ext2文件系统-调试ext2磁盘布局

建议点击这里查看个人主页上的最新原文

一般的Linux书籍都是先讲解进程和内存相关的知识,但我想先讲解文件系统。

第一,因为我就是做文件系统的,更擅长这一块,其他模块的内容我还要再去好好看看书,毕竟不能误人子弟嘛;第二,是

因为文件系统模块更接近于用户态,是相对比较好理解的内容(当然想深入还是要下大功夫的),由文件系统入手比较适合初学者。

英文全称Extended file system,翻译为扩展文件系统。Linux内核最开始用的是minix文件系统,直到1992年4月,Rémy Card开发了ext文件系统,采用Unix文件系统(UFS)的元数据结构,在linux内核0.96c版中引入。设计上参考了BSD的快速文件系统(Fast File System,简称FFS)。1993年1月0.99版本中ext2合入内核, 2001年11月2.4.15版本中ext3合入内核,2006年10月10日2.6.19版本中ext4合入内核。

相关文档网站:

mkfs.ext2 /dev/sda相当于mke2fs -t 2 -b 1024 -m 5,块大小默认1024字节,保留块百分比默认5%,每8192字节设置一个索引节点,lost+found目录放丢失和找到的缺陷块。

我们举个例子,一个比较小的磁盘(也可以打开内核配置CONFIG_BLK_DEV_LOOP然后对文件执行同样的操作),执行完以下命令:

mkfs.ext2 -F /dev/sda # 8412KB大小
dd if=/dev/sda of=image bs=1K count=8412
vim image # 然后输入 :%!xxd,当然也可以使用其他编辑器打开查看二进制数据

其中执行mkfs.ext2输出以下日志:

mke2fs 1.46.2 (28-Feb-2021)
Discarding device blocks: done                            
Creating filesystem with 8412 1k blocks and 2112 inodes
Filesystem UUID: 13b5577a-898c-40e5-a9e6-c0a0dd2b8ab6
Superblock backups stored on blocks: 
        8193

Allocating group tables: done                            
Writing inode tables: done                            
Writing superblocks and filesystem accounting information: done

通过debugfs image,然后输入stats查看到有2个块组(如果磁盘大小减小成8411KB,则只用1个块组):

Filesystem volume name:   <none>
Last mounted on:          <not available>
Filesystem UUID:          13b5577a-898c-40e5-a9e6-c0a0dd2b8ab6
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      ext_attr resize_inode dir_index filetype sparse_super large_file
Filesystem flags:         signed_directory_hash 
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              2112
Block count:              8412
Reserved block count:     420
Overhead clusters:        337
Free blocks:              8061
Free inodes:              2101
First block:              1
Block size:               1024
Fragment size:            1024
Reserved GDT blocks:      32
Blocks per group:         8192
Fragments per group:      8192
Inodes per group:         1056
Inode blocks per group:   132
Filesystem created:       Thu May 23 12:50:34 2024
Last mount time:          n/a
Last write time:          Thu May 23 12:50:34 2024
Mount count:              0
Maximum mount count:      -1
Last checked:             Thu May 23 12:50:34 2024
Check interval:           0 (<none>)
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               128
Default directory hash:   half_md4
Directory Hash Seed:      2ac788a5-17e7-49f1-9b94-4ca6c9397d55
Directories:              2
 Group  0: block bitmap at 35, inode bitmap at 36, inode table at 37
           8010 free blocks, 1045 free inodes, 2 used directories
 Group  1: block bitmap at 8227, inode bitmap at 8228, inode table at 8229
           51 free blocks, 1056 free inodes, 0 used directories

默认1个块大小1024(0x400)字节,每个块的内容如下:

  • 第0个块: 0~0x400为引导块(启动块)
  • 第1个块: 0x400~0x800为超级块(gdb打印p sizeof(struct ext2_super_block)的值为1024),超级块固定1个块
    • 0x400地址为s_inodes_count成员,值为0x840(2112),注意是小端模式存储的
    • 0x438地址的值为EXT2_SUPER_MAGIC,是s_magic成员的值,偏移量可以用gdb命令p &((struct ext2_super_block *)0)->s_magic查看
    • 其他字段的值请自行实践查看
  • 第2个块: 0x800~0xc00,两个块组描述符,一个块组描述符32字节,每个块组中含有全部块组的块组描述符,如果超过32个块组(32*32=1024),组描述符就不只一个块。和超级块一样,块组描述符也是只存储到块组0、1、3、5、7、9、25、49…
    • 第一个ext2_group_descbg_block_bitmap的值为35(0x23)
  • 第35个块: 0x8c00~0x9000为数据块位图
  • 第36个块: 0x9000~0x9400为索引节点位图
  • 第37~164个块: 0x9400~0x29400为inode表,inode表占128个块(1024inode
    • 0x9900lost+found文件的ext2_inode0x9928i_block[](值为0xaa),数据块的地址为0xaa*1024=0x2a800,也就是...两个隐藏的文件夹
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值