跳转到内容
搜索 Rocky Linux 文档

    浏览当前文档目录

    Rocky 9:XFS 损坏的判断与修复顺序

    在 Rocky Linux 9.8 特权容器(宿主内核 5.14.0-687.54.1.el9_8)里,用 512 MB loop 盘复现:正常文件系统、挂载中修复被拒、卸载后 -n 干跑、前 4 字节清零制造坏 superblock、xfs_repair 恢复、重新挂载读数据。日志:plans/content-expansion/evidence/logs/rocky-xfs-repair.log。

    生产卷的真实修复(备份、快照、停机窗口)不在范围内,本页只说命令行为与判断顺序。

    三条判断,按顺序走:

    1. 还挂着吗——挂着就不能修;
    2. -n 报什么——决定是「小问题」还是「要动 superblock」;
    3. 有备份/快照吗——没有就先做,再动手。

    挂着的时候,修复会被直接拒绝

    Section titled “挂着的时候,修复会被直接拒绝”
    Terminal window
    sudo xfs_repair /dev/loop0
    xfs_repair: /dev/loop0 contains a mounted and writable filesystem
    fatal error -- couldn't initialize XFS library

    内核还持有该文件系统的缓存和日志状态,边挂边修只会得到更乱的元数据。要么停业务卸载,要么把快照挂到另一台机器上修。

    Terminal window
    sudo umount /mnt/x
    sudo xfs_repair -n /dev/loop0
    Phase 7 - verify link counts...
    No modify flag set, skipping filesystem flush and exiting.

    干跑的价值是「把问题清单先拿到手」,生产上要留档,再决定是否真修。

    Terminal window
    sudo dd if=/dev/zero of=/dev/loop0 bs=4 count=1 conv=notrunc
    sudo mount /dev/loop0 /mnt/x
    mount: /mnt/x: wrong fs type, bad option, bad superblock on /dev/loop0, ...

    XFS 的 magic 是前 4 字节 XFSB;被清零后内核认不出文件系统,mount 报 bad superblock。

    Terminal window
    sudo xfs_repair /dev/loop0
    Phase 7 - verify and correct link counts...
    Note - stripe unit (0) and width (0) were copied from a backup superblock.
    done

    XFS 在盘上保存多份 superblock 备份,修复会用备份覆盖损坏的主 superblock;Note 表示几何参数是从备份抄来的,RAID 卷要按提示校正 stripe。

    Terminal window
    sudo mount /dev/loop0 /mnt/x
    cat /mnt/x/a.txt
    hello

    能挂载、关键文件可读,才算修复成功;只看到 done 不代表数据没问题。

    • 边挂边修:被拒绝;生产要先卸载或用快照;
    • 把 -n 当修复:它不写盘;
    • 不看 stripe 提示:从备份恢复可能丢失 RAID 几何,性能下降。

    练习:复现一次坏 superblock 修复

    Section titled “练习:复现一次坏 superblock 修复”
    Terminal window
    sudo dnf install -y xfsprogs
    truncate -s 512M /var/tmp/x.img
    L=$(sudo losetup -f --show /var/tmp/x.img)
    sudo mkfs.xfs -q "$L"
    sudo mkdir -p /mnt/x && sudo mount "$L" /mnt/x
    echo hello | sudo tee /mnt/x/a.txt >/dev/null && sync
    sudo umount /mnt/x
    sudo dd if=/dev/zero of="$L" bs=4 count=1 conv=notrunc
    sudo xfs_repair "$L" | tail -3
    sudo mount "$L" /mnt/x && cat /mnt/x/a.txt

    检查:

    1. 修复前 mount 报 bad superblock
    2. xfs_repair 输出含 done
    3. 修复后 cat /mnt/x/a.txt 输出 hello
    4. xfs_repair -n "$L" 输出 No modify flag set

    常见问题

    挂载中修复为什么被拒绝?

    修复要改元数据,而挂载中的内核仍持有旧缓存与日志状态,边挂边修会产生不一致。卸载后修,或把快照挂到另一台机器上修。

    `-n` 和正式修复差在哪?

    `-n` 只扫描并报告,不写盘;正式修复才会修改。生产上先干跑并留档,再决定是否执行。

    修复后数据一定在吗?

    不一定。修复保证的是文件系统结构可用,损坏区域的数据可能变成 lost+found 里的孤立文件。修完要挂载读关键数据,必要时从备份恢复。