定位

现场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了。重启,问题解决!