虚拟机异常断电后 Emergency Mode 恢复手册
一、事故概况
| 项目 | 内容 |
|---|---|
| 触发原因 | 宿主机异常断电,虚拟机被强制关机 |
| 涉及虚拟机 | bd01(CentOS7,PostgreSQL)、bd02(CentOS7) |
| 故障现象 | 开机进入 emergency mode,SSH 无法连接,网卡未启动,执行 systemctl 提示 polkit 报错 |
| 根本原因 | /etc/fstab 中 /data 数据盘挂载配置存在先天隐患,异常断电重启后 systemd 严格校验,故障暴露 |
| 数据情况 | sdb 数据盘完好,无任何业务数据丢失 |
二、两台虚拟机故障根源对比
| 项目 | bd01 | bd02 |
|---|---|---|
| fstab 错误配置行 | UUID= /data xfs defaults 0 0 |
UUID=xxx /data xfs default.nofail 0 0 |
| 具体问题 | UUID 为空,无磁盘唯一标识 | 参数书写错误,应使用英文逗号 defaults,nofail,错写为点号 default.nofail |
| 挂载报错 | mount: special device UUID= does not exist |
mount: wrong fs type, bad option, bad superblock |
| 修复方案 | 补充真实磁盘UUID,增加 nofail 参数 |
将 default.nofail 修改为 defaults,nofail |
三、Emergency Mode 通用排查流程
进入紧急模式后,严格按顺序操作,不可跳步。
步骤1:查看启动失败日志
bash
journalctl -xb | grep -iE "fail|error|emergency" | tail -50
典型报错日志:
Job data.mount/start failed with result 'dependency'Job local-fs.target/start failed with result 'dependency'Reached target Emergency Mode
出现 xxx.mount 挂载失败,基本判定 /etc/fstab 挂载配置异常。
步骤2:查看 fstab 配置文件
bash
cat /etc/fstab
逐项检查规则:
- UUID 不能为空
- UUID 格式标准 8-4-4-4-12,共36位字符
- 挂载目录真实存在
- 文件系统类型匹配(xfs/ext4等)
- 多参数使用英文逗号分隔,禁止使用句号
步骤3:查看磁盘真实硬件信息
bash
lsblk # 查看磁盘分区结构
blkid # 获取磁盘UUID、文件系统类型
file -s /dev/sdb # 读取裸盘,校验文件系统有效性
步骤4:校验数据盘完整性
紧急模式不要直接挂载 /data,避免系统启动流程干扰,临时挂载验证:
bash
mkdir -p /test_mnt
mount /dev/sdb /test_mnt
ls /test_mnt
umount /test_mnt
rmdir /test_mnt
能正常读取业务文件,代表磁盘与文件系统无损坏,仅需修复 fstab。
步骤5:修复 fstab 挂载配置
bash
cp /etc/fstab /etc/fstab.bak # 先备份原配置
vi /etc/fstab
标准正确模板:
UUID=<真实UUID> <挂载点> <文件系统类型> defaults,nofail 0 0
配置规范:
- UUID 通过 blkid 复制,禁止手动手写
- 多挂载参数用英文逗号隔开
- 除
/、/boot以外的数据盘,全部添加nofail
自动生成正确配置命令:
bash
echo "UUID=$(blkid -s UUID -o value /dev/sdb) /data xfs defaults,nofail 0 0"
也可直接使用设备路径替代UUID:
/dev/sdb /data xfs defaults,nofail 0 0
步骤6:重启服务器生效
bash
reboot
重启后网络、SSH、tailscaled 等服务自动正常启动。
四、bd01 完整修复步骤
阶段1:紧急恢复远程访问(应急操作)
bash
ip link set ens33 up
dhclient ens33
ip addr show ens33
/usr/sbin/sshd
ss -lntp | grep :22
rm -f /etc/nologin
阶段2:定位故障
bash
journalctl -xb | grep -iE "fail|error|emergency" | tail -50
cat /etc/fstab
错误配置:
UUID= /data xfs defaults 0 0
问题:UUID 为空。
阶段3:验证数据盘
bash
lsblk
blkid /dev/sdb
mount /dev/sdb /mnt
ls /mnt
ls /mnt/pg/13/data
umount /mnt
确认:sdb 为2T XFS磁盘,存储pg、bigdata、minio、redis、logs数据。
阶段4:修复 fstab
bash
cp /etc/fstab /etc/fstab.bak
sed -i '/\/data/d' /etc/fstab
echo "UUID=$(blkid -s UUID -o value /dev/sdb) /data xfs defaults,nofail 0 0" >> /etc/fstab
cat /etc/fstab
修复后示例:
UUID=88d277c3-ab6d-4e38-9f88-7300a142c67b /data xfs defaults,nofail 0 0
阶段5:重启
bash
reboot
阶段6:业务验证
bash
who
mount | grep sdb
df -h | grep data
ls /data
systemctl status sshd
ip addr show ens33
五、bd02 完整修复步骤
阶段1:故障诊断
bash
lsblk
blkid
file -s /dev/sdb
cat /etc/fstab
故障信息:sdb 1.5T XFS磁盘,UUID匹配,参数写错。
错误配置:
UUID=eec3530e-bad7-4ebf-b03d-2cb81fa8fbc5 /data xfs default.nofail 0 0
阶段2:修正挂载参数
bash
cp /etc/fstab /etc/fstab.bak
sed -i 's|xfs default.nofail|xfs defaults,nofail|' /etc/fstab
cat /etc/fstab
修复后配置:
UUID=eec3530e-bad7-4ebf-b03d-2cb81fa8fbc5 /data xfs defaults,nofail 0 0
阶段3:测试挂载
bash
mount -a
mount | grep sdb
df -h | grep data
ls /data
正常输出参考:
/dev/sdb on /data type xfs (rw,relatime,attr2,inode64,noquota)
/dev/sdb 1.5T 431M 1.5T 1% /data
/data 目录包含 bigdata、logs、minio、pg 文件夹。
阶段4:重启
bash
reboot
阶段5:验证
执行命令与 bd01 第六阶段完全一致。
六、事故故障链路
宿主机异常断电
↓
虚拟机强制关机(未执行正常关机)
↓
开机后 systemd 严格校验 fstab 挂载规则
↓
/data 挂载配置存在错误(空UUID/错误参数)
↓
/data 磁盘挂载失败
↓
本地文件系统启动单元失败
↓
系统进入 emergency mode
↓
网卡、SSH、tailscaled 无法自启动
polkit 未启动 → systemctl 命令报错
自动生成 /etc/nologin → 禁止普通用户登录
↓
客户端无法SSH连接、数据库无法访问
↓
控制台登录修复 fstab → 重启 → 业务恢复
七、修复后加固操作
- 备份修复后的 fstab
bash
cp /etc/fstab /etc/fstab.$(date +%F)
- 备份网络与磁盘核心配置
bash
mkdir -p /root/backup/$(date +%F)
cp /etc/fstab /root/backup/$(date +%F)/
cp -r /etc/sysconfig/network-scripts/ /root/backup/$(date +%F)/
- 确认核心服务开机自启
bash
systemctl enable sshd
systemctl enable network
systemctl enable postgresql-13
systemctl enable tailscaled
# 其余业务服务根据实际部署补充
-
VMware 虚拟机快照备份
右键虚拟机 → Snapshot → Take Snapshot
快照命名:
stable-after-fstab-fix-2026-07-02,故障可一键回滚。 -
全机器 fstab 自检
bash
mount -a
echo "fstab check exit: $?"
返回 0 代表配置正常,非0需立即修复。
八、预防同类故障规范
1. 关机操作规范
❌ 禁止操作:
- 直接拔掉宿主机电源
- VMware 点击 Power Off 强制关机
- 长按物理电源按钮断电
✅ 标准操作:
- 虚拟机内执行:
shutdown -h now/poweroff - VMware 菜单:Power → Shut Down Guest(ACPI优雅关机)
2. fstab 编写强制规范
- 除
/、/boot外,所有数据盘挂载必须加nofail - 修改配置后立刻执行
mount -a校验语法 - UUID 使用命令自动获取,禁止手动抄写
- 多参数使用英文逗号分隔,禁止句号
3. 新机器/新增磁盘上线检查清单
任意一项异常,禁止投入业务使用:
bash
mount -a # fstab语法自检
lsblk # 确认磁盘识别正常
df -h # 校验挂载状态
blkid # 记录磁盘UUID
cat /etc/fstab # 人工核对配置
systemctl is-enabled sshd # SSH开机自启
systemctl is-enabled network # 网络开机自启
九、常用速查命令
磁盘与挂载相关
bash
lsblk # 磁盘分区树
blkid # 全磁盘UUID与文件系统
blkid /dev/sdb # 单独查看sdb磁盘
blkid -s UUID -o value /dev/sdb # 仅输出磁盘UUID
file -s /dev/sdb # 校验裸盘文件系统
mount | grep sdb # 查看数据盘挂载状态
df -h | grep data # 查看磁盘容量占用
mount -a # 加载所有挂载并校验报错
Emergency Mode 排查
bash
journalctl -xb # 完整启动日志
journalctl -xb | grep -iE "fail|error" # 过滤启动报错
systemctl --failed # 查看启动失败单元
systemctl list-units --state=failed # 格式化输出失败项
紧急模式临时恢复访问
bash
ip link set ens33 up # 启用网卡
dhclient ens33 # DHCP获取IP
/usr/sbin/sshd # 手动启动SSH
rm -f /etc/nologin # 解除登录限制
fstab 自动生成配置行
bash
echo "UUID=$(blkid -s UUID -o value /dev/sdb) /data xfs defaults,nofail 0 0" >> /etc/fstab
十、总结
两台虚拟机故障根源一致:/etc/fstab 中 /data 挂载配置从部署时就存在错误,正常重启不会触发严格校验;仅在异常断电强制关机后,systemd 完整校验挂载配置,系统进入紧急模式。
统一修复方案:填写正确磁盘UUID、规范挂载参数为 defaults,nofail;日常配合标准关机流程、定期虚拟机快照备份,可彻底避免该故障重复出现。