ostep阅读笔记:单机fs的崩溃一致性(chapter42-44)
· 10 min read
chapter 42 崩溃一致性
以一个传统的结构(linux ext2)为例子
一个磁盘group
inode bitmap | data bitmap | inode block | data block
磁盘映像
super | group0 | group1 | …
想要给一个文件追加一个block,需要改inode block, data bitmap 和 data block 3处
设想中途断电,硬件原子性在磁盘上是不好做的,所以可能在三个写入之中发生任意个写入落盘的情况
断电时已经修改的数据和后果的对应:
- inode block, 元数据不一致,指向垃圾数据
- data bitmap,元数据不一致,空间泄露
- data block, 没关系
- inode block + data bitmap, 文件是乱码,问题不大
- inode block + data block,元数据不一致
- data bitmap + data block, 元数据不一致,空间泄露
早期文件系统:fsck,让不一致发生,重启时修复,只确保元数据一致
- 检查super block(发现系统大小小于分配块数等不健全的情况,可以考虑启用super block的备用副本来防止super block自身损坏)
- 空闲块:inode, 间接块,以inode为参考, 修改inode bitmap达到一致, 所有看起来在用的inode都会有bitmap标记
- inode状态:如果inode的字段不合法,认为不易修复,删掉这个inode
- inode链接:扫描整个目录树,重新计算引用计数,如果找到已经分配的inode但没有目录引用,放到lost+found
- 重复和坏块,清除不正确的指针
- 目录检查:确保无环,目录中每个inode已分配等
磁盘清理工具:重排inode的data block来减少碎片
fsck 存在的一个问题:很复杂
fsck 最关键的问 题:太慢了!
另外的方法:WAL
Linux ext34, Windows NTFS 采用的方法: 加上journal block
super | **journal** | group0 | group1 | …
journal中条目的形式:
TxB | inode | bitmap | data | TxE (物理日志,也有逻辑日志的做法,可能提高性能,节省空间)
checkpoint: 成功写入journal之后,就是一个checkpoint
先写WAL, 再写文件系统元数据,最后落盘data
问题:写日志的时候崩溃?
问题发生在,一条日志(以物理为例)可能太大,以至于不能被原子写入(常态)
- 日志内的数据可以被磁盘调度为小块乱序写入
- 写入的部分错误难以检查,例如在写入data段的时候出错,但其他部分正确(但也可以checksum? 这就是ext4的一项重要更新,通过在TxB和TxE之中包含checksum来加快写入速度)
- 磁盘的