- 作者: 陈孝松
- 主页: chenxiaosong.com
- 哔哩哔哩教学视频: 陈孝松
- 课程: chenxiaosong.com/courses
- 博客: chenxiaosong.com/blog
- 贡献: chenxiaosong.com/contributions
- 邮箱: chenxiaosong@chenxiaosong.com
- QQ交流群: 544216206, 点击查看群介绍
一般的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_desc
,bg_block_bitmap
的值为35(0x23)
- 第一个
- 第35个块:
0x8c00~0x9000
为数据块位图 - 第36个块:
0x9000~0x9400
为索引节点位图 - 第37~164个块:
0x9400~0x29400
为inode表,inode表占128
个块(1024
个inode
)0x9900
为lost+found
文件的ext2_inode
,0x9928
为i_block[]
(值为0xaa
),数据块的地址为0xaa*1024=0x2a800
,也就是.
和..
两个隐藏的文件夹