ext3的代码已经在v4.3被删除掉了(ARM: tegra: Rebuild default configuration on v4.3-rc1 · torvalds/linux@241e077 · GitHub)?
ext4格式化的代码可以参考e2fsprogs的实现:mke2fs.c
格式化后的文件系统结构如下图:
如果支持flexible group功能,默认可将16个group打包为一个flexible group。
每个group 都有四个主要区域:
其中前三部分是元数据,元数据在 flexible 模式下有两种布局方式:
当元数据占用达到一个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上。
ext4将block打包成了cluster(默认16个block 为一个cluster),在分配块时,以cluster为最小单位去分配。格式化过程中会先在内存中存一个 block bitmap,?以block为最小单位去分配块,在分配完block/inode bitmap和inode table 后,会将bitmap将为以 cluster 为单位,存到磁盘上。
初始文件至少有root 和 lost_and_found目录,其它:
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