OpenStack Ubuntu虚机启动卡在GRUB引导的排查与修复指南

张开发
2026/5/31 21:21:45 15 分钟阅读
OpenStack Ubuntu虚机启动卡在GRUB引导的排查与修复指南
1. 问题现象与初步分析最近在OpenStack环境中遇到一个典型故障Ubuntu虚拟机重启后卡在booting from hard disk界面无法继续启动系统。这个现象特别有意思因为按照正常启动流程booting from hard disk提示应该出现在GRUB引导之前但这次却卡在了GRUB之后。我第一反应是检查控制台输出。通过OpenStack的VNC控制台观察发现系统确实停在了这个界面没有任何后续输出。这种情况通常意味着系统其实已经在运行只是控制台看不到输出而已。就像你家电视开着但屏幕不亮可能是信号源选错了不一定是电视坏了。查阅社区资料时发现大多数类似问题的讨论都集中在Nova配置或镜像元数据设置上。但我的情况特殊——这台虚拟机之前运行完全正常只是在重启后出现问题所以基本可以排除平台配置问题。这就像你家的电灯昨天还能用今天突然不亮了大概率不是电厂的问题而是你家电路或灯泡的问题。2. GRUB手动引导实战操作当虚拟机卡在引导界面时我们可以尝试手动引导进入系统。这个方法就像汽车打不着火时老司机会用推车启动的土办法。具体操作如下在GRUB界面按c键进入命令行模式使用ls命令查看可用硬盘设备。你会看到类似(hd0)、(hd0,msdos1)的列表确定你的/boot分区。通常较小的分区如500MB就是/boot分区设置根设备set root(hd0,msdos1)根据实际情况替换分区号加载内核linux /vmlinuz-xxx ro root/dev/vda2xxx用Tab键补全加载initrdinitrd /initrd.img-xxx启动系统boot这里有个实用技巧在GRUB命令行中按Tab键可以自动补全文件名。比如输入linux /vml后按Tab会自动列出所有匹配的内核文件。这个功能在记不清完整文件名时特别有用。我遇到过几次手动引导时找不到正确分区的情况。这时候需要耐心尝试不同的分区组合就像试钥匙开锁一样。有一次发现(hd0,msdos1)不对换成(hd0,gpt1)就成功了这是因为磁盘分区表格式不同。3. 控制台输出重定向问题排查成功进入系统后首先要检查的就是GRUB配置。打开/etc/default/grub文件重点查看GRUB_CMDLINE_LINUX参数。果然发现了问题——配置中只设置了consolettyS0这意味着所有控制台输出都被重定向到了串口。在OpenStack环境中我们通过VNC看到的实际上是tty0的输出。当系统只输出到ttyS0时VNC就会显示黑屏就像你把显示器插错了接口。正确的做法是同时配置tty0和ttyS0GRUB_CMDLINE_LINUXconsoletty0 consolettyS0,115200n8这个配置既保留了串口输出方便日志收集又确保了VNC控制台能看到内容。我建议无论是否需要串口都保留tty0配置这相当于给控制台输出上了双保险。4. GRUB配置修复与验证修改完GRUB配置后需要重新生成引导文件。对于Ubuntu系统执行以下命令sudo update-grub2这个命令会做三件事根据/etc/default/grub生成新的grub.cfg自动检测可用内核生成对应的initrd镜像有一次我遇到update-grub2执行成功但问题依旧的情况。后来发现是/boot分区空间不足导致新生成的文件没有完整写入。用df -h检查发现/boot已经100%使用了清理旧内核后问题解决。验证阶段有个小技巧可以在重启前先用grub-editenv list命令检查当前GRUB环境变量。如果看到saved_entry指向正确的内核版本就说明配置更新成功了。5. 深度排查与进阶技巧如果上述方法无效就需要更深入的排查。我总结了一个检查清单磁盘检查sudo fsck /dev/vda1 sudo mount /dev/vda1 /mnt ls -l /mnt/boot内核参数检查cat /proc/cmdline dmesg | grep -i errorOpenStack元数据检查openstack server show vm_id -c properties曾经遇到过一个棘手案例系统能启动但特别慢最后发现是GRUB配置中多了个quiet参数把错误信息都屏蔽了。去掉这个参数后才看到是某个服务启动超时。这告诉我们有时候安静不一定是好事。对于生产环境我建议在镜像制作阶段就做好以下预防措施在/etc/default/grub中预先配置多控制台输出定期检查/boot分区使用情况保留至少两个旧内核作为备份在OpenStack镜像属性中设置合理的hw_disk_bus和hw_vif_model6. 典型误区和避坑指南在处理这类问题时新手常会陷入几个误区误区一盲目修改Nova配置看到网上说修改nova.conf的virt_type能解决问题就直接去改。实际上如果虚拟机之前运行正常这通常不是根本原因。我就见过有人把kvm改成qemu后性能下降50%的情况。误区二忽视控制台类型以为所有输出都会自动显示在VNC上没考虑到控制台重定向的问题。这就像以为所有电视频道都会自动搜索出来其实可能需要手动设置信号源。误区三过度依赖自动修复有些同学喜欢直接重装GRUB而不先排查具体原因。这就像电脑出问题就重装系统可能暂时解决了问题但没找到根本原因。最稳妥的排查思路应该是先尝试手动引导进入系统检查现有配置是否有明显错误对比正常工作的同类虚拟机配置最后才考虑重建引导记录7. 相关工具和命令速查为了方便日常运维我整理了一份实用命令清单GRUB相关命令# 查看GRUB环境变量 grub-editenv list # 安装GRUB到磁盘 grub-install /dev/vda # 生成新的GRUB配置 grub-mkconfig -o /boot/grub/grub.cfg系统信息查询# 查看当前内核参数 cat /proc/cmdline # 查看磁盘分区 lsblk -f # 查看启动日志 journalctl -bOpenStack操作# 查看虚拟机控制台日志 openstack console log show vm_id # 更新镜像属性 openstack image set --property hw_disk_busvirtio image_id这些命令就像汽车维修工的工具箱不同的问题需要不同的工具组合。建议把这些保存成备忘单遇到问题时可以快速查阅。8. 从内核角度理解引导过程要真正理解这个问题我们需要稍微深入Linux的启动流程。当系统启动时BIOS/UEFI加载磁盘的MBR/GPTMBR中的GRUB第一阶段加载core.imgGRUB读取/boot/grub/grub.cfg根据配置加载内核和initrd内核初始化硬件包括控制台设备根据cmdline参数确定控制台输出方式关键在于第5步如果内核参数只指定了ttyS0而你的VNC连接的是tty0就会看到假死现象。这就像打电话时开了静音对方能听到你你却听不到对方。有个实验可以验证这点在GRUB命令行临时修改启动参数加上consoletty0如果这样能正常显示就确认是控制台配置问题。这个方法我在排查时屡试不爽。9. 镜像制作最佳实践预防胜于治疗在制作OpenStack镜像时就应该注意控制台配置sed -i s/GRUB_CMDLINE_LINUX.*/GRUB_CMDLINE_LINUXconsoletty0 consolettyS0,115200n8/ /etc/default/grub文件系统检查tune2fs -c 1 /dev/vda1 # 每挂载1次就检查清理旧内核apt-get autoremove --purge设置正确的时区timedatectl set-timezone Asia/Shanghai我习惯在制作镜像时跑一遍这些命令这就像新车出厂前的质检流程能避免很多后续问题。特别是对于自动化部署的场景这些细节尤为重要。10. 复杂场景下的解决方案有时候问题会更复杂比如遇到LVM分区或加密分区的情况。这时手动引导就需要更多步骤先加载LVM模块insmod lvm vgchange -ay查找根分区ls /dev/mapper/在GRUB中指定正确的根设备set root(hd0,gpt1) linux /vmlinuz root/dev/mapper/vg0-root有一次客户使用了全盘加密连/boot都是单独分区加密的。这种情况下就需要先解密再挂载过程就像开保险箱先输入第一层密码GRUB解密/boot再输入第二层密码系统解密根分区。这种场景下控制台配置就更重要了因为任何错误都需要通过控制台反馈给用户。

更多文章