我的主机是 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:
插入 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”。
参考
答案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。