你是不是有过这样的经历:辛辛苦苦打包好的 Linux 镜像,挂上虚拟机或云服务器后——启动,黑屏、卡死、报错、进不了系统。顿时一脑门子问号:为啥我镜像打得好好的,启动不了?别急,这事儿不稀奇。
一、先分清几种“启动失败”的表现
黑屏,无输出:初步判断可能是引导程序缺失、GRUB 配置错误
卡在 GRUB 界面:初步判断可能是GRUB 找不到系统内核
报错找不到 root:初步判断可能是fstab 配置或硬盘挂载问题
内核 panic:初步判断可能是内核损坏、模块缺失或驱动不匹配
无限重启:初步判断可能是grub、init、systemd 逻辑错误
二、排查大纲(快速上手版)
简单记住一句话:看 grub、查 uuid、核 initrd、修 fstab。
1. 看 grub 引导有没有问题
进入虚拟机,看是否进入了 GRUB 菜单。如果能看到 grub,按 e 进入编辑界面,重点看下面几行:
linux /boot/vmlinuz-xxx root=UUID=xxxxx ro
initrd /boot/initrd.img-xxx
检查点:
- /boot 目录是否存在?
- vmlinuz 和 initrd 是否存在?
- root 的 UUID 是否正确?(对不上的话,系统找不到根目录)
可以用 livecd 启动后执行:
blkid
核对 UUID 是否跟 grub 里配置的一致。
2. 修复 grub(推荐命令组合)
进入 livecd 环境或 rescue 模式,挂载原系统后修复 grub:
mount /dev/sda1 /mnt # 假设 / 是 sda1
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
chroot /mnt
grub-install /dev/sda
update-grub
完成后退出,重启试试。
3. 看 initrd/initramfs 是否生成正确
这个是很多人容易忽略的一步。你镜像可能来自另一套硬件,或者是通过某种“打包”工具导出的,如果 initrd 没有包含当前硬件/云平台需要的驱动(比如磁盘、网络、文件系统模块),就会直接挂掉。
处理方法:
chroot /mnt
update-initramfs -u
或强制重建:
update-initramfs -c -k all
4. 检查 /etc/fstab
很多镜像启动失败其实是 fstab 配置错了。典型错误:
- 引用了不存在的分区 UUID
- 指定了错误的挂载顺序或格式
- 引导分区设置了错误参数(如 /boot 被标记为 noauto)
建议修改 /etc/fstab,用 /dev/sdX 测试先启动起来,之后再替换成 UUID。
nano /etc/fstab
示例简化版:
/dev/sda1 / ext4 defaults 0 1
/dev/sda2 /boot ext4 defaults 0 2
5. 看看是不是内核太老 or 云平台不兼容
云服务器镜像经常卡在这里:
- 用的是很老的内核(比如 3.x),但云平台要求 4.18+
- 云平台默认使用 virtio 驱动,但你的镜像内核压根不支持
解决方案:
进入 chroot 后更新内核:
apt update && apt install linux-image-generic
或:
yum update kernel
如果你用的是 qemu 或 KVM 创建的镜像,要确保加了必要的模块:
virtio_blk virtio_pci virtio_net
可以在 /etc/initramfs-tools/modules 里添加,再重新打包 initrd。
三、镜像打包时的注意事项(防止问题复现)
启动失败很多时候是“临走前没收拾好”:
- 推荐 checklist:
- 更新 grub(update-grub)
- 重新生成 initrd(update-initramfs -c -k all)
清理 udev 规则(避免设备命名冲突)
rm -f /etc/udev/rules.d/70-persistent-net.rules
清理 ssh host key(避免冲突):
rm -f /etc/ssh/ssh_host_*
- 用通用内核(generic kernel)替代定制内核
- 检查 cloud-init 或 netplan 配置(特别是在云上用时)
遇到问题,别重装,先排查!Linux镜像启动失败不是世界末日,99% 情况下都是配置缺失、路径错位或者驱动问题。只要你能进入livecd 或 chroot,一切都还有得救。