KVM虚拟机支持UEFI启动

UEFI 提供了一个标准接口,以便在硬件发生变更时固件能提供足够信息而保证操作系统不受影响。

实验环境

宿主机系统(host):CentOS Linux release 7.4.1708 (Core)

libvirt:3.2.0

qemu: 2.9.0

配置firmware源

firmware源中已经有针对不同虚拟机平台编译的rpm包,直接下载安装即可。

用户也可以github上下载源码包,根据指导编译。

wget http://www.kraxel.org/repos/firmware.repo -O /etc/yum.repos.d/firmware.repo
yum clean all
yum makecache

安装ovmf

yum list|grep edk
edk2.git-ovmf-x64.noarch                   0-20200309... qemu-firmware-jenkins
edk2.git.x86_64                            0-20200309... qemu-firmware-jenkins
edk2.git-aarch64.noarch                    0-20200309... qemu-firmware-jenkins
edk2.git-arm.noarch                        0-20200309... qemu-firmware-jenkins
edk2.git-ovmf-ia32.noarch                  0-20200309... qemu-firmware-jenkins
edk2.git-tools.x86_64                      0-20200309... qemu-firmware-jenkins

这个安装包和宿主机无关,与虚拟机架构平台相关,例如虚拟机是x64架构,则安装edk2.git-ovmf-x64.noarch。

yum install edk2.git-ovmf-x64.noarch

配置libvirt

可以查看edk2.git-ovmf-x64安装包中的文件

rpm -ql edk2.git-ovmf-x64
/usr/share/doc/edk2.git-ovmf-x64
/usr/share/doc/edk2.git-ovmf-x64/README
/usr/share/edk2.git
/usr/share/edk2.git/ovmf-x64
/usr/share/edk2.git/ovmf-x64/OVMF-need-smm.fd
/usr/share/edk2.git/ovmf-x64/OVMF-pure-efi.fd
/usr/share/edk2.git/ovmf-x64/OVMF-with-csm.fd
/usr/share/edk2.git/ovmf-x64/OVMF_CODE-need-smm.fd
/usr/share/edk2.git/ovmf-x64/OVMF_CODE-pure-efi.fd
/usr/share/edk2.git/ovmf-x64/OVMF_CODE-with-csm.fd
/usr/share/edk2.git/ovmf-x64/OVMF_VARS-need-smm.fd
/usr/share/edk2.git/ovmf-x64/OVMF_VARS-pure-efi.fd
/usr/share/edk2.git/ovmf-x64/OVMF_VARS-with-csm.fd
/usr/share/edk2.git/ovmf-x64/UefiShell.iso
/usr/share/qemu/firmware/80-ovmf-x64-git-needs-smm.json
/usr/share/qemu/firmware/81-ovmf-x64-git-pure-efi.json
/usr/share/qemu/firmware/82-ovmf-x64-git-with-csm.json

解释说明:

在虚拟机的xml中添加相应的OVMF文件即可(目前测试只有pure-efi可以使用)

<os>
    <type arch='x86_64' machine='pc-i440fx-rhel7.4.0'>hvm</type>
    <loader readonly='yes' secure='no'  type='pflash'>/usr/share/edk2.git/ovmf-x64/OVMF_CODE-pure-efi.fd</loader>
    <nvram>/usr/share/edk2.git/ovmf-x64/OVMF_VARS-pure-efi.fd</nvram>
    <boot dev='hd'/>
    <boot dev='cdrom'/>
  </os>

针对多个虚拟机场景,对于loader来说,属性是readonly,可以共用,对于变量文件,要复制到相应的目录,避免冲突,例如:

<nvram>/var/lib/libvirt/qemu/nvram/instance-0000002f_VARS-pure-efi.fd</nvram>

不需要重启libvirt,也不需要修改qemu配置,直接启动虚拟机即可。

qemu支持

UEFI虚拟机启动后,可以看到qemu命令中相关参数:

-drive file=/usr/share/edk2.git/ovmf-x64/OVMF_CODE-pure-efi.fd,if=pflash,format=raw,unit=0,readonly=on -drive file=/usr/share/edk2.git/ovmf-x64/OVMF_VARS-pure-efi.fd,if=pflash,format=raw,unit=1

手动用qemu启动时,加上上述命令即可。

支持安全启动的UEFI

支持安全启动的UEFI,需要开启secure=’yes’ ,不过并不是所有的machine都支持,目前只支持q35系列,并且在feature中需要添加SMM。但是对于q35主板,libvirt又不支持IDE controllers,只能自己适配代码或者将cdrom设备的中的bus修改为scsi(如果识别不了则换成virtio)。

示例xml如下:

    <os>
    <type arch='x86_64' machine='pc-q35-rhel7.3.0'>hvm</type>
    <loader readonly='yes' secure='yes' type='pflash'>/usr/share/edk2.git/ovmf-x64/OVMF_CODE-pure-efi.fd</loader>
    <nvram>/usr/share/edk2.git/ovmf-x64/OVMF_VARS-pure-efi.fd</nvram>
    <boot dev='hd'/>
    <boot dev='cdrom'/>
    </os>
    <features>
      <acpi/>
      <smm/>
    </features
    ...
    <disk type='file' device='cdrom'>
    <driver name='qemu' type='raw'/>
    <source file='/home/xqk/centos6/CentOS-6.5-x86_64-bin-DVD1.iso'/>
    <target dev='hda' bus='scsi'/>
    </disk>

不过ovmf-x64文件夹中包含OVMF_CODE-need-smm.fd以及OVMF_VARS-need-smm.fd,但是测试不能够使用。

参考文档

KVM 开启UEFI支持

Table of Contents