For Consistency

For Consistency

2024 南京大学《操作系统:设计与实现》
For Consistency

崩溃一致性 (Crash Consistency)

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).

center

(你们平时编程时假设不会发生的事,操作系统都要给你兜底)
2024 南京大学《操作系统:设计与实现》
For Consistency

Recap: 文件系统的实现

磁盘上的数据结构

center

  • 为吞吐量优化
    • 配合 “按块读写”,而不是 “Random Access”
  • 数据结构更关注局部性
    • 临近的信息紧凑地排列在一起
2024 南京大学《操作系统:设计与实现》
For Consistency

实现崩溃一致性

磁盘:提供的接口

  • bwrite
  • bread
    • 并不提供多块读写 “all or nothing” 的支持
    • 甚至为了性能,没有顺序保证
      • bwrite 可能被乱序
  • bflush 等待已写入的数据落盘
    • 即便是 vSSD,也没有实现 crash consistency
    • (例子)
2024 南京大学《操作系统:设计与实现》
For Consistency

File System Checking (FSCK)

根据磁盘上已有的信息,恢复出 “最可能” 的数据结构

center

  • SQCK: A declarative file system checker (OSDI'08)
  • 然而 (FAST'18): “widely used file systems (EXT4, XFS, BtrFS, and F2FS) may leave the file system in an uncorrectable state if the repair procedure is interrupted unexpectedly” 😂
2024 南京大学《操作系统:设计与实现》
For Consistency

实现崩溃一致性

我们需要一个更可靠的方法

  • 只要磁盘不坏,断电就不会有数据损坏

难实现的根本原因

  • 存储设备不提供多次写入的原子性
    • bwrite(inode)
    • bwrite(d-bitmap)
    • bwrite(data)
2024 南京大学《操作系统:设计与实现》
For Consistency

重新理解 “数据结构”

视角 1: 存储实际数据结构 (链表、二叉树、……)

  • 文件系统的 “直观” 表示
  • crash unsafe

视角 2: Append-only 记录所有历史操作

  • “重做” 所有操作得到数据结构的当前状态
  • 容易实现崩溃一致性

Jouraling = 1 + 2

  • 先用 append-only 记录日志,等待落盘,再更新数据结构
2024 南京大学《操作系统:设计与实现》
For Consistency

实现 Atomic Append

用 bread, bwrite 和 bflush 实现 append()

center

  1. 定位到 journal 的末尾 (bread)
  2. bwrite TXBegin 和所有数据结构操作
  3. bflush 等待数据落盘
  4. bwrite TXEnd
  5. bflush 等待数据落盘
  6. 将数据结构操作写入实际数据结构区域
  7. 等待数据落盘后,删除 (标记) 日志
2024 南京大学《操作系统:设计与实现》
For Consistency

Journaling: 优化

现在磁盘需要写入双份的数据

  • 批处理 (xv6; jbd)
    • 多次系统调用的 Tx 合并成一个,减少 log 的大小
    • jbd: 定期 write back
  • Checksum (ext4)
    • 不再标记 TxBegin/TxEnd
    • 直接标记 Tx 的长度和 checksum
  • Metadata journaling (ext4 default)
    • 数据占磁盘写入的绝大部分
      • 只对 inode 和 bitmap 做 journaling 可以提高性能
    • 保证文件系统的目录结构是一致的;但数据可能丢失
2024 南京大学《操作系统:设计与实现》
For Consistency

Metadata Journaling 🌶️

从应用视角来看,文件系统的行为可能很怪异

更为一劳永逸的方案:TxOS

  • xbegin/xend/xabort 系统调用实现跨 syscall 的 “all-or-nothing”
    • 应用场景:数据更新、软件更新、check-use……
2024 南京大学《操作系统:设计与实现》