linux ext3/ext4文件系统(part1格式化)
ext4文件系统结构
ext3的代码已经在v4.3被删除掉了(ARM: tegra: Rebuild default configuration on v4.3-rc1 · torvalds/linux@241e077 · GitHub)
ext4格式化的代码可以参考e2fsprogs的实现:mke2fs.c
格式化后的文件系统结构如下图:
flexible group
如果支持flexible group功能,默认可将16个group打包为一个flexible group。
每个group 都有四个主要区域:
- block bitmap
- inode bitmap
- inode table
- data
其中前三部分是元数据,元数据在 flexible 模式下有两种布局方式:
- 一种是全部放在第一个flexible group的第一个group上。
- 另一种是每个flexible group中第一个group上存放这个flexible group 的元数据
当元数据占用达到一个group的四分之三时,会将这个group的全部作为元数据存储,称meta_group。
如果不启用flexible,则每个group维护自己的元数据(参考:linux 中 ext2文件系统实现)
group 中块数在256~8*block_size之间,默认8 * block_size(比如一块4096大小的话,一个group有32k个block)。
元数据备份
ext2支持为0、1、3/5/7的n次方块加入super block 与group desc block的备份 (参考:linux 中 ext2文件系统实现)。ext4将这标记成了deprecated。如果开启备份,则只备份一份,默认备份在最后一个group上。
block cluster
ext4将block打包成了cluster(默认16个block 为一个cluster),在分配块时,以cluster为最小单位去分配。格式化过程中会先在内存中存一个 block bitmap, 以block为最小单位去分配块,在分配完block/inode bitmap和inode table 后,会将bitmap将为以 cluster 为单位,存到磁盘上。
初始文件
初始文件至少有root 和 lost_and_found目录,其它:
- 如果有bad block,会将bad block 的位置以数组形式存到bad block inode上
- 如果启用日志功能,则生成日志文件,它包含了fast commit 日志和普通的日志(fast commit 记录更精练,是一种优化的日志,具体实现还没有看,参考:LWN: ext4 文件系统的快速提交!-CSDN博客)两部分日志的大小的和限制在1k-10m个block之间。
- 如果启用orphan file 功能(删除文件时,先将inode记入orphan file,在inode的data块完全释放后才将inode从orphan file移除,防止系统崩溃后文件删除了,但内容块没有回收的情况),创建orphan file 它的大小在32-512个block之间(总块数除以4k)。
e2fsprogs对ext4格式化的实现
main():
// 1、解析用户参数,有些参数从profile读
PRS(argc, argv):
blocksize:1024~65536之间
block per group:默认8 * block_size块
inodes_count:默认第8192字节对应一个inode
meta group:是否指定了完全存元数据的 group
num_backups: super + group desc 的备份group号,默认是1号和最后一个group
cluster_size:默认16个block
// 2、计算参数
ext2fs_initialize():
计算 s_clusters_per_group
计算 desc_blocks:每个group一个desc
计算 s_inodes_count 默认平均4096byte一个inode
计算 s_inodes_per_group
计算 s_reserved_gdt_blocks:为以后扩展ext4大小预留的group desc,预计filesystem大小可以增长到1024倍
group desc block 大于3/4的group时,启用meta block group,并 s_reserved_gdt_blocks为0
最后一个group要装备份super + group desc block,如是太小,要删掉最后一个group重算上面的参数
在分配内存记录格式化占用的block,此时的block bitmap单位是block,不是cluster
分配其它内存,比如inode bitmap,group desc
3、检测标记坏块,并标记在block bitmap上
4、分配block bitmap、 inode bitmap、 inode table,有两种模式packed/unpacked(packed_allocate_tables、ext2fs_allocate_tables)
5、将block bitmap 转为以cluster 为单位的bitmap
6、分配inode初始文件
root lost_and_found
标记reserve inode
创建bad block inode 记录哪些块不能用
添加journal inode 占用1k-10m个块之间
添加orphan file 最多32-512个block