ibvirt基本配置
基本配置
组件版本:
Compiled against library: libvirt 4.5.0
Using library: libvirt 4.5.0
Using API: QEMU 4.5.0
Running hypervisor: QEMU 4.1.0
关闭selinux:/etc/selinux/config 设置为SELINUX=disabled
设置qemu权限为root:/etc/libvirt/qemu.conf设置为user = “root” 、group = “root”
禁止将qemu日志重定向到virtlogd:/etc/libvirt/qemu.conf设置为stdio_handler = “file”
设置qemu运行时的环境变量:/etc/sysconfig/libvirtd添加LD_LIBRARY_PATH="/usr/local/lib64:/usr/local/lib"(可选)
设置qemu访问能力:/etc/libvirt/qemu.conf设置为(可选)
cgroup_device_acl = [
"/dev/null", "/dev/full", "/dev/zero",
"/dev/random", "/dev/urandom",
"/dev/ptmx", "/dev/kvm",
"/dev/rtc","/dev/hpet",
"/dev/udmabuf"
xml基本配置
配置pci总线:
<controller type='pci' index='0' model='pcie-root'/>
<controller type='pci' index='1' model='dmi-to-pci-bridge'/>(可选)
<controller type='pci' index='2' model='pci-bridge'/>(可选)
配置ISO镜像:
arm架构不支持ide总线,因此使用scsi总线
<disk type='file' device='cdrom'>
<driver name='qemu' type='raw'/>
<source file='/home/CentOS-8.1.1911-aarch64-dvd1.iso'/>
<target dev='sda' bus='scsi'/>
</disk>
使用virtio总线配置系统镜像:
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/home/CentOS_81'/>
<target dev='vda' bus='virtio'/>
</disk>
使用memfd方式配置内存:
<maxMemory slots='16' unit='KiB'>16777216</maxMemory>
<memory unit='KiB'>4194304</memory>
<currentMemory unit='KiB'>4194304</currentMemory>
<memoryBacking>
<source type='memfd'/>
</memoryBacking>
<cpu>
<numa>
<cell id='0' cpus='0-1' memory='2097152' unit='KiB'/>
<cell id='1' cpus='2-3' memory='2097152' unit='KiB'/>
</numa>
</cpu>
配置串口:
<serial type='file'>
<source path='/var/log/console.log'/>
</serial>
<console type='pty' tty='/dev/pts/0'/>
显卡配置:
<video>
<model type='virtio'/>
</video>
Q&A
Q:配置虚机内核命令行,添加串口信息console=tty0 console=ttyS0,9600n8,配置libvirt xml串口源为file文件后,启动虚机后qemu命令行没有file文件的配置,什么原因?
A:使用libvirt管理虚机时,默认情况下libvirt会使能virtlogd服务,将qemu的输出通过管道重定向到virtlogd的后台进程,然后由virtlogd输出到文件中。因此qemu命令行没有file的配置。
UEFI配置
使用UEFI引导虚机有两种方法,一是直接下载edk2包,使用包中自带固件作为uefi固件,二是下载edk2源码包,编译aarch64架构下的ueif固件
固件安装
RPM包安装
yum install edk2-aarch64 -y
固件路径:
/usr/share/AAVMF/AAVMF_CODE.fd或/usr/share/edk2/aarch64/QEMU_EFI.fd
/usr/share/AAVMF/AAVMF_VARS.fd或/usr/share/edk2/aarch64/QEMU_VARS.fd
源码编译安装
下载源码:git clone https://git.qemu.org/git/edk2.git
edk2单独编译,参考官方指导
环境变量配置:
export GCC5_AARCH64_PREFIX=$WORKSPACE/toolchain/gcc-arm-8.2-2019.01-x86_64-aarch64-elf/bin/aarch64-elf-
export PACKAGES_PATH=$WORKSPACE/edk2:$WORKSPACE/edk2-platforms
export IASL_PREFIX=$WORKSPACE/acpica/generate/unix/bin/
export PYTHON_COMMAND=/usr/bin/python
source edk2/edksetup.sh
编译工具:
make -C edk2/BaseTools
编译固件:
build -a AARCH64 -t GCC5 -p Platform/ARM/VExpressPkg/ArmVExpress-FVP-AArch64.dsc -bRELEASE
最终生成:
WORKSPACE/Build/ArmVExpress-FVP-AArch64/<DEBUG|RELEASE>_GCC5/FV/FVP_AARCH64_EFI.fd
edk2作为qemu组件编译
cp -r edk2 /path/to/qemu/roms/edk2
cd /path/to/qemu/roms/
make -j submodules -f Makefile.edk2
make -j efi
固件xml配置
<loader readonly='yes' type='rom'>/usr/share/AAVMF/AAVMF_CODE.fd</loader>(/usr/share/edk2/aarch64/QEMU_EFI.fd as well)
<nvram template='/usr/share/AAVMF/AAVMF_VARS.fd'>/path/to/anyfile</nvram>(/usr/share/edk2/aarch64/QEMU_VARS.fd as well)
Q&A
Q:qemu编译edk2组件时会编译其它架构的固件,我只想编译aarch64架构怎么办?
A:修改/path/to/qemu/Makefile.edk2 中的flashdevs变量,注释掉其它架构
Q:虚机配置好xml后,启动无报错,但是vnc连接显示“显卡未初始化”,可能是什么原因?
A:arm架构的虚机,显卡只支持virtio模式,其它模式如cirrus/vga不支持。检查是否显卡模式配置错误
Q:edk2中常出现的OVMF和AAVMF,以及edk2,它们之间什么关系?
A:虚拟化应用组件最开始使用seabios引导虚机内核,Indel为使UEFI可以引导虚机,发起EDK/EDK2(Intel’s EFI Development Kit II)项目。OVMF(Open Virtual Machine Firmware)作为edk2的子项目,用于在X86平台使用UEFI引导虚机,AAVMF用于在aarch64平台应用UEFI固件引导虚机。
qemu独立启动虚机
qemu单独启动虚机有两个方式,一是通过UEFI固件引导内核,二是通过qemu引导内核,这里介绍使用qemu引导内核的配置,UEFI引导可以参考libvirt管理虚机时的启动的命令行。
qemu引导内核
基本配置
-machine virt,gic_version=host,usb=on,accel=kvm -cpu host -smp 4 -m 4096 -nodefaults
内核与启动镜像配置
-kernel /home/hy/marvel_kernel/vmlinuz-4.18.0-147.el8.aarch64
-append "BOOT_IMAGE=(hd0,gpt2)/vmlinuz-4.18.0-147.el8.aarch64 root=/dev/mapper/cl-root ro crashkernel=auto rd.lvm.lv=cl/root rd.lvm.lv=cl/swap console=ttyAMA0,38400 consol=tty0 "
-initrd /home/hy/marvel_kernel/initramfs-4.18.0-147.el8.aarch64.img
配置pcie根端口
-device pcie-root-port
配置pci桥
-device pcie-pci-bridge
配置启动盘
-drive index=0,if=none,format=qcow2,id=vda,file=/home/CentOS_81
-device virtio-blk-pci,drive=vda
配置串口
-chardev file,id=charserial0,path=/var/log/console.log
-serial chardev:charserial0
配置显卡
-device virtio-gpu,virgl=on,xres=720,yres=1280
-display egl-headless,gl=on,rendernode=/dev/dri/renderD128
配置日志和vnc
-vnc 0.0.0.0:0 -D /var/log/qemu.log
Q&A
Q:命令行中的内核镜像,initramfs,都是从哪儿来的?
A:内核镜像vmlinuz和引导系统initramfs是使用libvirt安装好虚机镜像后,从引导分区/boot目录下拷贝得到的
Q:启动内核时添加的命令行从哪儿来的?
A:内核命令行第一部分从根据cat /proc/cmdline中获取的,console=ttyAMA0,38400 consol=tty0是手动添加的,目的是为了将内核的console重定向到串口。