共计 4513 个字符,预计需要花费 12 分钟才能阅读完成。
编译UEFI,替换yum安装的edk2
由于在ARM平台上使用KVM虚拟化,只能支持UEFI的启动方式启动虚拟机,我们也有修改UEFI的需求,因此需要自行编译替换UEFI固件,这里记录一下ARM64架构下的UEFI编译过程,以及虚拟机启动过程。
UEFI编译,edk2
下载edk2源, EDK2 是一个开源的、用于开发 UEFI 固件的工具和框架。它是 UEFI 规范的一个实现,提供了一个用于构建 UEFI 固件的开发环境。
git clone https://github.com/tianocore/edk2.git
git clone https://github.com/tianocore/edk2-platforms.git
git clone https://github.com/tianocore/edk2-libc.git
git clone https://github.com/tianocore/edk2-non-osi.git
git clone https://git.linaro.org/uefi/uefi-tools.git
先进入edk2,切换到我们想要编译的版本
cd edk2
git tags -a
git checkout -b 202208 edk2-stable202208 //拉取远程的edk标签到本地
git submodule update --init //更新子模块
然后,我们主要利用uefi-tools.git,直接一键构建即可。需要配置该文件 vim uefi-tools/edk2-build.sh

# armvirtqemu64是platforms名字
./uefi-tools/edk2-build.sh armvirtqemu64 -b DEBUG
使用--help
可以查看对应的平台,我们需要ARM64因此为armvirtqemu64。
[root@haiweieuler UEFI]# ./uefi-tools/edk2-build.sh --help
usage:
uefi-build.sh [-b DEBUG | RELEASE] [ all | juno | fvp | tc2 | overdrive | overdrive1000 | cello | hikey | hikey960 | d03 | d05 | d06 | armada70x0 | armada80x0 | mcbin | chaoskey | beagle | sni-box | capsuleapp | androidboot | androidfastboot | armvirtqemu | armvirtqemu64 | helloworld | sgi575 | ovmfx64 | ovmfia32 | rpi3 ]
all build all supported platforms
juno build aarch64 Juno
fvp build aarch64 FVP RTSM
tc2 build Versatile Express TC2
sni-box build Socionext SynQuacer development box
capsuleapp build EDK2 Capsule Update application
androidboot build Android Boot app
androidfastboot build Android FastBoot app
armvirtqemu build ArmVirtPkg QEMU
armvirtqemu64 build ArmVirtPkg QEMU
helloworld build EDK2 Hello World Example
sgi575 build ARM SGI575 FVP
ovmfx64 build OVMF X64
ovmfia32 build OVMF IA32
rpi3 build Raspberry Pi 3
编译完成后,可在该目录下看到Build目录,目录下包含生成EFI固件(QEMU_EFI.fd)和对应的虚拟机的 NVRAM(非易失性随机存取存储器)数据QEMU_VARS.fd。

现在我们需要制作flash,对的如果直接使用EFI.fd和VARS.fd可能会出现如下错误。
错误 1 Could not open ‘/data/lyy/vm/FV/QEMU_EFI.fd’: Permission denied
Oct 13 17:30:50 haiweieuler libvirtd[698131]: internal error: process exited while connecting to monitor: qemu-kvm: -chardev socket,id=charmonitor,fd=34,server,nowait: warning: short-form boolean option 'server' deprecated#012Please use server=on instead#012qemu-kvm: -chardev socket,id=charmonitor,fd=34,server,nowait: warning: short-form boolean option 'nowait' deprecated#012Please use wait=off instead#012qemu-kvm: -vnc 0.0.0.0:0,password: warning: short-form boolean option 'password' deprecated#012Please use password=on instead#0122023-10-13T09:30:50.686764Z qemu-kvm: -blockdev {"driver":"file","filename":"/data/lyy/vm/FV/QEMU_EFI.fd","node-name":"libvirt-pflash0-storage","auto-read-only":true,"discard":"unmap"}: Could not open '/data/lyy/vm/FV/QEMU_EFI.fd': Permission denied
解决办法:查看日志/var/log/message

感觉是Selinux的问题,因此我们直接关闭Selinux
[root@haiweieuler FV]# getenforce
Enforcing
[root@haiweieuler FV]# setenforce 0
[root@haiweieuler FV]# getenforce
Permissive
错误2 qemu-kvm: device requires 67108864 bytes, block backend provides 2097152 bytes
virsh start ubuntu2204
error: Failed to start domain ubuntu2204
error: internal error: process exited while connecting to monitor: qemu-kvm: -chardev socket,id=charmonitor,fd=34,server,nowait: warning: short-form boolean option 'server' deprecated
Please use server=on instead
qemu-kvm: -chardev socket,id=charmonitor,fd=34,server,nowait: warning: short-form boolean option 'nowait' deprecated
Please use wait=off instead
qemu-kvm: -vnc 0.0.0.0:0,password: warning: short-form boolean option 'password' deprecated
Please use password=on instead
2023-10-13T09:31:32.743526Z qemu-kvm: device requires 67108864 bytes, block backend provides 2097152 bytes
或者
error: Failed to start domain openEuler2203
error: internal error: qemu unexpectedly closed the monitor: qemu-kvm: -chardev socket,id=charmonitor,fd=34,server,nowait: warning: short-form boolean option 'server' deprecated
Please use server=on instead
qemu-kvm: -chardev socket,id=charmonitor,fd=34,server,nowait: warning: short-form boolean option 'nowait' deprecated
Please use wait=off instead
qemu-kvm: -vnc 0.0.0.0:0,password: warning: short-form boolean option 'password' deprecated
Please use password=on instead
2023-10-13T09:33:29.225102Z qemu-kvm: device requires 67108864 bytes, block backend provides 786432 bytes
原因:提示必须使用64MB的固件,因此我们使用QEMU_EFI.fd和QEMU_VARS.fd制作64MB的闪存。
dd if=/dev/zero of=QEMU_EFI-pflash.raw bs=1M count=64 #dd是复制,if是输入,of是输出,bs是块大小,count是块数量
dd if=QEMU_EFI.fd of=QEMU_EFI-pflash.raw conv=notrunc
dd if=/dev/zero of=QEMU_VARS-pflash.raw bs=1M count=64
dd if=QEMU_VARS.fd of=QEMU_VARS-pflash.raw conv=notrunc

可以看到制作出来的文件大小已经变成64MB了。将其替换到配置文件里即可。
virsh shutdown ubuntu2204
virsh edit ubuntu2204
替换对应的fd为raw。
<os>
<type arch='aarch64' machine='virt-6.0'>hvm</type>
<loader readonly='yes' type='pflash'>/data/lyy/vm/FV/QEMU_EFI-pflash.raw</loader>
<nvram>/data/lyy/vm/FV/QEMU_VARS-pflash.raw</nvram>
</os>
启动即可。
