ARM虚拟化环境搭建

libvirt基本配置

基本配置

  • 组件版本:
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

环境变量配置:

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重定向到串口。

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

享乐主

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值