跳到主要内容

Linux文件系统的运作与检查、修复

文件系统的运作

所有的数据都得要加载到内存后 CPU 才能够对该数据进行处理。如果数据不断地在内存与磁盘间进行写入和读

取,会导致效率很低。因此如果能够将常用的文件放置到内存当中,这不就会增加系统性能吗?Linux使用异步处

理的方式解决这个效率问题。

异步处理

  1. 当系统加载一个文件到内存中后;

  2. 如果该文件没有被修改过,则在内存区段的文件数据会被设置为“干净”(clean);

  3. 如果内存中的文件数据被更改过,则此文件数据会被设置为“脏的”(dirty),此时所有的操作都还在内存中执行,并没有写入到磁盘中;

  4. 系统会不定时的将内存中的dirty数据写回磁盘,以保持磁盘与内存数据的一致性。(当然,你也可以使用sync命令将数据强制写入磁盘)。

Linux 文件系统与内存有非常大的关系:

  • 系统会将常用的文件数据放置到主存储器的缓冲区,以加速文件系统的读/写;
  • 承上,因此 Linux 的物理内存最后都会被用光!这是正常的情况!可加速系统效能;
  • 你可以手动使用 sync 来强迫内存中设定为 Dirty 的文件回写到磁盘中;
  • 若正常关机时,关机指令会主动呼叫 sync 来将内存的数据回写入磁盘内;
  • 但若不正常关机(如跳电、当机或其他不明原因),由于数据尚未回写到磁盘内, 因此重新启动后可能会花很多时间在进行磁盘检验,甚至可能导致文件系统的损毁(非磁盘损毁)。

文件系统检查修复

文件系统运作时会有磁盘与内存数据异步的状况发生,因此莫名其妙的宕机非常可能导致文件系统的错乱。

文件系统真的发生错乱的话,该如何挽救!不同的文件系统救援的指令不太一样,主要针对 xfs 及 ext4 这两个主流来说明。

xfs_repair 处理 XFS 文件系统

xfs_repair [-fnd] 装置名称

选项与参数

-f :后面的装置其实是个文件而不是实体装置

-n :单纯检查并不修改文件系统的任何数据 (检查而已)

-d :通常用在单人维护模式底下,针对根目录 (/) 进行检查与修复的动作!很危险!不要随便使用

范例:检查一下刚刚建立的 /dev/vda4 文件系统

 [root@study ~]# xfs_repair /dev/vda4 
Phase 1 - find and verify superblock...
Phase 2 - using internal log
Phase 3 - for each AG...
Phase 4 - check for duplicate blocks...
Phase 5 - rebuild AG headers and trees...
Phase 6 - check inode connectivity...
Phase 7 - verify and correct link counts... done
# 共有 7 个重要的检查流程!详细的流程介绍可以 man xfs_repair 即可!

注意,xfs_repair 可以检查/修复文件系统,不过,因为修复文件系统是个很庞大的任务!因此,修复时该文件系统不能被挂载!

例如,检查系统原本就有的 /dev/centos/home 文件系统时,就会出现问题:

[root@study ~]# xfs_repair /dev/centos/home 
xfs_repair: /dev/centos/home contains a mounted filesystem
xfs_repair: /dev/centos/home contains a mounted and writable filesystem
fatal error -- couldn't initialize XFS librar

没关系,若可以卸除,卸除后再处理即可。

fsck.ext4 处理 EXT4 文件系统

fsck 是个综合指令,如果是针对 ext4 的话,建议直接使用 fsck.ext4 来检测比较妥当!

fsck.ext4 [-pf] [-b superblock] 装置名称
选项与参数:
-p :当文件系统在修复时,若有需要回复 y 的动作时,自动回复 y 来继续进行修复动作。
-f :强制检查!一般来说,如果 fsck 没有发现任何 unclean 的旗标,不会主动进入
细部检查的,如果您想要强制 fsck 进入细部检查,就得加上 -f 旗标啰!
-D :针对文件系统下的目录进行优化配置。
-b :后面接 superblock 的位置!一般来说这个选项用不到。但是如果你的 superblock 因故损毁时,
透过这个参数即可利用文件系统内备份的 superblock 来尝试救援。一般来说,superblock 备份在:

范例:找出刚刚建置的 /dev/vda5 的另一块 superblock,并据以检测系统

[root@study ~]# dumpe2fs -h /dev/vda5 | grep 'Blocks per group'
Blocks per group: 32768
# 看起来每个 block 群组会有 32768 个 block,因此第二个 superblock 应该就在 32768 上!
# 因为 block 号码为 0 号开始编的!
[root@study ~]# fsck.ext4 -b 32768 /dev/vda5
e2fsck 1.42.9 (28-Dec-2013)
/dev/vda5 was not cleanly unmounted, check forced.
Pass 1: Checking inodes, blocks, and sizes
Deleted inode 1577 has zero dtime. Fix<y>? yes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/vda5: ***** FILE SYSTEM WAS MODIFIED ***** # 文件系统被改过,所以这里会有警告!
/dev/vda5: 11/65536 files (0.0% non-contiguous), 12955/262144 blocks

注意

通常只有身为 root 且你的文件系统有问题的时候才使用这个指令,否则在正常状况下使用此一指令, 可能会造成 对系统的危害!通常使用这个指令的场合都是在系统出现极大的问题,导致你在 Linux 开机的时候 得进入单人单机模式下进行维护的行为时,才必须使用此一指令!

由于 xfs_repair/fsck.ext4 在扫瞄磁盘的时 候,可能会造成部分 filesystem 的修订,所以执行 xfs_repair/fsck.ext4 时, 被检查的 partition 务 必不可挂载到系统上!亦即是需要在卸除的状态喔!