OpenEuler-源码编译UEFI运行ARM虚拟机

134次阅读
没有评论

共计 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

OpenEuler-源码编译UEFI运行ARM虚拟机
 # 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。

OpenEuler-源码编译UEFI运行ARM虚拟机

现在我们需要制作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

OpenEuler-源码编译UEFI运行ARM虚拟机

感觉是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
OpenEuler-源码编译UEFI运行ARM虚拟机

可以看到制作出来的文件大小已经变成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>

启动即可。

OpenEuler-源码编译UEFI运行ARM虚拟机
正文完
 2
landery
版权声明:本站原创文章,由 landery 2023-10-14发表,共计4513字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)