1. 简单介绍
使用Window每次非正常退出系统都会招来scandisk的一顿狂扫;Linux也不例外,只不过它调用的是fsck程序来检查文件系统。作为一名系统管理员,当你发现文件系统发生故障时,你会怎么做?当然是手动地执行fsck来检查文件系统。所以本文就是教大家如何正确地使用并且使用好fsck工具的。
2. 文件系统
2.1. 超级数据块(Superblock)
一个文件系统总是由它的superblock来定义的,所以创建文件系统的同时superblock也被创建。它包含了文件系统的一些基本参数,例如文件系统中的数据块(data blocks)数和最大文件数等等。因为superblock包含了一些临界数据,以便于进行灾难性的恢复。缺省的superblock总是固定地位于文件系统所在磁盘分区的开始处。Superblock还有一个备份叫做冗余superblock,就像DOS中的文件分配表的副本。冗余superblock和缺省的superblock不一样,它被分散地保存在磁盘分区上。
一个特定的文件被看成是目录或包含了指向它的内容的指针。每一个文件都有一个和文件节点(inode)相关联的描述符。一个文件节点包含了文件的属性,例如文件的所有者、最后修改时间、最后访问时间和指向此文件数据块的指针等等。假设一个文件的前12个数据块被文件节点结构中的变量直接指向,那么文件节点结构可能还包含着指向间接文件数据块的指针以便将来扩充文件的内容。其实文件节点结构中包含了3个级别的数据块指针,一个文件有4096个字节的数据块,则第一级间接数据块包含了1024个字节,第二级间接数据块也包含了1024个字节,并且被第一级间接数据块指向;同理,第二级间接数据块也指向第三级大小为1024字节的间接数据块。其实在实际应用中第三级间接数据块很少被使用,因为一般没有那么大的文件。文件系统的数据块大小保存在superblock中,这就使在同一系统中同时访问不同数据块大小的文件系统成为可能。
最后再说明一下,文件数据块的大小是在创建文件系统时给定的,并且在以后的使用中无法被改变。
2.2. 概要信息(Summary information)
概要信息和superblock相关联,并且是唯一关联;当文件系统被改变时,它就随之记录这种改变,记录文件系统中的数据块数目、碎片数目、文件节点和目录等信息。
2.3. 柱面组群(Cylinder groups)
文件系统将磁盘分为一个或多个被称为""柱面组群""的区域,它包含了一个和多个连续的磁盘柱面。每个柱面组群指示了文件的节点槽,一个数据块映象(block map)描述了在柱面组群中所有可用的数据块,并且概要信息描述了在柱面组群中数据块的使用情况。当文件系统生成时,柱面组群中的文件节点数就被确定了下来。目前一般的规则是在磁盘上每2048个字节被分配入一个文件节点。在每个柱面组群的开始处都记录有组群信息,一旦磁盘发生错误时将组群信息丢失。
2.4. 磁盘碎片(Fragments)
为了防止存储小文件时浪费磁盘空间,文件系统允许将一个数据块分割成2、4或8份。其中最小的份额时磁盘的簇大小,通常为512个字节。每一个同柱面组群相关联的数据块映象记录着磁盘空间的碎片程度。
2.5. 文件系统的更新
在每天的日常工作中,我们创建、删除数以百计的文件。操作系统为此产生了一系列的文件系统更新工作。当数据被写入磁盘时,产生了一个连续的文件系统,同时文件系统更新所有的临界信息。当用户改变文件系统时,比如执行write时,要写入的数据被复制入系统内核的被称作in-core的缓冲区中,所以这种数据更新不是同步的,只有当write函数执行完毕,并且返回时,数据才真正地被写入磁盘。同时用户也可以手工地执行sync命令来迫使数据写入磁盘。另外,每当内核的in-core缓冲区被用作新用途时,系统也会使用/etc/update来调用sync将数据写入磁盘。
3. 修复破坏的文件系统
有很多方式可以使文件系统遭到破坏,最通常的是不正常关机和一些硬件错误。原因是在关闭系统并且挂起CPU之前没有执行sync来将数据写入磁盘,导致文件系统不完整。另外,硬件错误也是很致命的,特别是磁盘的物理损伤,将导致数据永久性地丢失。
3.1. 检测和修复被破坏的文件系统
平时,fsck不进行交互式执行,而是每当不正常退出系统后,开机时自动执行。这个功能是在fsck进行交互式执行时的一个子集。所以本文下面的介绍都是基于交互式执行的,并且所有可能发生的错误都会被捕捉到。在此模式下运行,我们可以根据错误的类型来采取相应的修复措施。对于一个静态的文件系统,fsck检查它的结构完整性。在下面的介绍里,我们着重讨论发现柱面组群、文件节点、间接文件节点和数据块的错误和各种可能采取的修复措施。
3.2.超级数据块检查
常见的文件系统破坏形式是概要信息中关于超级数据块的信息破坏。概要信息很容易被破坏,因为对文件系统的任何改变都会导致概要信息的修改,并且也很容易在非正常退出时被破坏。对超级数据块的检查主要是针对文件系统的长度、文件节点数目、空闲数据块统计和空闲文件节点统计等;文件系统的长度必须大于被超级数据块使用的数据块数目的总和和被文件节点列表所使用的数据块数目的总和。对fsck来说,文件系统的长度和它的布局信息是最为重要的。
3.3. 空闲数据块检查
Fsck检查所有在柱面组群的数据块映象中被标识为未使用的数据块,也即空闲数据块。Fsck合计空闲数据块的数目,并且把它加上被文件节点使用的数据块的数目,检查这个结果是否等于文件系统中所有数据块的总和。如果fsck发现数据块分配映象有错时,它会自动重建它。概要信息中和超级数据块相联系的信息包含了在文件系统中所有空闲数据块的数目。Fsck将它检查所得到的空闲数据块数目和上面概要信息中的空闲数据块数目进行比较,如果两者不一致,fsck就将实际检查得到的空闲数据块覆盖概要信息中的空闲数据块信息。对于空闲文件节点的检查也会作同样的处理。
3.4. 文件节点状态检查
一个单独的文件节点一般不会出错,然而,由于在文件系统中有大量的文件节点处入活动状态,所以会有一小部分文件节点会发生错误。Fsck从第二个文件节点开始检查(文件节点0被标记为""未使用""、文件节点1被留作后用)直至最后一个文件节点。每一个文件节点都被进行格式、类型、链接数、重复数据块、坏数据块和节点大小的检查。
每个文件节点都有一个模式定义,它指示了文件节点的类型和分配状态,这些类型有:常规节点、目录节点、符号连接节点、特殊块设备节点、特殊字符设备节点和套接字节点;而其分配状态有:未分配、已分配和非分配三种状态,其中非分配状态的节点指示了这个节点具有不正确的节点格式,这种情况常常是由于非法数据的写入而造成的,对于这种情况,fsck会清除此文件节点的内容。
3.5. 文件节点链接
每一个文件节点都包含有对于目录项的总链接数。Fsck为了校核一个文件节点的链接数,它从根目录开始扫描,并且依次递减目录项中的链接数,最后比较所得链接数和文件节点包含的链接数是否一致,如果不一致则fsck会将实际的链接数保存到文件节点中。如果发现链接数为零,则说明此目录项是被丢弃了的,于是fsck会将此目录项存储到lost+found目录项中。每一个文件节点都保存有一个列表或是指向该列表的指针,此列表包含了此节点所使用的数据块。由于间接数据块是被文件节点所拥有的,所以如果它被破坏也直接地影响到文件节点。Fsck检查一个文件节点所拥有数据块是否存在于""已分配数据块""列表中,如果不是,则查看它是否存在于""重复块(duplicate blocks)""列表中,如果都不是,则将这个数据块的块号加入到""已分配数据块""列表中。另外由于没有足够的信息来表明文件节点所指向的数据块内容的正确性,所以如果文件内容被改变则无法被探测到。如果遇到硬件故障使得数据块内容改变,此时fsck同时清除数据块和文件节点。Fsck检查一个文件节点包含的所有数据块号对应的数据块,如果这个数据块号小于文件系统中最小的数据块号或者大于最大的数据块号则将它置为坏块。坏块通常是由硬件故障引起的,如果一个文件节点包含有坏块号,则fsck将会清除此节点。
3.6. 文件结点数据大小
每个文件节点都有它所包含数据块的总数,这个总是是已分配数据块数目和间接数据块数目的总和。Fsck就比较它计算所得到的数据块总数和文件节点中的数据块总数,看两者是否一致,如果不一致,那么fsck将修复它。另外,每一个文件节点都包含有一个32位的长度字段,它表示了文件大小的字节描述。
3.7. 检查与文件节点相关联的数据
一个文件节点可以和三种形式的数据块相关联。它们是:无格式数据块(Plain data blocks)、符号链接数据块(symbolic link data blocks)和目录数据块(directory data blocks)。
其中,无格式数据块包含了文件的内容;符号链接数据块包含了所指向文件的路径;而目录数据块包含了目录的结构信息。
Fsck只能检查目录数据块的有效性,它检查一系列的目录错误,它们包括目录节点号所指向的未分配文件节点、目录节点号是否大于文件系统中所允许的最大目录节点号、关于目录项"".""及""..""的节点号是否有错和一个目录数据块是否附在文件系统之上等错误。如果一个目录节点的类型是""未分配节点""时,fsck将会删除整个目录节点和它所包含的目录数据块,这通常是由硬件故障引起的。当一个非法数据写入目录数据块时,会引起目录节点跑到文件系统节点列表之外,这种情况,fsck将删除这个目录节点。另外,对于目录项"".""的数据块号必须时目录节点数据块列表中的第一项,因为它相当于这个目录节点,如果不是这样,fsck会修正它并使它成为此目录节点数据块列表中的第一数据块。
3.8. 文件系统的连通性
Fsck检查文件系统的连通性,检查目录项是否都被链入文件系统,如果不是则将它们存入lost+found目录中,这种情况通常发生于硬件故障。