一、先诊断:RHEL 9 虚拟机进入紧急模式的 5 大核心原因
在进入修复操作前,需先明确紧急模式的触发逻辑 ——RHEL 9 启动时会依次加载 “内核→initramfs→文件系统→关键服务”,任何环节出错都会触发紧急模式。结合 Synology 官方文档及实际案例,DSM 环境下的常见原因可归纳为 5 类,对应不同排查方向:
触发原因  | 具体表现(紧急模式提示信息)  | 常见场景  | 
1. /etc/fstab 配置错误  | 提示 “mount: /mnt/data: can't find in /etc/fstab.” 或 “invalid filesystem type”  | 手动修改 fstab 添加挂载点、UUID 写错、文件系统类型填错(如 xfs 写成 ext4)  | 
2. 虚拟磁盘文件损坏  | 提示 “XFS filesystem corruption”“ext4 filesystem error” 或 “can't access block device”  | 虚拟机异常关机(如 DSM 断电、强制关闭虚拟机)、虚拟磁盘扩容失败  | 
3. initramfs 镜像损坏  | 提示 “error while loading shared libraries” 或 “initramfs not found”  | 内核更新失败(如 yum update kernel 中断)、initramfs 重建不完整  | 
4. 虚拟磁盘挂载点丢失  | 提示 “mount point /mnt/backup does not exist”  | 手动删除挂载目录(如 rm -rf /mnt/data)、目录权限被修改(如 chmod 000 /mnt/data)  | 
5. SELinux 策略冲突  | 提示 “SELinux is preventing mount from mounton access on the directory”  | 开启 SELinux 后,挂载点无正确安全上下文(如未执行 chcon 命令)  | 
关键提醒:进入紧急模式后,系统会提示 “Give root password for maintenance (or press Control+D to continue):”,此时输入 RHEL 9 的 root 密码即可进入命令行维护模式(只读权限,需手动挂载为可写),所有修复操作均需在此模式下执行。
二、4 步修复流程:从进入紧急模式到恢复正常启动
修复的核心逻辑是 “先定位错误原因→再针对性修复→最后验证启动”,以下分 4 步操作,覆盖所有常见原因的解决方案,每步均标注 DSM 虚拟机特有的注意事项:
第一步:进入紧急模式,将根文件系统挂载为可写(基础操作)
紧急模式下默认根文件系统(/)为 “只读权限”,无法修改配置文件(如 fstab)或执行修复命令,需先挂载为可写,步骤:
- 输入 root 密码进入维护模式:
 
