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。
生产卷的真实修复(备份、快照、停机窗口)不在范围内,本页只说命令行为与判断顺序。
判断顺序:先问「能不能修」
Section titled “判断顺序:先问「能不能修」”三条判断,按顺序走:
- 还挂着吗——挂着就不能修;
-n报什么——决定是「小问题」还是「要动 superblock」;- 有备份/快照吗——没有就先做,再动手。
挂着的时候,修复会被直接拒绝
Section titled “挂着的时候,修复会被直接拒绝”sudo xfs_repair /dev/loop0xfs_repair: /dev/loop0 contains a mounted and writable filesystem
fatal error -- couldn't initialize XFS library内核还持有该文件系统的缓存和日志状态,边挂边修只会得到更乱的元数据。要么停业务卸载,要么把快照挂到另一台机器上修。
干跑:-n 只读不写
Section titled “干跑:-n 只读不写”sudo umount /mnt/xsudo xfs_repair -n /dev/loop0Phase 7 - verify link counts...No modify flag set, skipping filesystem flush and exiting.干跑的价值是「把问题清单先拿到手」,生产上要留档,再决定是否真修。
坏 superblock 长什么样
Section titled “坏 superblock 长什么样”sudo dd if=/dev/zero of=/dev/loop0 bs=4 count=1 conv=notruncsudo mount /dev/loop0 /mnt/xmount: /mnt/x: wrong fs type, bad option, bad superblock on /dev/loop0, ...XFS 的 magic 是前 4 字节 XFSB;被清零后内核认不出文件系统,mount 报 bad superblock。
修复:从备份 superblock 恢复
Section titled “修复:从备份 superblock 恢复”sudo xfs_repair /dev/loop0Phase 7 - verify and correct link counts...Note - stripe unit (0) and width (0) were copied from a backup superblock.doneXFS 在盘上保存多份 superblock 备份,修复会用备份覆盖损坏的主 superblock;Note 表示几何参数是从备份抄来的,RAID 卷要按提示校正 stripe。
修完必须挂载校验
Section titled “修完必须挂载校验”sudo mount /dev/loop0 /mnt/xcat /mnt/x/a.txthello能挂载、关键文件可读,才算修复成功;只看到 done 不代表数据没问题。
- 边挂边修:被拒绝;生产要先卸载或用快照;
- 把
-n当修复:它不写盘; - 不看 stripe 提示:从备份恢复可能丢失 RAID 几何,性能下降。
练习:复现一次坏 superblock 修复
Section titled “练习:复现一次坏 superblock 修复”sudo dnf install -y xfsprogstruncate -s 512M /var/tmp/x.imgL=$(sudo losetup -f --show /var/tmp/x.img)sudo mkfs.xfs -q "$L"sudo mkdir -p /mnt/x && sudo mount "$L" /mnt/xecho hello | sudo tee /mnt/x/a.txt >/dev/null && syncsudo umount /mnt/xsudo dd if=/dev/zero of="$L" bs=4 count=1 conv=notruncsudo xfs_repair "$L" | tail -3sudo mount "$L" /mnt/x && cat /mnt/x/a.txt检查:
- 修复前
mount报bad superblock xfs_repair输出含done- 修复后
cat /mnt/x/a.txt输出hello xfs_repair -n "$L"输出No modify flag set
常见问题
挂载中修复为什么被拒绝?
修复要改元数据,而挂载中的内核仍持有旧缓存与日志状态,边挂边修会产生不一致。卸载后修,或把快照挂到另一台机器上修。
`-n` 和正式修复差在哪?
`-n` 只扫描并报告,不写盘;正式修复才会修改。生产上先干跑并留档,再决定是否执行。
修复后数据一定在吗?
不一定。修复保证的是文件系统结构可用,损坏区域的数据可能变成 lost+found 里的孤立文件。修完要挂载读关键数据,必要时从备份恢复。
- 存储扩容:LVM 扩容
- 安装后核对:安装后 7 项核对
- 日志轮转:logrotate 实战