故障背景
原系统删除了 swap 逻辑卷或 swap 分区,但没有同步更新以下启动配置:
/etc/default/grub- GRUB/BLS 内核启动参数
- initramfs
- 可能还有
/etc/fstab
系统重启后,内核启动参数仍尝试查找已经不存在的 swap:
rd.lvm.lv=rl/swap
resume=UUID=3f2484ae-a1d5-494b-8803-030af11ee671
这会导致 dracut 在启动阶段等待不存在的设备,表现为启动卡住、超时或进入 emergency mode。
实际发现的问题
在 rescue 环境挂载并进入原系统后,确认:
/etc/fstab 中已经没有有效的 swap 条目,但:
/etc/default/grub 和现有内核启动项中仍残留:
rd.lvm.lv=rl/swap
resume=UUID=3f2484ae-a1d5-494b-8803-030af11ee671
其中这个 UUID 已经不存在。
修复流程
1. 挂载原系统
mkdir -p /mnt/sysimage
mount /dev/mapper/rl-root /mnt/sysimage
mount /dev/sda2 /mnt/sysimage/boot
绑定必要目录:
mount --bind /dev /mnt/sysimage/dev
mount --bind /proc /mnt/sysimage/proc
mount --bind /sys /mnt/sysimage/sys
mount --bind /run /mnt/sysimage/run
进入原系统:
chroot /mnt/sysimage
注意:块设备不能用 mount --bind 挂载,根卷应直接使用 mount /dev/mapper/rl-root /mnt/sysimage。
2. 清除 GRUB 默认参数中的旧 swap 引用
从 /etc/default/grub 中删除:
rd.lvm.lv=rl/swap
resume=UUID=3f2484ae-a1d5-494b-8803-030af11ee671
处理后应只保留根逻辑卷,例如:
GRUB_CMDLINE_LINUX="crashkernel=2G-64G:256M,64G-:512M rd.lvm.lv=rl/root"
3. 更新所有内核启动项
grubby --update-kernel=ALL \
--remove-args="resume=UUID=3f2484ae-a1d5-494b-8803-030af11ee671 rd.lvm.lv=rl/swap"
验证:
grubby --info=ALL | grep -E 'kernel=|args='
确认所有启动项中不再出现 resume= 和 rd.lvm.lv=rl/swap。
4. 重建 initramfs
dracut -f --regenerate-all
该步骤用于清除 initramfs 中缓存的旧 swap 和 resume 配置。
5. 重建 GRUB 配置
grub2-mkconfig -o /boot/grub2/grub.cfg
期间出现的 LVM 文件描述符泄漏警告通常不影响生成结果。
6. 最终验证
grep -RniE \
'3f2484ae-a1d5-494b-8803-030af11ee671|rd\.lvm\.lv=rl/swap|resume=' \
/etc/default/grub /boot/grub2/grub.cfg /boot/loader/entries 2>/dev/null
预期无输出。
同时确认 grubby --info=ALL 中的启动参数只保留 rd.lvm.lv=rl/root,并确认 /etc/fstab 中没有有效 swap 条目。
修复结果
- 旧 swap UUID 已从 GRUB 默认配置中移除
rd.lvm.lv=rl/swap已从所有内核启动项中移除- initramfs 已重新生成
- GRUB 配置已重新生成
/etc/fstab中没有残留有效 swap 配置- 系统已具备正常重启条件
核心结论
删除 swap 后,不能只修改磁盘或 LVM。还必须同步清理:
/etc/fstab/etc/default/grub- BLS/grubby 内核参数
- initramfs
- GRUB 配置
本次重启异常的直接原因,是 GRUB 和 initramfs 仍引用已删除的 swap,而不是 GRUB 引导程序本身损坏。