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