如果我理解正确的话,“fsck”在 UNIX 系统中用于在发生崩溃后检查磁盘内的内部一致性。那么,我想知道它如何使用“元数据”来确保文件系统中的所有内容都是一致的,例如 fsck 进程需要采取哪些步骤才能恢复和修复?
-> 编辑:如果有人能澄清这张图片中的“同步直写”指的是什么,也会很有帮助。
答案1
元数据是关于数据的信息。如果您考虑一个文本文件,那么该文本文件的字母序列就是该文件包含的实际数据。然而,文件有名称、所有者、创建日期、存储介质上的位置等。所有这些信息都是元数据。请注意,元数据的处理方式与数据相同。例如,Unix 将文件元数据存储在称为目录的数据文件中(或在这个新计算时代中的文件夹:-)
Unix 文件系统使用一个基本的存储单元,称为索引节点。单个索引节点可以包含实际文件数据、目录信息(元数据),也可以不使用(免费)。请注意,创建新文件的操作涉及将 inode 的状态从空闲更改为已分配、将数据写入新文件以及将元数据写入目录文件。计算机有可能在此类操作中崩溃,在这种情况下,文件系统可以损坏。
文件系统检查包括读取所有索引节点并尝试解决尽可能多的损坏问题。例如,假设某个 inode 不在空闲 inode 列表中,但没有目录条目表明该 inode 是文件系统知道的任何目录中的文件的一部分。该索引节点可以放回空闲索引节点列表中。
同步直写是一种执行磁盘写入的方式,确保在发生崩溃时文件系统可以恢复。例如,当您创建新文件时,需要分配一个索引节点,使用其元数据集创建索引节点,然后更新包含目录信息的文件。和同步直写,这些都是作为单独的操作完成的,一次一个,按顺序进行。如果崩溃发生在写入目录之前,则可以将索引节点放回到空闲列表中,并且不会发生文件创建。
其他类型的文件系统检查也是可能的。
答案2
在 Unix 或 Linux 文件系统的上下文中,“元数据”是有关文件的信息:拥有该文件的用户 ID、权限、文件类型(特殊、常规、命名管道等)以及文件使用的磁盘块。这些通常都保存在称为“inode”的磁盘结构中。索引节点中的信息之一是存在多少个到该文件的“链接”。常规文件通常有 1 个链接,但目录(主要是带有特殊“我是目录”文件类型标记的文件)至少有 2 个链接。文件系统中可见的所有内容都与其所在目录有一个链接,但由于每个目录都有一个“.”。名称及其普通名称,它们有 2 个链接。
fsck
可以扫描文件系统的“inode 块”(包含 inode 数据结构的磁盘块)以查找链接计数大于 0 的 inode。由链接计数大于 0 的 inode 表示的文件应该出现在目录某处。如果该 inode 没有出现在目录中,则fsck
将该文件放入众所周知的目录中,通常是文件系统顶部的“lost+found”。请注意,Unix/Linux 文件系统通常在 inode 中没有任何关于该 inode 属于哪个目录的元数据,只有目录文件中关于该目录包含哪些文件的信息。
fsck
可以使用其他元数据,例如哪些磁盘块包含文件的数据。fsck
可以检查索引节点表示属于文件的磁盘块是否出现在文件系统的磁盘块的“未分配列表”中。可能fsck
会检查两个或多个索引节点是否包含相同的磁盘块,这将表明某种多重分配损坏。
磁盘块到文件的分配显示在磁盘 inode 中。文件系统的目录成员树结构出现在目录中。索引节点不会出现,也不会分配给目录。fsck
利用这种分离来进行维修。这与 MS-DOS 或早期 Windows 等系统有很大不同,在这些系统中,“文件分配表”同时保存树结构(目录成员身份)和磁盘块分配。如果损坏了“FAT”,您就必须扫描磁盘块以查看它们包含的内容以及它们如何组合在一起。
答案3
元数据是“关于数据的数据”。
在 *nix 文件系统的情况下,fsck
每个数据块上的标头使用的元数据指向目录条目或下一个数据块以及目录中的相应条目。fsck
扫描块并检查目录条目是否匹配以及指向下一个块的前向指针是否正确。
这在文件系统之间差异很大。事实上,存储什么元数据以及存储在何处是各种 *nix 文件系统的最大区别。更现代的还保留目录结构更改的日志文件。