我的 Linux 虚拟机“起死回生”记:一次艰辛但成功的 XFS 文件系统救援

By LayFz on Nov 10, 2025
文章标签:

💡 周一早晨:一场意料之外的“噩梦”

今天周一上班,像往常一样,我一到公司就连接上测试机,准备开始新一周的工作。结果发现连接不上。起初我还以为是网络问题,试了几次都不行,于是我直接去了机房。

一进机房,看到所有的机器全都关机了。初步判断大概是周末公司停电了导致的。虽然有点无奈,但停电嘛,也不是第一次。于是我一个个把机器打开。

结果意外出现了——有一台关键节点的系统启动不起来。屏幕卡在一堆日志上,系统提示无法挂载设备,整个系统卡死在那一刻。

我心里一凉:这台机器上可是有上亿条测试数据,还有一整套已经配置好的运行环境。 同事看到后第一反应是:“重装系统吧,反正也快。” 但我心想:刷机?那损失也太大了。别说时间成本,就光数据导入都得半天起步,更别提各种环境、依赖、脚本重新部署……这系统可是调了好几天才稳定的。我不甘心。

于是,我决定自己修。


🧩 一步步排查:从“挂载失败”到“系统彻底崩了”

首先我尝试进入系统的救援模式,也就是修改 GRUB 启动参数,进入 emergency.target。 进去之后我先看了 /etc/fstabblkid,确认 UUID 没问题。配置文件一切正常,这说明挂载信息没有问题。

接着我尝试手动挂载分区,却直接报错,屏幕上出现了让我头皮发麻的一行红字:

Internal error xfs_m_write_corrupted_return

看到这,我就知道问题不一般了——这不是简单的配置错,而是 XFS 文件系统的元数据已经损坏了。 更糟糕的是,接下来连 /sbin/mount/bin/bash 都提示 command not found。这意味着系统内部环境彻底崩了,连救援 Shell 都不完整。

我顿时意识到,靠系统自己修复是不可能了,得借助外部系统。


🧠 灵光一闪:借鉴 Windows 的修复思路

当时我脑子里闪过一个想法:

“Windows 修系统的时候,不是经常用 PE 启动盘进去修硬盘吗?那 Linux 也应该有类似的办法。”

没错,Linux 的“启动盘”就是 ISO 文件。我们可以用一个全新的系统挂载损坏硬盘,然后在外部修复它。

我立刻在 VMware 里挂载了 CentOS 的安装 ISO,把启动顺序改成光驱优先,直接从 ISO 启动。 启动后选择 Troubleshooting → Rescue a System,进入救援模式。 系统提示可以挂载现有系统到 /mnt/sysimage,我果断选了 “Skip to shell”——跳过所有自动挂载,这样环境更干净。


⚙️ 救援现场:XFS 修复的陷阱与突破

进入 Shell 后,我执行了关键命令:

xfs_repair /dev/nvme0n1p3

结果系统提示:

xfs_repair: /dev/nvme0n1p3 contains a mounted filesystem

我愣了一下——原来救援系统自动帮我挂载了分区! 这可不行,XFS 修复时目标分区绝不能处于挂载状态。 于是我马上执行:

umount /mnt/sysimage

再运行一次 xfs_repair。 这次不再报挂载错误了,但又冒出新的提示,说某些库初始化失败。 我猜是因为当前 Shell 环境不纯净,依旧残留了一些救援系统的挂载。于是我退出当前 shell,重新进入一次救援模式,这次直接选择 “Skip all mount”,确保一切都是原生状态。


🏁 修复完成

终于,在最纯净的 Shell 环境中,我执行了压箱底的命令:

xfs_repair -L /dev/nvme0n1p3

这个 -L 参数非常关键,它会清除 XFS 的日志记录。虽然可能会导致最后写入的少量数据丢失,但在文件系统元数据损坏、分区无法挂载的情况下,这是唯一的救命稻草。

随着一行行修复进度滚动,我能清楚看到系统在重建 inode、目录树、日志块……整个过程持续了好几分钟。

修复完成后,命令行返回成功提示。那一刻,我心里终于松了口气。


🏁 奇迹:系统“复活”的那一刻

我卸载 ISO 文件,重新启动虚拟机。 屏幕上的日志一行行往上滚,紧张感拉满。 终于,熟悉的登录界面出现了。

系统进去了,环境也都还在,数据库的数据一条都没丢。

说实话,那一刻真的有点小激动。 从彻底挂掉的系统,到重新启动成功,整个过程大概花了一个多小时,但换来了完整的数据和环境。 这就是技术的成就感。


六、经验与教训

  1. 虚拟机 I/O 错误多数是文件系统逻辑损坏,不是硬件问题。
  2. 当系统内部命令都不可用时,直接放弃内部救援,转用 ISO。
  3. XFS 修复一定要在未挂载的状态下执行,否则会损坏更严重。
  4. xfs_repair -L 是最后的底牌,危险但高效。
  5. 停电虽小,后果可能是系统级灾难——一定要做好电源保护。

🧭 最终经验总结

这次经历让我再次体会到——

“重装系统是懒办法,修好系统才是真本事。”

面对突发的崩溃,保持冷静、判断清晰、操作稳健,才是开发者真正的底气。

评论

订阅我的博客

通过RSS订阅获取最新文章更新,不错过任何一篇技术分享

推荐使用 FeedlyInoreader 等RSS阅读器订阅