[ 报错 ] 虚拟机异常断电后 Emergency Mode 恢复手册

虚拟机异常断电后 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

典型报错日志:

  1. Job data.mount/start failed with result 'dependency'
  2. Job local-fs.target/start failed with result 'dependency'
  3. Reached target Emergency Mode

出现 xxx.mount 挂载失败,基本判定 /etc/fstab 挂载配置异常。

步骤2:查看 fstab 配置文件

bash 复制代码
cat /etc/fstab

逐项检查规则:

  1. UUID 不能为空
  2. UUID 格式标准 8-4-4-4-12,共36位字符
  3. 挂载目录真实存在
  4. 文件系统类型匹配(xfs/ext4等)
  5. 多参数使用英文逗号分隔,禁止使用句号

步骤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

配置规范:

  1. UUID 通过 blkid 复制,禁止手动手写
  2. 多挂载参数用英文逗号隔开
  3. //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 → 重启 → 业务恢复

七、修复后加固操作

  1. 备份修复后的 fstab
bash 复制代码
cp /etc/fstab /etc/fstab.$(date +%F)
  1. 备份网络与磁盘核心配置
bash 复制代码
mkdir -p /root/backup/$(date +%F)
cp /etc/fstab /root/backup/$(date +%F)/
cp -r /etc/sysconfig/network-scripts/ /root/backup/$(date +%F)/
  1. 确认核心服务开机自启
bash 复制代码
systemctl enable sshd
systemctl enable network
systemctl enable postgresql-13
systemctl enable tailscaled
# 其余业务服务根据实际部署补充
  1. VMware 虚拟机快照备份

    右键虚拟机 → Snapshot → Take Snapshot

    快照命名:stable-after-fstab-fix-2026-07-02,故障可一键回滚。

  2. 全机器 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 编写强制规范

  1. //boot 外,所有数据盘挂载必须加 nofail
  2. 修改配置后立刻执行 mount -a 校验语法
  3. UUID 使用命令自动获取,禁止手动抄写
  4. 多参数使用英文逗号分隔,禁止句号

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;日常配合标准关机流程、定期虚拟机快照备份,可彻底避免该故障重复出现。