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 配置的可靠性。下次宿主机再出问题,恢复时间应该会更快。
