背景 链接到标题 在平时会遇到不少系统崩溃之后文件系统异常的情况,通常我们会通过 fsck 工具进行修复,今天来了解下 fsck 做了什么,是怎么做的。
工作负载示例 链接到标题 假设现在存在一种工作负载,将单个数据块附加到原有文件。通过打开文件,调用 lseek() 将文件偏移量移动到文件末尾,然后在关闭文件之前,向文件发出单个 4KB 写入来完成追加。
假定磁盘上使用标准的简单文件系统结构,包括一个 inode 位图(inode bitmap,只有 8 位,每个 inode 一个),一个数据位图(databitmap,也是 8 位,每个数据块一个),inode(总共 8 个,编号为 0 到 7,分布在 4 个块上),以及数据块(总共 8 个,编号为 0~7)。以下是该文件系统的示意图:
查看图中的结构,可以看到分配了一个 inode(inode 号为 2),它在 inode 位图中标记,单个分配的数据块(数据块 4)也在数据中标记位图。inode 表示为 I [v1],因为它是此 inode 的第一个版本。它将很快更新(由于上述工作负载)。再来看看这个简化的 inode。在 I[v1]中,可以看到:
owner : remzi permissions : read-write size : 1 pointer : 4 pointer : null pointer : null pointer : null 在这个简化的 inode 中,文件的大小为 1(它有一个块位于其中),第一个直接指针指向块 4(文件的第一个数据块,Da),并且所有其他 3 个直接指针都被设置为 null(表示它们未被使用)。当然,真正的 inode 有更多的字段。