在Ubuntu上创建KVM虚拟机有以下几种方式:
- virt-manager: GUI工具
- virt-install: Red Hat开发的python脚本,需要安装
virtinst
包 - ubuntu-vm-builder
推荐使用virt-install,主要原因是通用性 - 这个工具是RedHat开发,可以在RHEL和Ubuntu上使用,并且Ubuntu Server手册主要介绍这个工具。
ubuntu-vm-builder现在只是vmbuilder(属于
pyton-vm-builder
包)的wrpper,主要维护用于兼容旧的脚本。
赞!终于找到正确的串口安装方法(
--console pty,target_type=serial --extra-args 'console=ttyS0,115200n8 serial'
)
virt-install \
--name ubuntu1804 \
--ram 2048 \
--disk path=/var/lib/libvirt/images/ubuntu1804.qcow2,size=10 \
--vcpus 1 \
--os-type linux \
--os-variant ubuntu16.04 \
--network bridge=virbr0 \
--graphics none \
--console pty,target_type=serial \
--location 'http://mirrors.163.com/ubuntu/dists/bionic/main/installer-amd64/' \
--extra-args 'console=ttyS0,115200n8 serial'
不过要注意,这个串口安装过程完成后,操作系统启动后依然不是默认从串口输出的,需要定制内核启动参数。虚拟机串口输出设置请参考访问VM控制台
参考 Easy headless KVM deployment with virt-install 和 Installing Virtual Machines with virt-install, plus copy pastable distro install one-liners ,virt-install(1) - Linux man page
我尝试采用了
--console pty,target_type=virtio
表明采用virtio类型串口,--extra-args 'console=tty0 console=ttyS0,115200'
,但是无法在控制台输入,提示
WARNING Did not find 'console=hvc0' in --extra-args, which is likely required to see text install output from the guest.
然而,我修改成 --extra-args 'console=hvc0 console=ttyS0,115200'
依然是相同提示信息,只不过终端输出了更多的启动硬件检测信息,但是没有登陆控制台。
所以还是按照Easy headless KVM deployment with virt-install设置。
virt-install \
--network bridge:virbr0 \
--name centos7 \
--ram=1024 \
--vcpus=1 \
--disk path=/var/lib/libvirt/images/centos7.img,size=10 \
--graphics none \
--location=http://mirrors.163.com/centos/7/os/x86_64/ \
--extra-args="console=tty0 console=ttyS0,115200"
最初我使用的参数是
--extra-args="console=tty0 console=ttyS0,115200"
(模拟原先设置KVM虚拟机串口输出的参数)报错
WARNING Did not find 'console=ttyS0' in --extra-args, which is likely required to see text install output from the guest.
参考 KVM Guest installed from console. But how to get to the guest's console? 和 KVM Install from Console 应该改成
--extra-args="console=tty0"
。不过依然报错,但是只有终端输出没有终端输入。
上述采用了控制台方式安装
但是出现报错
[ 76.466689] dracut-initqueue[585]: umount: /run/initramfs/squashfs: not mounted
[ 76.470503] dracut-initqueue[585]: /sbin/dmsquash-live-root: line 273: printf: write error: No space left on device
[ 241.174832] dracut-initqueue[584]: Warning: dracut-initqueue timeout - starting timeout scripts
... 不断打印这行超时日志
在打印超时日志后,进入终端修复模式
[ 304.659694] dracut-initqueue[584]: Warning: Could not boot.
[ 304.949309] dracut-initqueue[584]: Warning: /dev/root does not exist
Starting Dracut Emergency Shell...
Warning: /dev/root does not exist
Generating "/run/initramfs/rdsosreport.txt"
Entering emergency mode. Exit the shell to continue.
Type "journalctl" to view system logs.
You might want to save "/run/initramfs/rdsosreport.txt" to a USB stick or /boot
after mounting them and attach it to a bug report.
dracut:/#
- 删除重建虚拟机
virsh destroy centos7
virsh undefine centos7
尝试
virt-install \
--name centos7 \
--ram 1024 \
--vcpus 1 \
--disk path=/var/lib/libvirt/images/centos7.img,size=10 \
--os-type linux \
--os-variant rhl7.3 \
--network bridge=virbr0 \
--graphics none \
--console pty,target_type=serial \
--location 'http://mirrors.163.com/centos/7/os/x86_64/' \
--extra-args 'console=ttyS0,115200n8 serial'
如果使用
--os-variant centos7
会出现ERROR Error validating install location: Distro 'centos7' does not exist in our dictionary
报错,原来这个参数是根据osinfo-query os
输出确定的。可以使用rhl7.3
参考 Installing Virtual Machines with virt-install, plus copy pastable distro install one-liners
可以尝试一下参考前面Ubuntu串口安装方法
改为采用VNC方式,通过图形界面处理:
virt-install \
--network bridge:virbr0 \
--name centos7 \
--ram=2048 \
--vcpus=1 \
--os-type linux \
--os-variant rhl7.3 \
--disk path=/var/lib/libvirt/images/centos7.img,size=10 \
--graphics vnc \
--location=http://mirrors.163.com/centos/7/os/x86_64/
但是这次没有启动consle,只显示
WARNING Graphics requested but DISPLAY is not set. Not running virt-viewer.
WARNING No console to launch for the guest, defaulting to --wait -1