学习 Linux,101: 维护文件系统的完整性

跟踪您的磁盘空间

学习如何检查您的 Linux® 文件系统的完整性,如何监视空闲空间,以及如何修复简单的问题。您可以使用本教程中的资料进行 Linux Professional Institute (LPI) 101 Linux 系统管理员认证考试备考,或者仅使用它们来检查您的文件系统,并让文件系统保持良好的工作秩序,尤其在系统崩溃或断电后。

Ian Shields, Linux 作家, Freelance

Ian Shields 是一位自由 Linux 作家。他已从位于北卡罗来纳州的 IBM 三角研究园退休。Ian 于 1973 年在澳大利亚堪培拉作为系统工程师加入 IBM,他在加拿大蒙特利尔和北卡罗莱拉州 RTP 从事过系统工程和软件开发工作。从上世纪 90 年代开始,他开始使用、开发 Linux 和进行相关的写作工作。他从澳大利亚国立大学获得了纯数学和相关专业的学士学位。他还拥有北卡罗来纳州立大学计算机科学方向的理科硕士和哲学博士学位。他喜欢定向赛跑和旅行。



2016 年 4 月 12 日 (最初于 2010 年 8 月 24 日)

概述

学习更多知识。开发更多项目。联系更多同行。

全新的 developerWorks Premium 会员计划提供了强大的开发工具和资源,包括 500 篇通过 Safari Books Online 提供的顶级技术文章(其中数十篇文章是专门针对 Linux 开发人员的)、最重要开发人员活动的大幅折扣、最新的 O'Reilly 大会的视频录像,等等。立即注册

在本教程中,学习:

  • 验证文件系统的完整性
  • 监视空闲空间和 inode
  • 修复简单的文件系统问题

本教程将介绍标准和日志文件系统,并会重点介绍 ext2(标准文件系统)和 ext3(日志文件系统),还会提及用于其他文件系统的工具。


为什么检查文件系统?

在您的系统崩溃或断电时,Linux 可能无法干净地卸载您的文件系统。因此,您的文件系统可能处于不一致的状态,一些更改已完成,而另一些更改尚未完成。运行损坏的文件系统不是一个好主意,因为您可能进一步恶化任何现有的问题。

对于空间不足,如果没有足够的文件系统管理空间 (inode) 来继续操作的文件系统,则有可能出现其他问题。我们将介绍一些帮助您管理这些问题的工具。

关于本系列

本教程系列帮助学习 Linux 系统管理任务。您还可以使用这些教程中的资料对 Linux Professional Institute 的 LPIC-1:Linux 服务器专业认证考试 进行应考准备。

请参阅 “学习 Linux,101:LPIC-1 学习路线图”,查看本系列中每部教程的描述和链接。这个路线图仍在开发中,目前反映的最新内容是在 2015 年 4 月 15 日更新的 4.0 版 LPIC-1 考试目标。一旦完成这些教程后,我们会将它们添加到路线图中。

本教程可以帮助您针对 Linux Server Professional (LPIC-1) 考试 101 的主题 104 中的目标 104.2 进行应考准备。该目标的权重为 2。

前提条件

要从本系列教程中获得最大收获,您应该拥有 Linux 的基本知识和一个正常工作的 Linux 系统,您可以在这个系统上实践本教程中涵盖的命令。有时,程序的不同版本将得到不同的输出格式,所以您的结果可能并不总是与这里给出的清单和图完全相同。本教程中的示例使用 CentOS 6 和 2.6.32 内核。您在其他系统上的结果可能有所不同。

您还应该熟悉我们的教程 “学习 Linux 101:创建分区和文件系统”。


文件系统检查工具

检查文件系统的主要工具是 fsck,像 mkfs 一样,它实际上是各种文件系统类型的文件系统检查例程的前端。一些底层检查例程如 清单 1 所示。

