文件系统 = 把设备抽象成目录树
如何实现
RAID: Redundant Array of Inexpensive Disks
崩溃一致性
任何物理存储介质都有失效的可能
Redundant Array of Inexpensive (Independent) Disks (RAID)
类比我们见过的虚拟化
RAID 的虚拟化是 “反向” 的
磁盘可能在某个时刻忽然彻底无法访问 (数据好像完全消失)。
你还敢用这个硬盘做 {教务系统, 支付宝, 银行, …} 吗?
假设我愿意在系统里多接入一块硬盘用于容灾
假设内存带宽远高于磁盘带宽
RAID (虚拟化) = 虚拟磁盘块到物理磁盘块的 “映射”。
RAID-0: 把多块盘 “交替拼接”
RAID-1 (镜像)
RAID: 允许 “多对多” 的映射 (一组映射称为 “条带”, stripe)
RAID-10
另一种可能的方式
$(V_0, V_1, V_2) \to (A_0, B_0, C_0, D_0)$
专门留一块磁盘作为奇偶校验盘。
性能分析
“交错排列” parity block!
让每一块盘都有均等的机会存储 parity
更快、更可靠、近乎免费的大容量磁盘
RAID 的可靠性
磁盘并没有故障
文件系统:设备上的树结构
Crash Consistency: Move the file system from one consistent state (e.g., before the file got appended to) to another atomically (e.g., after the inode, bitmap, and new data block have been written to disk).
导致崩溃一致性的原因
考虑追加写入一个数据块,磁盘上数据结构的更新
根据磁盘上已有的信息,恢复出 “最可能” 的数据结构
刚才的哪些情况可以由 fsck 修复?
在发生不一致时,“到底什么是对的”?
fsck 也是程序,fsck 也要访问文件系统
针对 crash,我们需要更可靠的方法我们需要一个更可靠的方法
能否在磁盘 API 上实现可靠的 multi-write 原子性?
数据结构有两种实现方法
小孩子才做选择,我文件系统全都要!
主要维护文件系统的结构,但预留一定的 journal 区域
现在磁盘需要写入双份的数据
从应用视角来看,文件系统的行为可能很怪异
TxOS: 提供三个新的系统调用
本次课内容与目标
Takeaway messages