VPS 文件系统故障复盘:ext4 journal 中止导致全服务瘫痪,以及如何恢复

VPS 文件系统故障复盘:ext4 journal 中止导致全服务瘫痪,以及如何恢复

今天早上,我的 VPS(162.43.92.249)突然全线服务中断。Docker、Nginx、MySQL、n8n、One API、VPS Monitor 全部挂掉,SSH 能连上但系统几乎无法写入任何文件。

排查后发现,根本原因不是软件配置问题,而是 ext4 文件系统的 journal 中止(aborted journal)。

故障现象

登录 VPS 后,dmesg 持续刷屏:

EXT4-fs error (device vda1): ext4_journal_check_start:83:
Detected aborted journal

EXT4-fs (vda1): Remounting filesystem read-only

根分区 /dev/vda1 被内核强制重挂为只读。任何写入操作都会失败:

touch: cannot touch '/tmp/write-test': Read-only file system

Docker 因为无法写入 /var/lib/docker 而启动失败,Nginx 因为无法绑定端口而失败,PM2 无法写入 .pm2 目录,所有依赖磁盘写入的服务全部瘫痪。

根因分析

通过 journalctl -b -2 查看崩溃前的日志,发现了关键线索:

tailscaled: time jump detected (slept 30s)
snapd: SIGABRT: abort
telegram: Polling stall detected (stuck 195s)

这些症状指向同一个原因:VPS 宿主机(OpenStack)对虚拟机进行了暂停或在线迁移。虚拟机被挂起 30 秒后恢复,期间磁盘写入被中断,ext4 journal 因此中止。

这不是 VPS 内部的问题,而是宿主机层面的操作。XServer 的 OpenStack 环境偶尔会做资源调度,用户无法控制。

恢复过程

第一次重启后问题依旧。第二次重启时,内核自动执行了 fsck,修复了 journal:

Filesystem state: clean
Last checked: Fri Oct 16 09:23:58 2026

修复后所有服务自动恢复:

  • **Docker 容器**:MySQL、n8n、One API 全部 Up
  • **vps-monitor**(Next.js,端口 3003)通过 PM2 自动拉起
  • **project-dashboard**(Node,端口 3100)通过 systemd 自动恢复
  • **Nginx、Tailscale、SSH** 全部正常

关键教训

  • **ext4 journal 中止**是硬关机或系统暂停的典型后果。如果 VPS 提供商做了宿主机迁移,用户端会看到这个错误。
  • **只读文件系统下不要强行写入**。`mount -o remount,rw /` 通常会失败,强行操作可能加重损坏。正确做法是重启让内核自动 `fsck`,或进入 GRUB 单用户模式手动执行 `fsck -y /dev/vda1`。
  • **服务自启链路要完整**。这次能快速恢复,是因为所有关键服务都有自启机制:Docker 容器有 `restart policy`,PM2 有 `pm2-root.service`,`project-dashboard` 有独立的 `systemd unit`。
  • **备份是最后防线**。这次数据没丢是运气。建议定期把关键数据(数据库、配置、代码)备份到 VPS 之外的地方。

长期改进

  • 给 VPS 加自动快照(XServer 面板支持)
  • 把关键数据的定期备份脚本化,输出到远程存储
  • 加 Uptime 监控,服务挂掉时第一时间收到通知
  • 考虑把非核心服务从这台 VPS 迁出,降低单点故障影响

这次故障虽然惊险,但处理过程也验证了自启机制和 systemd 配置的可靠性。下次宿主机再出问题,恢复时间应该会更快。