虚拟机启动到紧急模式提示后,输入 RHEL 9 的 root 密码(若忘记密码,需通过 RHEL 9 安装介质进入救援模式重置,后续 FAQ 会说明),按 Enter 键进入命令行(提示符为 “sh-5.1#” 或 “root@
localhost:~#”)。
- 查看当前根文件系统挂载状态:
 
执行命令 mount | grep /,查看根分区的挂载参数,若显示 “ro,relatime”(ro=read-only),说明当前为只读,需执行下一步挂载为可写。
- 将根文件系统重新挂载为可写:
 
执行命令 mount -o remount,rw /,无报错则表示挂载成功;再次执行 mount | grep /,确认参数变为 “rw,relatime”(rw=read-write),此时可修改任何系统配置文件。
DSM 虚拟机注意:若执行mount -o remount,rw /提示 “device is busy”,需先关闭虚拟机内可能占用根分区的服务(如systemctl stop NetworkManager),或重启虚拟机重新进入紧急模式(避免 DSM 后台进程占用虚拟磁盘)。
第二步:定位错误原因(3 个核心排查命令)
挂载根分区为可写后,需通过日志和配置文件定位具体错误,推荐使用以下 3 个命令,覆盖 90% 以上的故障场景:
1. 查看启动日志,定位最新错误(最直接)
RHEL 9 的启动日志存储在/var/log/boot.log,执行命令 cat /var/log/boot.log | tail -50(查看最后 50 行日志),重点关注含 “error”“failed”“can't” 的条目,示例:
- 若日志显示 “mount: /mnt/data: can't find in /etc/fstab.”→对应 “fstab 配置错误”;
 
- 若显示 “XFS error -5 occurred at line 123 of file fs/xfs/xfs_buf.c”→对应 “XFS 文件系统损坏”;
 
- 若显示 “SELinux: avc:  denied  { mounton} for  pid=123 comm="mount" name="data" dev="vda3" ino=456 scontext=system_u:system_r:init_t:s0 tcontext=unconfined_u:object_r:default_t:s0 tclass=dir”→对应 “SELinux 策略冲突”。
 
2. 验证 /etc/fstab 配置正确性(高频错误点)
fstab 是启动时自动挂载文件系统的配置文件,90% 的挂载相关错误源于此,执行命令 cat /etc/fstab 查看配置,按以下标准核对每一行(格式:UUID=xxx 挂载点  文件系统类型  挂载参数  0 0):
- UUID 正确性:执行 blkid 查看所有磁盘分区的 UUID,对比 fstab 中的 UUID 是否一致(如 fstab 中UUID=1234-ABCD,blkid 显示/dev/vda3: UUID="1234-ABCD"),UUID 错 1 个字符都会导致挂载失败;
 
- 挂载点存在性:执行 ls -ld 挂载点(如ls -ld /mnt/data),若提示 “No such file or directory”,说明挂载目录被删除,需重建;
 
- 文件系统类型匹配:执行 lsblk -f 查看分区的文件系统类型(如 vda3 为 xfs),对比 fstab 中的类型是否一致(如 fstab 中写 “xfs” 而非 “ext4”)。
 
3. 检查虚拟磁盘文件系统完整性
若日志提示文件系统损坏,需检查对应分区的完整性,执行命令 fsck /dev/vda3(将vda3替换为故障分区,可通过lsblk查看分区列表),注意:
- XFS 文件系统:需用xfs_repair /dev/vda3(xfs 不支持 fsck,专用修复命令),执行前需确保分区未挂载(紧急模式下默认未挂载除根分区外的其他分区,可通过mount | grep vda3确认);
 
- ext4 文件系统:用fsck.ext4 /dev/vda3,若提示 “clean, 1234/5678 files”,说明无损坏;若提示 “errors detected”,按提示输入 “y” 确认修复(修复过程中可能会删除损坏的文件,建议先备份)。
 
第三步:针对性修复(按原因分类操作)
根据第二步定位的错误原因,执行对应修复操作,以下是 5 类常见原因的具体解决方案:
场景 1:/etc/fstab 配置错误(最常见)
执行 nano /etc/fstab 打开配置文件,找到错误行(如UUID=wrong-uuid /mnt/data ext4 defaults 0 0),参考blkid和lsblk -f的结果,修改为正确的 UUID 和文件系统类型(如UUID=correct-uuid /mnt/data xfs defaults 0 0),按Ctrl+O保存,Ctrl+X退出。
执行 mkdir -p 挂载点(如mkdir -p /mnt/data),重建挂载目录;若权限错误,执行 chmod 755 /mnt/data(设置默认权限),chown root:root /mnt/data(设置所有者)。
- 验证修复:执行 mount -a(测试 fstab 所有配置是否能正常挂载),无报错则修复成功;若报错,根据提示进一步修改(如 “bad superblock” 说明文件系统类型仍错)。
 
场景 2:虚拟磁盘文件系统损坏
- 执行 umount /dev/vda3(确保分区未挂载,若提示 “device is busy”,执行fuser -m /dev/vda3查看占用进程,用kill -9 进程ID结束);
 
- 执行 xfs_repair /dev/vda3,若提示 “log needs replaying”,按提示输入 “y” 开始修复,修复完成后显示 “Phase 6 - check inode connectivity: done”;
 
- 执行 mount /dev/vda3 /mnt/data(手动挂载测试),无报错则修复成功。
 
- 执行 umount /dev/vda3;
 
- 执行 fsck.ext4 -f /dev/vda3(-f强制检查,即使系统认为文件系统干净),按提示输入 “y” 确认修复;
 
- 执行 mount /dev/vda3 /mnt/data 测试挂载。
 
DSM 虚拟机注意:若虚拟磁盘是通过 DSM“存储池→虚拟机” 创建的,修复前建议在 DSM 中对虚拟磁盘文件(通常在/volume1/@VirtualMachine/目录下)执行 “检查完整性”(DSM 控制面板→存储→存储池→操作→检查),排除 DSM 侧的磁盘错误。
场景 3:initramfs 镜像损坏
- 执行 dracut -f /boot/initramfs-$(uname -r).img $(uname -r)(重建当前内核的 initramfs 镜像,$(uname -r)自动获取当前内核版本,如5.14.0-xxx.el9.x86_64);
 
- 重建完成后,执行 ls -l /boot/initramfs-$(uname -r).img,确认文件大小不为 0(正常约 100-200MB);
 
- 若重建失败(提示 “missing kernel modules”),需重新安装内核:yum reinstall kernel,再执行上述 dracut 命令。
 
场景 4:SELinux 策略冲突
- 临时关闭 SELinux 测试:执行 setenforce 0(临时关闭,重启后恢复),然后执行 mount -a,若挂载成功,说明是 SELinux 冲突;
 
- 永久配置 SELinux 上下文:执行 chcon -R -t filesystem_t 挂载点(如chcon -R -t filesystem_t /mnt/data,给挂载点添加正确的安全上下文);
 
- 验证:执行 restorecon -v /mnt/data(恢复 SELinux 上下文并显示结果),再执行 mount -a,无报错则修复成功;若需永久关闭 SELinux(不推荐,影响安全性),可修改/etc/selinux/config,将SELINUX=enforcing改为SELINUX=disabled,重启生效。
 
第四步:验证修复效果,确保虚拟机正常启动
修复完成后,需通过 “重启测试” 和 “启动后检查” 确认问题彻底解决,步骤:
- 重启虚拟机:
 
执行 reboot 命令,退出紧急模式并重启虚拟机;在 DSM “虚拟机管理器” 中,观察虚拟机启动状态(从 “启动中” 变为 “运行中”,无报错提示)。
- 启动后检查关键项:
 
虚拟机正常启动后,登录 RHEL 9 系统(图形或命令行),执行以下命令验证:
- mount | grep /mnt/data(确认 fstab 中的挂载点已自动挂载,参数含 “rw”);
 
- df -h(查看磁盘空间,确认虚拟磁盘正常识别);
 
- cat /var/log/boot.log | grep -i error(查看启动日志,无新的 error 条目);
 
- systemctl is-active NetworkManager(确认关键服务正常运行,显示 “active”)。
 
- DSM 侧额外检查:
 
进入 DSM“虚拟机管理器→虚拟机”,选中 RHEL 9 虚拟机,点击 “详情→存储”,确认虚拟磁盘 “状态” 为 “正常”,无 “损坏”“未挂载” 提示;若之前有虚拟磁盘扩容操作,执行 lsblk 确认扩容后的分区已正常识别(如 vda3 从 20GB 变为 50GB)。
三、数据安全保障:修复前的备份技巧(避免数据丢失)
若虚拟磁盘包含重要数据(如业务文件、数据库),修复前建议先备份,避免修复过程中文件损坏,DSM 环境下有 2 种安全备份方式:
1. 通过 DSM 虚拟机快照备份(推荐,快速便捷)
- 进入 DSM“虚拟机管理器→虚拟机”,选中 RHEL 9 虚拟机,确保其处于 “关闭” 状态(若在紧急模式,先执行poweroff关闭);
 
- 点击 “操作→创建快照”,输入快照名称(如 “RHEL9_备份_20240520”),勾选 “拍摄内存快照”(可选,保留当前系统状态),点击 “确定”;
 
- 快照创建完成后,在 “快照” 标签页可看到备份记录,若修复失败,可点击 “恢复” 将虚拟机还原到备份状态。
 
2. 挂载虚拟磁盘文件到 DSM,手动备份数据(适用于无法创建快照的情况)
- 关闭 RHEL 9 虚拟机,在 DSM “File Station” 中找到虚拟磁盘文件(默认路径:/volume1/@VirtualMachine/[虚拟机名称]/[磁盘名称].vmdk 或 .qcow2);
 
- 安装 DSM “Virtual Disk Manager” 套件(套件中心搜索安装),打开后点击 “挂载”,选择虚拟磁盘文件,设置挂载点(如/mnt/vm_disk),点击 “确定”;
 
- 挂载成功后,在 DSM “File Station” 中进入/mnt/vm_disk,找到 RHEL 9 的分区(如/dev/vda3对应的挂载目录),将重要数据(如/home、/var/www)复制到 DSM 其他共享文件夹中,完成手动备份;
 
- 备份完成后,在 “Virtual Disk Manager” 中点击 “卸载”,再启动虚拟机进行修复。
 
四、常见问题 FAQ:解决修复过程中的高频疑问
1. Q:进入紧急模式后,忘记 RHEL 9 的 root 密码,无法进行修复,怎么办?
A:需通过 RHEL 9 安装介质进入救援模式重置密码,步骤:
- 在 DSM 虚拟机管理器中,编辑 RHEL 9 虚拟机的 “CD/DVD” 设置,选择 RHEL 9 ISO 镜像文件(需提前上传到 DSM),设置 “启动顺序” 为 “CD/DVD 优先”;
 
- 启动虚拟机,在 RHEL 9 启动界面按 “e” 编辑启动参数,找到 “linuxefi /vmlinuz-xxx ro root=UUID=xxx”,将 “ro” 改为 “rw init=/sysroot/bin/sh”,按Ctrl+X启动;
 
- 进入单用户模式后,执行 chroot /sysroot(切换到根文件系统),passwd root(输入新 root 密码,按提示确认);
 
- 执行 touch /.autorelabel(更新 SELinux 上下文,避免密码修改后无法登录),exit,reboot,重启后用新密码进入紧急模式。
 
2. Q:修复 fstab 后,执行mount -a提示 “mount: /mnt/data: permission denied”,怎么解决?
A:大概率是权限或 SELinux 问题,分 2 步排查:
① 检查目录权限:执行 ls -ld /mnt/data,确保权限为 “drwxr-xr-x”(755),若不是,执行 chmod 755 /mnt/data;
② 检查 SELinux:执行 getsebool -a | grep mount,确保 “mount_anyfile” 为 “on”,若为 “off”,执行 setsebool -P mount_anyfile on(-P永久生效);或临时关闭 SELinux(setenforce 0)后再测试。
3. Q:修复后虚拟机能正常启动,但重启 DSM 后 RHEL 9 再次进入紧急模式,原因是什么?
A:可能是 DSM 虚拟磁盘挂载顺序变化,导致 RHEL 9 识别的磁盘设备名改变(如 vda3 变为 vdb3),解决方案:
- 进入 RHEL 9 系统,执行 blkid 获取目标分区的 UUID(如/dev/vda3的 UUID);
 
- 执行 nano /etc/fstab,将所有 “/dev/vda3” 这类设备路径改为 “UUID=xxx”(用 blkid 获取的 UUID),保存退出;
 
- 执行 mount -a 测试,后续即使 DSM 磁盘顺序变化,RHEL 9 也能通过 UUID 正确挂载分区,避免复发。
 
总结:RHEL 9 虚拟机紧急模式的预防与修复原则
DSM 环境下 RHEL 9 虚拟机进入紧急模式,本质是 “启动环节的配置或文件异常”,遵循 “预防优先,修复有序” 的原则可大幅减少故障:
- 预防措施:修改 fstab 后先执行mount -a测试;虚拟机正常关机(避免强制关闭);内核更新时确保网络稳定(避免 initramfs 损坏);
 
- 修复原则:先通过日志定位原因(不盲目执行修复命令);修复前备份数据(快照或手动备份);修复后必做重启验证(确保问题彻底解决)。
 
按本文步骤操作,无论是 fstab 错误、文件系统损坏还是 SELinux 冲突,都能高效解决,让 RHEL 9 虚拟机快速恢复正常运行。若遇到复杂场景(如虚拟磁盘物理损坏),可联系 Synology 官方支持,提供 DSM 系统日志和虚拟机配置信息,获取进一步协助。