当我把一台Linux服务器从 Debian 8 升级到 9.0 (apt full-upgrade),并且更新了Kernel之后,遇到问题。服务器无法正常启动了。报错信息如下:
"Gave up waiting for root device. Common Problems:
- Boot args (cat /proc/cmdline)
- Check rootdelay = (did the system wait long enough?)
- Check root = (did the system wait for the right device?)
- Missing module (cat /proc/modules; ls /dev)
ALERT! /dev/mapper/server--vg-root does not exist. Dropping to shell!"
排查发现:
- 仅仅只是新的Kernel不能启动,如果在Grub菜单中选择在旧的Kernel,还是可以启动的。
- 服务器启用了LVM,配置了lv (XXX-root),并且设置为root
- 启动时报错 “ALERT /dev/mapper/XXX-root does not exist DROPPING to Shell”,应该是不能正常挂接这个root
尝试解决:
- run update-initramfs -u 重建 initramfs
- apt reinstall linux-image-XXXversion
- update grub
- 检查 grub
- 其中有个帖子分析的很多 : https://ubuntuforums.org/showthread.php?t=2264947
- 等等。。。。
但是以上均没有解决问题!
但基本可以确定:1.grub没问题; 2.磁盘没问题,因为旧kernel可以启动; 3.kernel没问题,因为是通过apt-get直接安装的;
但是问题有和新kernel有关系,那么可以判断问题一定出在新核心的安装过程中已经安装后的一些相应变化中。
原因以及如何解决?
- 最后发现这台服务器中的LVM2被卸载掉了,而一台运行中的LVM的,即使LVM被卸载并不会影响他的运行,而这洽洽是问题难以发现的原因!
- LVM的相关modules会在Linux Kernel 安装和更新时通过 update-initramfs 打包到启动映像中( /boot/initrd.img-x.x.x-amd64 ),因此即使LVM被卸载,系统仍然可以正常启动和工作。
- 当安装一个新的kernel时候,系统自动通过 update-initramfs ,生成启动影响,而这时如果系统中的lvm已经被卸载,那么生成的映像中也就没有了lvm的支持库,这就是问题的根本原因!!
解决方法:
apt install lvm2
update-initramfs -u -k all
### DONE ####
在解决问题的过程发现有着大量的更新kernel后不能启动的问题,表现和原因各种各样,对照很多帖子进行排查,均没有解决问题,最终的原因还是自己找到的。
通过这个问题的解决,发现由于Linux 的 initramfs 这个机制的存在,kernel需要在本地进行一定处理来生成 initd.img。如果遇到新kernel不能启动,而旧kernel可以启动的情形,应该可以基本断定,问题出在 initrd.img 上面, 或者出在 update-initramfs 运行的系统环境及状态上面。
遗留问题:
系统可以正常启动了,但是在启动开始时会出现一句提示:
Failed to connect to lvmetad.
lvmetad 是 lvm的一个驻留服务,缓存相关信息。但是当 initramfs运行时,这个lvmetad 应该不可能启动的,那么为什么会出现这样提示?kernel 为什么要尝试 connect to lvmetad?