参考文献:The Second Extended File System Internal Layout, Dave Poirier
0.前言
ext234使用block作为基本的存储单元,使用inodes来跟踪file和system object,从逻辑上
把磁盘更容易管理的block group,使用directory来为file提供一个层次组织,使用
block bitmap和inode bitmap来跟踪block和inode的分配,使用superblock来定义文件系统
的参数和状态。
1.定义
1.1.block
block: 一个分区,磁盘,文件或块设备被格式化成ext234时,都会被分成一些小扇区组。
block group: 这些block组成更大一点的单元。
block的大小通常在格式化时指定的,并且这个大小会影响性能,一个文件最大值,一个
文件系统的最大容量。block大小通常有1KB,2KB,4KB,8KB等,但是superblock中允许
最大值为1024*(2^31)-1,实际上block大小是由superblock中的s_log_block_size确定
的。
block大小的影响
+-----------------------+--------+---------+----------+----------+
|Upper Limits |1KB |2KB |4KB |8KB |
+-----------------------+--------+---------+----------+----------+
|file system blocks |2^31-1 |2^31-1 |2^31-1 |2^31-1 |
+-----------------------+--------+---------+----------+----------+
|blocks per block group |1024*8 |2048*8 |4096*8 |8192*8 |
+-----------------------+--------+---------+----------+----------+
|inodes per block group |1024*8 |2048*8 |4096*8 |8192*8 |
+-----------------------+--------+---------+----------+----------+
|bytes per block group |8MB |32MB |128MB |512MB |
+-----------------------+--------+---------+----------+----------+
|file system size(real) |4TB |8TB |16TB |32TB |
+-----------------------+--------+---------+----------+----------+
|file system size(Linux)|2TB |8TB |16TB |32TB |
+-----------------------+--------+---------+----------+----------+
|blocks per file |16843020|134217728|1074791436|8594130956|
+-----------------------+--------+---------+----------+----------+
|file size(real) |16GB |256GB |2TB |2TB |
+-----------------------+--------+---------+----------+----------+
|file size(Linux2.6.28) |16GB |256GB |2TB |2TB |
+-----------------------+--------+---------+----------+----------+
1.2.block group
把block集中组成block group,这是为了降低fragmentation(碎片),最小化
磁头寻址时间(当读一个大而连续的文件时)。每个block group的信息都是保
存在superblock之后的叫descriptor table的block中。紧挨着descriptor
table的两个block用来保存block usage bitmap和inode usage bitmap。
注意:每种bitmap都是被限制在一个block中,这就意味着block group的
最大block数量为8*block大小。
紧挨着bitmap的block被指定为inode table,为了block group和剩余的
data block。block分配算法尝试在相同的block group中分配data block。
1.3.directory
一个directory是一个filesystem object,它像file一样有inode,它是一种特殊格式的
file,只不过其file内容是filename和对应的inode号的记录。后来的filesystem里把对象
(file, directory, symlink, device, fifo, socket)的类型放到directory中,这样就
避免为了这些信息去检查inode本身。
inode的分配算法尽量在相同的block group中分配inode。比较原始的ext2版本使用单链表
来在directory中保存filename,而较新的版本里使用hash和binary tree来保存filename。
also note that as directory grows additional blocks are assigned to store the
additional file records. when filename are removed, some implementations do not
free these additional blocks.