CentOS系统启动陷入dracut模式:/dev/centos/swap缺失的修复指南

张开发
2026/4/15 19:25:24 15 分钟阅读

分享文章

CentOS系统启动陷入dracut模式:/dev/centos/swap缺失的修复指南
1. 问题现象与原因分析最近在CentOS 7.7系统上部署Kubernetes集群时遇到了一个典型的启动故障系统卡在dracut紧急模式屏幕上不断刷出/dev/centos/swap does not exist的错误提示。这种情况通常发生在手动删除swap分区后系统启动时仍然尝试挂载已经不存在的swap分区导致的。我仔细排查后发现问题的根源在于LVM逻辑卷管理机制。CentOS默认安装时会创建名为centos的卷组其中包含root和swap两个逻辑卷。当我们在部署Kubernetes时按照官方建议禁用swap后如果直接删除了/dev/centos/swap这个逻辑卷但没有同步更新系统启动配置就会导致这个典型的启动故障。这个问题其实非常具有代表性特别是在以下三种场景中部署Kubernetes集群时按要求禁用swap服务器内存充足时主动关闭swap以提升性能误操作删除了swap分区但未完整清理配置2. 进入救援环境2.1 理解dracut模式当看到系统进入dracut紧急模式时不要慌张。dracut实际上是CentOS 7使用的初始化ramdisk工具它会在系统启动初期加载必要的驱动和工具。进入这个模式说明系统在挂载根文件系统时遇到了问题但幸运的是它提供了一个可用的shell环境供我们修复问题。在这个环境下我们首先需要挂载原始系统的根分区。通过以下命令可以查看可用的存储设备dracut# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT vda 252:0 0 50G 0 disk ├─vda1 252:1 0 1G 0 part └─vda2 252:2 0 49G 0 part ├─centos-root 253:0 0 45G 0 lvm └─centos-swap 253:1 0 4G 0 lvm2.2 挂载根分区确认设备后我们需要创建一个临时目录并挂载根分区dracut# mkdir /tmp1 dracut# mount /dev/mapper/centos-root /tmp1这里有个关键点需要注意如果系统使用了LVM设备路径通常是/dev/mapper/下的逻辑卷名称而不是直接的磁盘分区。挂载成功后我们就可以访问原始系统的文件系统了。3. 修改GRUB配置3.1 编辑grub配置文件现在我们需要修改GRUB的配置文件移除对swap分区的引用。使用以下命令编辑文件dracut# vi /tmp1/etc/default/grub找到以GRUB_CMDLINE_LINUX开头的行原始内容可能类似这样GRUB_CMDLINE_LINUXcrashkernelauto rd.lvm.lvcentos/root rd.lvm.lvcentos/swap rhgb quiet我们需要删除其中的rd.lvm.lvcentos/swap部分修改后应该变成GRUB_CMDLINE_LINUXcrashkernelauto rd.lvm.lvcentos/root rhgb quiet这个修改非常重要它告诉系统启动时不需要再尝试挂载已经不存在的swap分区。3.2 处理fstab文件虽然主要问题出在GRUB配置上但为了彻底解决问题我们还需要检查/tmp1/etc/fstab文件确保其中没有对swap分区的引用。使用以下命令查看dracut# cat /tmp1/etc/fstab如果发现类似下面的行可以将其注释掉或删除/dev/mapper/centos-swap swap swap defaults 0 04. 更新boot分区配置4.1 定位boot分区boot分区通常是一个独立的分区我们需要先找到它。通过查看fstab文件可以获取线索dracut# cat /tmp1/etc/fstab查找包含/boot挂载点的行通常会显示类似这样的信息UUID22747de8-b577-4bbb-9b5e-40c1b8c3c504 /boot xfs defaults 0 0然后使用blkid命令确认设备路径dracut# blkid /dev/vda1: UUID22747de8-b577-4bbb-9b5e-40c1b8c3c504 TYPExfs4.2 挂载boot分区创建临时目录并挂载boot分区dracut# mkdir /tmp2 dracut# mount /dev/vda1 /tmp24.3 修改grub.cfg文件boot分区挂载后我们需要更新GRUB的实际配置文件dracut# vi /tmp2/grub2/grub.cfg在这个文件中我们需要查找并删除所有包含rd.lvm.lvcentos/swap的部分。通常需要修改两处常规内核启动参数救援内核启动参数修改前linux16 /vmlinuz-3.10.0-1062.el7.x86_64 root/dev/mapper/centos-root ro crashkernelauto rd.lvm.lvcentos/root rd.lvm.lvcentos/swap rhgb quiet修改后linux16 /vmlinuz-3.10.0-1062.el7.x86_64 root/dev/mapper/centos-root ro crashkernelauto rd.lvm.lvcentos/root rhgb quiet5. 完成修复并重启5.1 卸载挂载点在重启前我们需要先卸载所有临时挂载的分区dracut# umount /tmp2 dracut# umount /tmp1这个步骤很重要确保文件系统完整性。5.2 重启系统最后执行重启命令dracut# reboot系统应该能够正常启动了。如果一切顺利你会看到常规的登录界面而不是dracut紧急模式。6. 后续建议与注意事项在实际运维中我遇到过几次类似情况总结出一些经验教训首先在修改系统存储配置时特别是涉及LVM和swap的操作一定要先备份相关配置文件。一个简单的cp命令可能就能省去很多麻烦。其次如果确实需要禁用swap推荐的操作流程是先用swapoff命令停用swap注释掉/etc/fstab中的swap行修改GRUB配置最后再考虑是否删除逻辑卷对于Kubernetes环境其实从1.8版本开始只需要设置kubelet的--fail-swap-on参数为false就可以在带有swap的节点上运行不一定非要删除swap分区。另外建议在修改前先使用blkid、lsblk、vgs、lvs等命令全面了解当前存储配置做到心中有数再操作。

更多文章