封尘网

让学习成为一种习惯!

swap分区关闭后导致系统启动失败

最近在Vmware上安装了一个Docker-ce的新版本,用来做K8s的测试环境,由于K8s指明了要关闭swap分区的,所以直接在线使用命令关闭了swap分区。由于当时未把/etc/fstab中的swap挂载点删除。系统重启后导致无法正常进入系统,并出现以下提示。

Welcome to emergency mode!After logging in, type "journalctl -xb" to view system logs, "systemctl reboot" to reboot, "systemctl default" or ^D to try again to boot into default mode.
Give root password for maintenance
(or type Control-D to continue):

其实在系统启动时就已经发觉不对了,启动特别慢。根据屏幕上的要求输入root的密码,查看日志信息。由于kernel的日志信息很多,所以要慢慢翻阅找到问题。

journalctl -xb #查看内核启动日志

排错思路

1 、搜索日志中failed关键字,寻找关键性的问题

通过以下信息大致可以判断内核的驱动管理模块启动失败。因为正常情况下,网卡很少坏(我是虚拟机),其二CPU,内存也不太可能。那最有可能是硬盘(异常关机,断电都有问题出现)

-- The error number returned by this process is 2.
Jan 08 11:05:07 docker-ce systemd[1]: systemd-udevd.service: main process exited, code=exited, status=219/CGROUP
Jan 08 11:05:07 docker-ce systemd[1]: Failed to start udev Kernel Device Manager.
-- Subject: Unit systemd-udevd.service has failed

接着有一段udev启动失败的记录,跟着就是这么一段。LVM,因为我使用了LVM,所以就看到这里,也明显知道是硬盘加载报错了。

-- Unit lvm2-monitor.service has finished starting up.
--The start-up result is done.
Jan 08 11:06:36 docker-ce systemd[1]: Job dev-disk-by\x2duuid-01aec6ff\x2d62fc\x2d4abb\x2da75e\x2d3b30d5b5e586.device/start timed out.
Jan 08 11:06:36 docker-ce systemd[1]: Timed out waiting for device dev-disk-by\x2duuid-01aec6ff\x2d62fc\x2d4abb\x2da75e\x2d3b30d5b5e586.device.
-- Subject: Unit dev-disk-by\x2duuid-01aec6ff\x2d62fc\x2d4abb\x2da75e\x2d3b30d5b5e586.device has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel

这上面会对每个LV都检查,只能通过了才能进入下一步。当我看到以下代码段时,就想到问题了。

-- Unit dev-mapper-centos\x2dswap.device has failed.
-- The result is timeout.
Jan 08 11:06:36 docker-ce systemd[1]: Dependency failed for /dev/mapper/centos-swap.
-- Subject: Unit dev-mapper-centos\x2dswap.swap has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- Unit dev-mapper-centos\x2dswap.swap has failed
swap分区,因为我记得我关闭了swap分区的,这里报错,极有可能就是它了。看完日志后发现,最后的错误也就停在这里了。说明是swap分区关闭了,而/etc/fstab文件和内核的启动参数也加载了swap分区导致这个问题的发生。

解决方法:(请看完全文)

  • 通过上面的方式进入系统后,先确认是否关系了swap分区,为零时表示禁用了。

    [root@docker-ce ~]# free -m
          total        used        free      shared  buff/cache   available
    Mem:            973          99         762           6         111         735
    Swap:             0           0           0
    
  • 去掉/etc/fstab配置中关于swap分区的一行。

    [root@docker-ce ~]# sed -i /swap/d /etc/fstab
  • 重启机器

reboot

问题越踩越深

此时,重启后你会发现问题依然存在,为什么呢?当我再次进入系统时,通过lvs发现系统中还有一个/dev/mapper/centos-swap 的LV存在,顿时就觉得是不是它导致的呢?于是执行命令删除lv。

lvremove /dev/mapper/centos-swap

删除时,提示成功了。但是也卡着,不知道为什么,然后我强制重启了机器(虚拟机无所谓)。

接下来发现另一个问题了,机器重启后很久,直接进入了dracut (事件驱动模式),这下不得了了,系统真坏了。脑子第一种想法就是,要不删除重建一个吧。但是不甘心,眼看就要搞定的了,于是想尝试进入单用户模式修复。

重启后,准备进入单用户模式时,要修改grup 的时候,找到了linux16 那行,我发现有rd.lvm.lv=centos/swap这段,瞬间找到了问题。可以不用进入单用户模式了。直接把这段删除,按下ctrl+X 进入系统。

进入系统后第一步就是把这个grub配置修改,保存下来,不然直接重启就会跟刚才一样。

vim /boot/grub2/grub.cfg     #删除rd.lvm.lv=centos/swap 这一段,保存重启即可。

至此成功修复了上面的问题,其实主要问题就是系统使用了LVM来规分磁盘,而swap分也是在LVM管理中,我在安装完k8s后把swap分区禁用了,但是并没有处理/etc/fstab文件,和grub.cfg启动文件。才导致系统在启动时又去加载一个不存在,或者已经禁用的分区,才会出现上面这一段乌龙事件。

dracut 了解得不多,如果有兴趣可以到这个网址查阅:

https://mirrors.edge.kernel.org/pub/linux/utils/boot/dracut/dracut.html#dracutkernel7

提醒:本文最后更新于 17 天前,文中所描述的信息可能已发生改变,请谨慎使用。