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
解释说明:
- OVMF_CODE是bootloader的镜像文件,而OVMF_VARS则是保存OVMF_CODE中变量的文件
-
在UEFI启动页面可以设置一些参数,而这些参数的保存则需要OVMF_VARS文件,配合使用。
- 可以将OVMF_CODE以及OVMF_VARS文件拷贝到相应目录,供虚拟机使用
在虚拟机的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,但是测试不能够使用。
参考文档