清单 1. 一些 fsck 程序
[ian@attic4-cent ~]$ ls /sbin/*fsck*
/sbin/btrfsck  /sbin/fsck         /sbin/fsck.ext3     /sbin/fsck.msdos
/sbin/dosfsck  /sbin/fsck.cramfs  /sbin/fsck.ext4     /sbin/fsck.vfat
/sbin/e2fsck   /sbin/fsck.ext2    /sbin/fsck.ext4dev  /sbin/fsck.xfs

您可能会奇怪这些文件中的一些文件是某个文件的硬链接,如 清单 2 所示。请记住,这些程序可能在引导过程中的早期使用,那时可能还未挂载文件系统,也可能无法支持符号链接。请参阅我们的教程 “学习 Linux,101:创建和更改硬链接和符号链接,获取有关硬链接和符号链接的更多信息。

清单 2. 一个包含许多方面的 fsck 程序
[ian@attic4-cent ~]$ find /sbin -samefile /sbin/e2fsck
/sbin/fsck.ext3
/sbin/fsck.ext4
/sbin/e2fsck
/sbin/fsck.ext4dev
/sbin/fsck.ext2

系统引导过程使用带 -A 选项的 fsck 来检查根文件系统和在 /etc/fstab 控制文件中指定的其他任何要检查的文件系统。如果未能干净地卸载文件系统,则会执行一致性检查并执行修复(如果可以安全地执行)。这由 /etc/fstab 条目的 pass(或 passno)字段(第 6 个字段)控制。pass 设置为 0 的文件系统不会在引导系统时执行检查。如果根文件系统具有 pass 值 1,则会首先被检查。其他文件系统的 pass 值通常为 2(或更高),这表示应检查它们的顺序。

如果系统认为有利,则可以并行运行多个 fsck 操作,所以允许不同的文件系统具有相同的 pass 值,如 清单 3 中所示的 /grubfile 和 /home/ian/data 文件系统。请注意,fsck 将避免在同一个物理磁盘上运行多次文件系统检查。要进一步了解 /etc/fstab 的布局,可以查阅 fstab 的手册页。

清单 3. 使用 /etc/fstab 条目对文件系统执行引导检查
filesystem              mount point                               type    options      dump pass
UUID=2f60a3b4-ef6c-4d4c-9ef4-50d7f75124a2 /                       ext3    defaults        1 1
UUID=3c3de27e-779a-44d5-ad7a-61c5fd03d9e7 /grubfile               ext3    defaults        1 2
UUID=158d605e-2591-4749-bf59-5e92e1b1c01d swap                    swap    defaults        0 0
tmpfs                                     /dev/shm                tmpfs   defaults        0 0
devpts                                    /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                                     /sys                    sysfs   defaults        0 0
proc                                      /proc                   proc    defaults        0 0
UUID=4c962b67-c646-467f-96fb-cbbd6de40140 /home/ian/data          ext4    defaults        1 2
UUID=0998d33c-3398-463d-b0e3-7c13ca0c675f /home/ian/research      ext3    defaults        1 2
UUID=e3be4658-b79b-470d-82fe-bb434bcdcc2f /home/ian/pictures      ext4    defaults        1 2

一些日志文件系统(比如 ReiserFS 和 XFS)的 pass 值可能为 0,因为日志代码(而不是 fsck)执行文件系统一致性检查并修复。另一方面,一些文件系统(比如 /proc)是在初始化时构建的,因此不需要检查。

您可以在系统引导后检查文件系统。您将需要拥有根用户权限,而且应该首先卸载您想要检查的文件系统。清单 4 展示了如何使用设备名称、标签或 UUID 检查我们的两个文件系统。您可以使用 blkid 命令查找具有给定标签或 UUID 的设备,以及给定设备的标签和 UUID。

清单 4. 使用 fsck 检查文件系统
[root@attic4-cent ~]# # Find label and UUID for /dev/sdc4
[root@attic4-cent ~]# blkid /dev/sdc4
/dev/sdc4: LABEL="IAN-GPT-EXT4" UUID="f69e0b28-beda-4255-ad5a-4d73672ac9e4" TYPE="ext4" 
[root@attic4-cent ~]# # Check /dev/sdc4
[root@attic4-cent ~]# fsck /dev/sdc4
fsck from util-linux-ng 2.17.2
e2fsck 1.41.12 (17-May-2010)
IAN-GPT-EXT4: clean, 11/2424832 files, 197218/9681152 blocks
[root@attic4-cent ~]# # Check it by label using fsck.ext4
[root@attic4-cent ~]# fsck.ext4 LABEL=IAN-GPT-EXT4
e2fsck 1.41.12 (17-May-2010)
IAN-GPT-EXT4: clean, 11/2424832 files, 197218/9681152 blocks
[root@attic4-cent ~]# # Check it by UUID using e2fsck
[root@attic4-cent ~]# e2fsck UUID=f69e0b28-beda-4255-ad5a-4d73672ac9e4
e2fsck 1.41.12 (17-May-2010)
IAN-GPT-EXT4: clean, 11/2424832 files, 197218/9681152 blocks
[root@attic4-cent ~]# # Finally check the small vfat partition /dev/sda3
[root@attic4-cent ~]# fsck /dev/sda3
fsck from util-linux-ng 2.17.2
dosfsck 3.0.9, 31 Jan 2010, FAT32, LFN
/dev/sda3: 0 files, 0/1265 clusters

如果尝试检查一个挂载的文件系统,则有可能看到一条警告。最新的 fsck 版本将在我们尝试检查根文件系统的位置终止检查,如 清单 5 所示。如果检查未终止,请留意警告,不要执行检查!

清单 5. 不要尝试检查一个挂载的文件系统
[root@attic4-cent ~]# df /
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda11      79040416 7444796  67580568  10% /
[root@attic4-cent ~]# fsck /dev/sda11
fsck from util-linux-ng 2.17.2
e2fsck 1.41.12 (17-May-2010)
/dev/sda11 is mounted.
e2fsck: Cannot continue, aborting.

fsck 确定在文件系统上运行何种检查,这也是一个不错的主意。运行错误的检查可能损坏文件系统。如果想查看 fsck 会对给定的一个或一组文件系统执行何种检查,可使用 -N 选项,如 清单 6 所示。

清单 6. 查看 fsck 将对 /dev/sda7、/dev/sda8 和 /dev/sda9 执行何种检查
[root@attic4-cent ~]# fsck -N /dev/sda11 /dev/sdb*
fsck from util-linux-ng 2.17.2
[/sbin/fsck.ext3 (1) -- /] fsck.ext3 /dev/sda11 
[/sbin/fsck.ext2 (2) -- /dev/sdb] fsck.ext2 /dev/sdb 
[/sbin/fsck.ext3 (3) -- /dev/sdb1] fsck.ext3 /dev/sdb1 
[/sbin/fsck.ext4 (4) -- /home/ian/data] fsck.ext4 /dev/sdb2 
[/sbin/fsck.ext3 (5) -- /home/ian/research] fsck.ext3 /dev/sdb3 
[/sbin/fsck.ext4 (6) -- /dev/sdb4] fsck.ext4 /dev/sdb4

目前为止,我们检查了 ext 和 vfat 文件系统。现在让我们检查 /dev/sdb3 上的 XFS 文件系统。在 清单 7 中可以看到,fsck 命令只是告诉我们,我们应该使用 xfs_check 命令。如果没有错误,xfs_check 不会显示任何输出。有一个 -v 选项表示详细输出,但它对简单检查而言太详细了。

清单 7. 对 XFS 使用 fsck
[root@attic4-cent ~]# fsck -N /dev/sdc3
fsck from util-linux-ng 2.17.2
[/sbin/fsck.xfs (1) -- /dev/sdc3] fsck.xfs /dev/sdc3 
[root@attic4-cent ~]# fsck /dev/sdc3
fsck from util-linux-ng 2.17.2
If you wish to check the consistency of an XFS filesystem or
repair a damaged filesystem, see xfs_check(8) and xfs_repair(8).
[root@attic4-cent ~]# xfs_check /dev/sdc3

监视空闲空间

在存储设备上,文件或目录包含在一个 集合中。有关一个文件的信息包含在一个 inode 中,它记录所有者、最后访问该文件的时间、它的大小、它是否是目录,以及谁可以读取或写入它等信息。inode 编号也称为文件序列号,该序列号在特定的文件系统内是唯一的。请参阅我们的教程 “学习 Linux,101:文件和目录管理,了解有关文件和目录的更多信息。

数据块和 inode 都会在文件系统上占用空间,所以您需要监视空间使用,确保您的文件系统为数据增加留有空间。

df 命令

df 命令显示挂载的文件系统的信息。如果添加 -T 选项,文件系统类型会包含在显示中,否则不会包含该信息。对我们上面使用的 CentOS 6 系统执行 df 的输出如 清单 8 所示。如果您还有兴趣的话,我们在 /mnt/btrfs-test 上创建了一个挂载点,并将我们的 btrfs 文件系统 (/dev/sdc5) 挂载到了这个挂载点上。我们对 /dev/sda3 上的小 vfat 分区执行了同样的操作。

清单 8. 显示文件系统使用情况
[root@attic4-cent ~]# mkdir /mnt/btrfs-test
[root@attic4-cent ~]# mount /dev/sdc5 /mnt/btrfs-test
[[root@attic4-cent ~]# mkdir /mnt/vfat-test
[root@attic4-cent ~]# mount /dev/sda3 /mnt/vfat-test
root@attic4-cent ~]# df -T
Filesystem     Type  1K-blocks      Used Available Use% Mounted on
/dev/sda11     ext3   79040416   7444800  67580564  10% /
tmpfs          tmpfs   1961548       232   1961316   1% /dev/shm
/dev/sda1      ext3     988420    116067    821349  13% /grubfile
/dev/sdb2      ext4  124077136  49155856  68611636  42% /home/ian/data
/dev/sdb3      ext3   60458064  30808664  26578276  54% /home/ian/research
/dev/sdc1      ext4  467126880 134497524 308894012  31% /home/ian/pictures
/dev/sda5      ext4   71168700  31178752  36368096  47% /mnt/sda5
/dev/sdc5      btrfs  39062528        56  36936704   1% /mnt/btrfs-test
/dev/sda3      vfat       2530         0      2530   0% /mnt/vfat-test

请注意,输出包括总块数以及使用的和空闲的(可用的)块数。另请注意文件系统,比如我们在 /dev/sda11 上的根文件系统为 ext3,它的挂载点为:/。tmpfs 条目表示虚拟内存文件系统。它们仅存在于 RAM 或交换空间中,是在挂载时创建的,不需要使用 mkfs 命令。

有关 inode 使用情况的具体信息,可在 df 命令上使用 -i 选项获得。可以使用 -x 选项排除某些文件系统类型,或者使用 -t 选项将信息限制为某些文件系统类型。如果有必要的话,可以多次使用这些选项。请参见 清单 9 中的示例。

清单 9. 显示 indoe 使用情况
[root@attic4-cent ~]# df -i -x tmpfs
Filesystem       Inodes  IUsed    IFree IUse% Mounted on
/dev/sda11      5021696 236498  4785198    5% /
/dev/sda1        251000    537   250463    1% /grubfile
/dev/sdb2       7904304 125115  7779189    2% /home/ian/data
/dev/sdb3       3842048  40341  3801707    2% /home/ian/research
/dev/sdc1      29671424  48944 29622480    1% /home/ian/pictures
/dev/sda5       4530176 245603  4284573    6% /mnt/sda5
/dev/sdc5             0      0        0     - /mnt/btrfs-test
/dev/sda3             0      0        0     - /mnt/vfat-test
[root@attic4-cent ~]# df -iT -t ext4 -t vfat
Filesystem     Type   Inodes  IUsed    IFree IUse% Mounted on
/dev/sdb2      ext4  7904304 125115  7779189    2% /home/ian/data
/dev/sdc1      ext4 29671424  48944 29622480    1% /home/ian/pictures
/dev/sda5      ext4  4530176 245603  4284573    6% /mnt/sda5
/dev/sda3      vfat        0      0        0     - /mnt/vfat-test

在看到 FAT32 文件系统没有 inode 时,您可能并不感到奇怪。您可能对看到 btrfs 文件系统没有 inode 信息感到奇怪。Btrfs(也称为 ReiserFS)将 inode 信息保留在动态分配的结构中,所以不会像 ext2、ext3 或 ext4 一样具有特殊的 inode 块。

可以对 df 使用其他几个选项,将显示限制到本地文件系统或控制输出的格式。例如,使用 -H 选项显示人类可读的大小,比如 1K 表示 1024,或者使用 -h(或 --si)选项获取 10 的幂次的大小 (1K=1000)。

如果不确定您的目录树的特定部分位于哪个文件系统上,可以为 df 命令提供一个目录名称,甚至可以使用一个文件名作为参数,如 清单 10 所示。

清单 10. 人类可读的 df 输出
[root@attic4-cent ~]# df --si ~ian/index.html
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda11       81G  7.7G   70G  10% /

tune2fs 命令

ext 系列文件系统也有一个名为 tune2fs 的实用工具,可以使用它来检查块数信息,以及文件系统是(ext3 或 ext4)否 (ext2) 具有日志功能的信息。该命令还可以用来设置许多参数,或者通过添加日志功能来将 ext2 文件系统转换为 ext3。清单 11 显示了一个新创建的 ext4 文件系统的输出,使用 -l 选项来简单地显示现有信息。

清单 11. 使用 tune2fs 显示 ext4 文件系统信息
[root@attic4-cent ~]# tune2fs -l /dev/sdc4
tune2fs 1.41.12 (17-May-2010)
Filesystem volume name:   IAN-GPT-EXT4
Last mounted on:          <not available>
Filesystem UUID:          f69e0b28-beda-4255-ad5a-4d73672ac9e4
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype extent flex_bg 
sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags:         signed_directory_hash 
Default mount options:    (none)
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              2424832
Block count:              9681152
Reserved block count:     484057
Free blocks:              9483934
Free inodes:              2424821
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      1021
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8192
Inode blocks per group:   512
RAID stride:              1
Flex block group size:    16
Filesystem created:       Wed Aug  5 10:58:58 2015
Last mount time:          n/a
Last write time:          Thu Aug  6 10:04:27 2015
Mount count:              0
Maximum mount count:      23
Last checked:             Wed Aug  5 10:58:58 2015
Check interval:           15552000 (6 months)
Next check after:         Mon Feb  1 09:58:58 2016
Lifetime writes:          725 MB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:	          256
Required extra isize:     28
Desired extra isize:      28
Journal inode:            8
Default directory hash:   half_md4
Directory Hash Seed:      cb683b6a-2ef7-4588-954a-d163b0219652
Journal backup:           inode blocks

xfs_info

对于 XFS 文件系统,您可以显示在使用 xfs_info 创建文件系统时 mkfs.xfs 显示的相同信息,如 清单 12 所示。您需要在挂载的文件系统上使用 xfs_info

清单 12. 使用 xfs_info 显示 XFS 文件系统信息
[root@attic4-cent ~]# mkdir /mnt/xfs-test
[root@attic4-cent ~]# mount /dev/sdc3 /mnt/xfs-test
[root@attic4-cent ~]# xfs_info /mnt/xfs-test
meta-data=/dev/sdc3              isize=512    agcount=16, agsize=655360 blks
         =                       sectsz=4096  attr=2, projid32bit=0
data     =                       bsize=4096   blocks=10485760, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0
log      =internal               bsize=4096   blocks=5120, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1

du 命令

df 命令提供整个文件系统的信息。有时您可能想知道您的主目录使用了多少空间,或者如果想要将 /usr 转移到它自己的文件系统,您可能想知道要使用多大的分区。要回答这种问题,可以使用 du 命令。

du 命令显示作为参数提供的一个(或多个)文件名的信息。如果提供了目录名,du 会递归地计算给定目录的每个文件和子目录的大小。结果可能包含大量输出。幸运的是,可以使用 -s 选项来只请求目录的摘要。如果使用 du 获取多个目录的信息,可添加 -c 选项来获得总和。还可以使用用于 df 的同一组大小选项(-h-H--si 等)来控制输出格式。清单 13 显示了一个新创建的用户的主目录的两个视图,该用户曾经登录并创建了一个 index.html 文件。

清单 13. 使用 du
[testuser@attic4-cent ~]$ du -hc *
4.0K	Desktop
4.0K	Documents
4.0K	Downloads
16K	index.html
4.0K	Music
4.0K	Pictures
4.0K	Public
4.0K	Templates
4.0K	Videos
48K	total
[testuser@attic4-cent ~]$ du -hs .
980K	.

来自 du -c * 的 48K 的总和与来自 du -s 的 980K 的总和不同的原因在于,后者包含从句点开始的条目,比如 .bashrc,而前者不包含。

对于 du,要注意的另一点是,您必须能够读取运行该命令所针对的目录。

所以现在让我们使用 du 显示 /usr 树和它的每个一级子目录所使用的总空间。结果如 清单 14 所示。使用根权限来确保您拥有合适的访问权限。

清单 14. 在 /usr 上使用 du
[root@attic4-cent ~]# du -shc /usr/*
257M	/usr/bin
4.0K	/usr/etc
4.0K	/usr/games
132M	/usr/include
383M	/usr/lib
1.5G	/usr/lib64
62M	    /usr/libexec
136K	/usr/local
67M	    /usr/sbin
2.4G	/usr/share
98M	    /usr/src
0	    /usr/tmp
4.8G	total

修复文件系统

有时(我们希望很少发生)会出现最糟的情况,您需要修复一个由于崩溃或其他故障而未干净地卸载的文件系统。您在上面看到的 fsck 命令既可以修复文件系统,也可以检查它们。通常,自动引导时检查将会修复这些问题,您可以继续操作。

如果文件系统的自动引导时检查无法恢复一致性,您通常会被转储到单个用户 shell,使用一些指令来手动运行 fsck。对于 ext2 文件系统(没有日志),您可能看到一系列请求,要求您确认用于修复文件系统上的特定块的建议操作。您通常应该回答 y(表示 ‘是’)来允许 fsck 尝试修复问题。当系统重新引导时,检查是否丢去了任何数据或文件。

如果怀疑存在损坏,或者希望手动运行检查,大多数检查程序都会要求卸载文件系统,或者至少在只读模式下挂载。由于您无法卸载正在运行的系统上的根文件系统,所以最好进入单用户模式(使用 telinit 1),然后在只读模式下重新挂载根文件系统,这时您应能够执行一致性检查。检查文件系统的一种更好的方法是引导一个恢复系统,比如一个活动 CD 或 USB 闪存盘,从其中对您未挂载的文件系统执行检查。

如果 fsck 无法修复问题,可以使用其他一些工具,但您通常需要拥有文件系统布局的高级知识才能成功地修复这些问题。

为什么使用日志?

对 ext2 磁盘的 fsck 扫描可能会花很长时间才能完成,因为必须全面扫描文件系统的内部数据结构(或元数据)。随着文件系统变得越来越大,花费的时间也变得越来越长(即使磁盘能保持更快地运行),所以,完整的检查可能会花一两个小时。

这个问题是开发日志journaling 文件系统的动力。日志文件系统会保留对文件系统元数据的最新更改的日志。发生崩溃后,文件系统驱动程序会检查登录顺序,确定哪些最新更改的文件系统部分可能存在错误。借助这一设计更改,检查日志文件系统的一致性通常只需花几秒钟,无论文件系统有多大。此外,文件系统驱动程序通常会检查挂载的文件系统,所以一般不需要执行外部 fsck 检查。事实上,对于 xfs 文件系统,fsck 什么都不会做!

如果对文件系统运行手动检查,请查阅合适的 fsck 命令(fsck.ext3e2fsck xfs_check 等)的手册页,以确定合适的参数。用于 ext2、ext3 或 ext4 文件系统时 -p 选项将导致 fsck 自动修复所有可以安全修复的问题。事实上,这个过程是在引导时执行的。

我们首先将在一个空 XFS 文件系统上运行 e2fsck,然后使用 xfs_check 修复它,以演示 e2fsckxfs_check 的使用。请记住,我们建议您使用 fsck 前端,以确保使用了正确的检查工具,而且我们需要警告您如果不这么做可能导致文件系统损坏。

在 清单 15 中,我们首先对 /dev/sda8(其中包含一个 XFS 文件系统)运行 e2fsck。经过几次交互后,我们使用 ctrl-Break 来退出,但为时已晚。警告:除非您想毁坏您的文件系统,否则不要这么做。

清单 15. 故意在 XFS 文件系统上手动运行 e2fsck
[root@attic4-cent ~]# xfs_check -s /dev/sdc3
[root@attic4-cent ~]# e2fsck /dev/sdc3
e2fsck 1.41.12 (17-May-2010)
e2fsck: Group descriptors look bad... trying backup blocks...
/dev/sdc3 was not cleanly unmounted, check forced.
Resize inode not valid.  Recreate<y>? yes

Pass 1: Checking inodes, blocks, and sizes
Deleted inode 163841 has zero dtime.  Fix<y>? ctrl-Break

/dev/sdc3: e2fsck canceled.

/dev/sdc3: ***** FILE SYSTEM WAS MODIFIED *****

即使您在收到第一个提示时退出,您的 XFS 文件系统仍可能已被损坏。一定要记住。除非您想毁坏您的文件系统,否则不要这么做。

现在让我们使用 xfs_check 检查 XFS 文件系统。xfs_check 命令非常详细,但它有一个 -s 选项可用于仅报告严重的错误。输出如 清单 16 所示。

清单 16. 使用 xfs_check 修复 XFS 文件系统
[root@attic4-cent ~]# xfs_check -s /dev/sdc3
xfs_check: cannot init perag data (117)
blocks 17039360/3..3 claimed by block 17039360/0
can't seek in filesystem at bb 89335319756824
can't read agfl block for ag 17039360
can't seek in filesystem at bb 89335588200448
can't seek in filesystem at bb 89335319756800
can't seek in filesystem at bb 89335319756800

您应该使用 xfs_repair 修复 XFS 文件系统。像 xfs_check 一样,它非常详细,而且它没有 -s 选项。如果您只想看看哪些错误需要修复,而不想实际修复它,可使用 xfs_repair -n。清单 17 显示了来自 xfs_repair 的部分输出。您可以看到,运行错误的文件系统检查可能很快造成重大损坏。

清单 17. 修复损坏的 XFS 文件系统
[root@attic4-cent ~]# xfs_repair /dev/sdc3
Phase 1 - find and verify superblock...
Phase 2 - using internal log
        - zero log...
        - scan filesystem freespace and inode maps...
bad magic # 0x1060000 for agf 0
bad version # 33947648 for agf 0
bad sequence # 17039360 for agf 0
bad length -143002337 for agf 0, should be 655360
flfirst 25427968 in agf 0 too large (max = 1024)
fllast -42401760 in agf 0 too large (max = 1024)
bad magic # 0x80024000 for agi 0
bad version # -2130558976 for agi 0
bad sequence # 16384 for agi 0
bad length # -25362400 for agi 0, should be 655360
reset bad agf for ag 0
reset bad agi for ag 0
freeblk count 1 != flcount 1024 in ag 0
bad agbno 33555456 for btbno root, agno 0
bad agbno 0 for btbcnt root, agno 0
bad agbno 0 for inobt root, agno 0
agi_count 1024, counted 0 in ag 0
agi unlinked bucket 0 is 8404992 in ag 0 (inode=8404992)
agi unlinked bucket 1 is 4269604896 in ag 0 (inode=4269604896)
agi unlinked bucket 2 is 1024 in ag 0 (inode=1024)
...
agi unlinked bucket 62 is 2307015680 in ag 0 (inode=2307015680)
agi unlinked bucket 63 is 2323792896 in ag 0 (inode=2323792896)
sb_icount 64, counted 0
sb_ifree 61, counted 0
sb_fdblocks 10480520, counted 9825176
root inode chunk not found
Phase 3 - for each AG...
        - scan and clear agi unlinked lists...
        - process known inodes and perform inode discovery...
        - agno = 0
        - agno = 1
        - agno = 2
...
        - agno = 15
        - process newly discovered inodes...
Phase 4 - check for duplicate blocks...
        - setting up duplicate extent list...
        - check for inodes claiming duplicate blocks...
        - agno = 1
        - agno = 0
        - agno = 2
...
        - agno = 15
Phase 5 - rebuild AG headers and trees...
        - reset superblock...
Phase 6 - check inode connectivity...
        - resetting contents of realtime bitmap and summary inodes
        - traversing filesystem ...
        - traversal finished ...
        - moving disconnected inodes to lost+found ...
Phase 7 - verify and correct link counts...
done

超级块 (Superblock)

您可能想知道所有这些检查和修复工具是如何知道从何处开始的。Linux 和 UNIX 文件系统通常拥有一个超级块,它描述了文件系统元数据 或描述文件系统本身的数据。它通常存储在一个已知位置,该位置位于文件系统开头的地方或附近,并被复制到其他已知的位置。可以使用 mke2fs-n 选项来显示现有文件系统的超级块的位置。如果指定了每个 inode 的字节数等参数,那么您应该使用在使用 -n 选项时的参数来调用 mke2fs。清单 18 显示了 /dev/sda5 上的超级块的位置。请注意,在这么做时,文件系统必须处于未挂载状态。

清单 18. 查找超级块的位置
[root@attic4-cent ~]# mke2fs -n /dev/sda5
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
4530176 inodes, 18109263 blocks
905463 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
553 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000, 7962624, 11239424

高级工具

您可以使用一些更高级的工具来检查或修复文件系统。请查阅手册页来了解正确的用法,查阅 Linux 文档项目(参见 参考资料)来了解操作信息。几乎所有这些命令都要求已卸载文件系统,但一些功能可在以只读模式挂载的文件系统上使用。下面介绍了一些命令。

在尝试执行任何修复之前,始终应备份您的文件系统。

用于 ext2 和 ext3 文件系统的工具

tune2fs
调节 ext2 和 ext3 文件系统上的参数。使用它向 ext2 系统添加一个日志,使它变成 ext3 系统,并显示和设置在执行检查前最大的挂载数。您还可以分配一个标签,并设置或禁用各种可选功能。
dumpe2fs
打印 ext2 或 ext3 文件系统的超级块和块组描述符信息。
debugfs
是一个交互式文件系统调试工具。使用它检查或更改 ext2 或 ext3 文件系统的状态。

用于 Reiserfs 文件系统的工具

reiserfstune
显示和调节 ReiserFS 文件系统上的参数。
debugreiserfs
对 ReiserFS 文件系统执行与 dumpe2fs 和 debugfs 类似的功能。

用于 XFS 文件系统的工具

xfs_info
显示 XFS 文件系统信息。
xfs_growfs
展开 XFS 文件系统(假设有另一个分区可用)。
xfs_admin
更改 XFS 文件系统的参数。
xfs_repair
在挂载检查不足以修复 XFS 文件系统时修复该系统。
xfs_db
检查或调试 XFS 文件系统。

用于 btrfs 文件系统的工具

备注:您可能需要在线搜索 btrfs 手册页。

btrfs
显示许多方面的 btrfs 文件系统信息
btrfsck
检查 btrfs 文件系统
btrfs-find-root
查找作为 btrfs 文件系统的根的块
btrfs-debug-tree
显示 btrfs 内部元数据
btrfstune
调节各种 btrfs 文件系统参数,启用或禁用一些扩展的功能
btrfs-restore
尝试从损坏的 btrfs 文件系统恢复文件

介绍完我们的工具后,我们将演示 debugfs 命令,您可以通过它来了解 ext 系列文件系统的内部工作原理。默认情况下,它在只读模式下打开文件系统。它有许多命令,允许您尝试取消删除文件或目录,以及其他需要写访问的操作,所以您可以使用 -w 选项专门启用写访问权。在使用它时请小心谨慎。

清单 19 展示了如何打开我的系统上的根文件系统;导航到我的主目录;显示一个名为 index.html 的文件的信息(包括 inode 编号);以及最后将该 inode 编号映射回该文件的路径名。在 debugfs 中使用 ? 获得可用命令的列表。在这个示例中,文件系统已挂载,可以正常检查它。不要尝试在挂载的文件系统上执行修复。

清单 19. 使用 debugfs
[root@attic4-cent ~]# debugfs /dev/sda11
debugfs 1.41.12 (17-May-2010)
debugfs:  cd home/ian
debugfs:  pwd
[pwd]   INODE: 3825697  PATH: /home/ian
[root]  INODE:      2  PATH: /
debugfs:  stat index.html
Inode: 3832472   Type: regular    Mode:  0664   Flags: 0x0
Generation: 301826695    Version: 0x00000000
User:  1000   Group:  1000   Size: 13430
File ACL: 0    Directory ACL: 0
Links: 1   Blockcount: 32
Fragment:  Address: 0    Number: 0    Size: 0
ctime: 0x55c37766 -- Thu Aug  6 11:04:06 2015
atime: 0x55c37c42 -- Thu Aug  6 11:24:50 2015
mtime: 0x55940f92 -- Wed Jul  1 12:04:34 2015
Size of extra inode fields: 4
Extended attributes stored in inode body: 
  selinux = "unconfined_u:object_r:user_home_t:s0\000" (37)
BLOCKS:
(0-1):15323651-15323652, (2):15323686, (3):15342497
TOTAL: 4

debugfs:  ncheck 3832472
Inode	Pathname
3832472	/home/ian/index.html
debugfs:  q

结束语

我们介绍了许多可用于检查、修改和修复文件系统的工具。请记住在使用本教程中讨论的工具或其他任何工具时,始终要小心谨慎。可能只是按错一个键就会导致数据丢失。

参考资料

学习

获得产品和技术

讨论

  • 加入 developerWorks 中文社区,developerWorks 社区是一个面向全球 IT 专业人员,可以提供博客书签、wiki、群组、联系、共享和协作等社区功能的专业社交网络社区。

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Linux
ArticleID=1029747
ArticleTitle=学习 Linux,101: 维护文件系统的完整性
publish-date=04122016