如何在启用安全启动的情况下在 qemu/kvm 中安装 Windows 客户机

如何在启用安全启动的情况下在 qemu/kvm 中安装 Windows 客户机

我的主机是 archlinux,我使用 virt-manager 作为 qemu 的前端。

我只是不知道如何为 Windows qemu 客户机启用安全启动。我尝试使用 OVMF_CODE.secboot.fd,但没有帮助。我对如何制作自己的密钥或获取 Microsoft 密钥或类似的东西知之甚少。

有人能告诉我怎么做吗?非常感谢你的建议。

答案1

我已经知道该如何做到这一点,并且我想分享这个过程。

它主要包括两个步骤,获取密钥和将其插入ovmf固件。

获取密钥

生成平台密钥

PK 可以通过 openssl 生成,使用以下命令来签名自己的 PK。注意 PKpriv.key 是私钥,请妥善保管。

$ openssl req -newkey rsa:2048 -nodes -keyout PKpriv.key -x509 -days 365 -out PK.crt
$ openssl x509 -in PK.crt -outform der -out PK.der

下载 KEK 和 DB

您需要从 Microsoft Database 下载 KEK 和 DB:

  1. 微软公司 KEK CA 2011
  2. Microsoft Windows 生产 CA 2011

插入 UEFI 密钥

制作一个 fat32 格式的 img 文件,其中包含密钥

$ dd if=/dev/zero of=keys.img bs=4M count=1
$ mkfs.vfat keys.img
# losetup /dev/loopX keys.img
# mount /dev/loopX /mnt
# cp PK.der /mnt/PK.der
# cp MicCorKEKCA2011_2011-06-24.crt /mnt/KEK.crt
# cp MicWinProPCA2011_2011-10-19.crt /mnt/DB.crt
# umount /dev/loopX
# losetup -d /dev/loopX

插入钥匙

启动虚拟机,将 img 文件作为存储设备。进入 UEFI 配置菜单,转到安全启动配置(设备管理器/安全启动配置/安全启动模式),从“标准模式”更改为“自定义模式”。更改为“自定义模式”后,将显示“自定义安全启动选项”,单击并输入。PK 选项/注册 PK/使用文件注册 PK,对 KEK 和 DB 执行相同操作。省略更改并退出

导入PK、KEK和DB后,安全启动状态为“Enabled”。

参考

  1. https://projectacrn.github.io/1.6/tutorials/waag-secure-boot.html
  2. https://www.linux.org/threads/create-img-files.11174/

答案2

您需要安装edk2-ovmf,然后找到相应文件的路径。对于 Arch Linux,您可以使用pacman -Ql edk2-ovmf。选择x64版本。注意两个文件是不同的,一个是 OVME_CODE.secboot.fd(固件代码);另一个是 OVMF_VARS.fd(固件和操作系统使用的变量),类似于配置数据库。

-drive if=pflash,format=raw,readonly=on,file=/usr/share/edk2-ovmf/x64/OVMF_CODE.secboot.fd \
-drive if=pflash,format=raw,file=/copy/of/OVMF_VARS.fd \

添加这两个选项后,您将获得 UEFI 和安全启动功能。我在最新的 Arch Linux x86_64 6.4.4-arch1-1 和 QEMU 模拟器版本 8.0.2 上进行了测试。

我编写了一个脚本来在 QEMU 上安装 Windows 11:

#!/bin/bash   
              
# Libtpms-based TPM emulator
tpm_path=/home/user/Documents/qemu-disks/Windows11Support/
swtpm socket --tpm2 --tpmstate dir="${tpm_path}" --ctrl type=unixio,path="${tpm_path}/swtpm-sock" &
              
iso_path=/home/user/Documents/Win11_22H2_English_x64v2.iso
disk_path=/home/user/Documents/qemu-disks/Windows11
ovmf_code=/usr/share/edk2/x64/OVMF_CODE.secboot.fd
ovmf_vars=/home/user/Documents/qemu-disks/Windows11Support/OVMF_VARS.fd
virtio_path=/home/user/Documents/qemu-disks/Windows11Support/virtio-win-0.1.229.iso
keys_path=/home/user/Downloads/UEFIKeys
  
  # these options for install OSs and systems
  #-drive file="${iso_path}",index=2,media=cdrom \
  #-drive file="${virtio_path}",index=3,media=cdrom \

                                                                                                                                                                           
qemu-system-x86_64 \
  -enable-kvm \
  -smp 8 \    
  -m 16G \    
  -name Windows11 \
  -machine q35 \
  -vga none \ 
  -usb -device usb-tablet \
  -device virtio-vga \
  -nic user,model=virtio-net-pci \
  -cpu host,hv_relaxed,hv_spinlocks=0x1fff,hv_vapic,hv_time \
  -drive if=pflash,format=raw,readonly=on,file="${ovmf_code}" \
  -drive if=pflash,format=raw,file="${ovmf_vars}" \
  -chardev socket,id=chrtpm,path="${tpm_path}/swtpm-sock" \
  -tpmdev emulator,id=tpm0,chardev=chrtpm \
  -device tpm-tis,tpmdev=tpm0 \
  -drive file="${disk_path}",index=0,media=disk,if=virtio,format=raw \
  $@          

对于可信平台模块模拟器:

  -chardev socket,id=chrtpm,path="${tpm_path}/swtpm-sock" \
  -tpmdev emulator,id=tpm0,chardev=chrtpm \
  -device tpm-tis,tpmdev=tpm0 \

$@让您在运行脚本时添加更多选项。您可以通过检查来查找所有其他选项的含义man qemu-system-x86_64

欲了解更多信息,请查看QEMU - ArchWiKi

相关内容