基于文件构建Ext2文件系统

115 阅读2分钟

1.生成一个全0的二进制文件

$ dd if=/dev/zero of=./ext2.bin bs=1M count=100

2.格式化ext2文件系统

$ mkfs.ext2 ext2.bin

3.使用loop设备,仿真块设备,块设备名为/dev/loop10

$ losetup /dev/loop10 ./ext2.bin

4.创建文件夹路径,挂载文件系统

$ mkdir /tmp/ext2/

$ mount /dev/loop10 /tmp/ext2/

完成挂载后就可以访问文件系统.如在里面创建文件和目录等

5.查看磁盘设备

$ df -h

/dev/loop10      97M   48K   92M   1% /tmp/ext2

6.获取该文件系统的块组信息

$ dumpe2fs /dev/loop10

dumpe2fs 1.45.5 (07-Jan-2020)
Filesystem volume name:   <none>
Last mounted on:          /tmp/ext2
Filesystem UUID:          5c29b959-b136-4e43-a825-3991e891e317
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:         not clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              25600
Block count:              25600
Reserved block count:     1280
Free blocks:              24784
Free inodes:              25589
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      6
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         25600
Inode blocks per group:   800
Filesystem created:       Tue Aug 23 11:45:43 2022
Last mount time:          Tue Aug 23 11:48:37 2022
Last write time:          Tue Aug 23 11:48:37 2022
Mount count:              1
Maximum mount count:      -1
Last checked:             Tue Aug 23 11:45:43 2022
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:      f8eaf219-40ac-47e7-a890-b14c6c06acc3


Group 0: (Blocks 0-25599)
  Primary superblock at 0, Group descriptors at 1-1
  Reserved GDT blocks at 2-7
  Block bitmap at 8 (+8)
  Inode bitmap at 9 (+9)
  Inode table at 10-809 (+10)
  24784 free blocks, 25589 free inodes, 2 directories
  Free blocks: 816-25599
  Free inodes: 12-25600

可用看到我们刚创建的文件系统只有一个超级块,没有普通块组

块组描述符的结构体

fs/ext2/ext2.h

struct ext2_group_desc{
    __le32 bg_block_bitmap; //数据块位图的位置
    __le32 bg_inode_bitmap; // inode位图的位置
    __le32 bg_inode_table; // inode表的位置
    __le32 bg_free_blocks_count; // 剩余可用块的数量
    __le32 bg_free_inodes_count; // 剩余可用inode的数量    __le32 bg_used_dirs_count; // 目录的数量
    __le32 bg_pad; 
    __le32 bg_reserved[3]; 
}

7.查看文件的十六进制编码

用hexdump可用查看文件ext2.bin的编码是如何的

  • hexdump [选项] [文件]…

  • 选项

    • -n length:格式化输出文件的前length个字节
    • -C:输出规范的十六进制和ASCII码
    • -b:单字节八进制显示
    • -c:单字节字符显示
    • -d:双字节十进制显示
    • -o:双字节八进制显示
    • -x:双字节十六进制显示
    • -s:从偏移量开始输出