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