Skip to main content

修复CentOS 9 Stream移除swap分区后无法启动的问题

近日闲来无事,维护HomeLab服务器中的一台装有CentOS 9 Stream的虚拟机时,发现其中启用了一个1 GiB大小的swap分区。由于安装该虚拟机时使用的是默认设置,这一定是安装程序创建的。顺手移除后,修改/etc/fstab中对应条目并reboot,然而其后发现机器起不来。此文将记录这一问题的解决过程。

定位

现场console日志中有大量的dracut timeout字样,随后系统自动进入dracut emergency shell。通过Google搜索相关的关键字,发现Red Hat Bugzilla上有一个类似的case:Bug 1346231 - unbootable after removing swap partition。其中提到了需要从/etc/default/grub中移除swap字样的配置,果断挂载磁盘,并杀去/etc/default/grub。果不其然,这里面依然残留着swap分区相关的配置。

修复

找到了问题所在,修复过程一般都很简单。从/etc/default/grub中找到以下相关的内容并删除:

resume=/dev/mapper/cs-swap rd.lvm.lv=cs/swap

更新这个配置文件后,我们应当重新生成/boot/grub2/grub2.cfg才能保证修改生效。首先我们挂载boot分区:

mount /dev/disk/by-uuid/<your_boot_disk_uuid> /mnt/boot

然后运行一下命令,应该就能更新配置了:

grub2-mkconfig > /mnt/boot/grub2/grub.cfg

但这个时候出现了新的问题。首先,dracut emergency shell中并不自带这个脚本。即使我们通过chroot进入新环境来解决这个问题,它也需要依赖/sys/proc/dev这三个分区。简单chroot后的环境中是没有挂载这三个分区的。如何解决呢?这就不得不提到mount提供的--bind参数:该参数可以让指定的两个目录指向相同一片区域,这就保证我们在chroot后也能使用应急shell环境中这三个分区提供的信息了。那么,在chroot前我们应该先重新挂载这三个分区:

mount --bind /dev /mnt/dev
mount --bind /sys /mnt/sys
mount --bind /proc /mnt/proc

重新chroot后,对命令稍作调整:

grub2-mkconfig > /boot/grub2/grub.cfg

这时我们可以成功更新grub.cfg了。重启,问题解决!