使用libvirt与kickstart部署Ubuntu 16.04 VM时启动卡住问题
我之前在部署Ubuntu 16.04虚拟机时,也碰到过一模一样的问题——kickstart不生效还卡在“Booting from ROM”界面。结合踩过的坑,给你整理几个关键的排查和解决步骤:
这个卡住的现象通常是虚拟机优先尝试从空硬盘启动,或者启动介质配置有问题导致的:
1. 检查启动顺序配置
打开你的libvirt虚拟机XML配置文件,确认<os>部分把CDROM设置为第一启动项:
<os> <type arch='x86_64' machine='pc-i440fx-xenial'>hvm</type> <boot dev='cdrom'/> <boot dev='hd'/> </os>
这里boot dev='cdrom'必须在hd前面,不然虚拟机只会尝试从空硬盘启动,自然卡ROM引导。
2. 验证ISO镜像完整性
损坏的安装镜像也会导致引导失败,用md5sum校验一下你的Ubuntu 16.04 ISO:
md5sum ubuntu-16.04.7-server-amd64.iso
对比官方提供的MD5值,如果不一致,重新下载完整的镜像文件。
启动问题解决后,接下来处理kickstart不执行的核心问题:
1. 确认Kickstart参数传递正确
在libvirt XML的<cmdline>部分,必须正确指定kickstart文件的位置,Ubuntu 16.04的参数格式要注意:
- 如果用HTTP托管kickstart文件:
<cmdline> console=tty0 console=ttyS0,115200n8 ks=http://你的宿主机IP/ks.cfg </cmdline> - 如果用本地磁盘挂载kickstart(比如把ks.cfg放在一个单独的raw镜像里):
<cmdline> console=tty0 console=ttyS0,115200n8 ks=file:/dev/vda1/ks.cfg </cmdline>
注意:不要和RHEL系的kickstart参数混淆,Ubuntu 16.04不需要额外加ksdevice之类的参数。
2. 检查Kickstart文件语法
kickstart文件本身的语法错误会直接导致不执行,开头必须包含核心指令:
install # 选择安装源,用CDROM或者网络源 cdrom # url --url=http://archive.ubuntu.com/ubuntu/dists/xenial/main/installer-amd64/ # 必须设置的基础配置 rootpw --encrypted 你的加密密码 timezone Asia/Shanghai --isUtc bootloader --location=mbr
确保没有遗漏必要指令,比如rootpw、timezone,这些都是安装流程必须的。
3. 避免存储设备配置错误
如果用本地磁盘挂载kickstart,要确保存储设备在libvirt XML里正确定义:
<disk type='file' device='disk'> <driver name='qemu' type='raw'/> <source file='/var/lib/libvirt/images/ks-storage.img'/> <target dev='vda' bus='virtio'/> </disk>
这里的ks-storage.img需要是预先格式化好的ext4镜像,把ks.cfg放在根目录下,虚拟机才能识别到。
Ubuntu 16.04对新硬件支持有限,建议使用兼容的硬件配置:
- 芯片组选择
pc-i440fx-xenial,不要用q35这类新芯片组:<type arch='x86_64' machine='pc-i440fx-xenial'>hvm</type> - 确保开启全虚拟化(
virt-type='hvm'),半虚拟化模式无法正常引导安装ISO。
如果还是不行,用virsh console <你的虚拟机名>连接控制台,查看具体的错误输出——比如“找不到kickstart文件”的提示,能帮你快速定位问题。
内容的提问来源于stack exchange,提问作者nadermx

