通过VFIO把GPU透传给Win11虚拟机

Written by: algebnaly

Date: 2024-07-04T14:10:55.000Z

基本上是参考Arch Linux Wiki上的PCI passthrough via OVMF 以及Non-Root GPU-passthrough 这两篇Wiki. 但是由于我使用的是QEMU, 而不是libvirt, 因此最后一个步骤不一样, 需要设置命令行参数. 首先, 由于我是AMD CPU, 因此不能使用-device intel_iommu, 但是也不能使用-device amd_iommu(why?). 其次, 需要设置memlock大小, 我根据Wiki的建议对’/etc/security/limits.conf’设置为

algebnaly	soft	memlock 20000000
algebnaly	hard	memlock 20000000

最后, 需要设置/dev/vfio/28的权限, 让qemu可以访问它, 我是直接运行命令sudo chgrp algebnaly /dev/vfio/28 && sudo chmod g+rwx /dev/vfio/28完成.

最后, 虚拟机内也需要安装显卡驱动, 我使用的是AMD的显卡, 但是直接使用AMD的驱动安装工具是会报错的, 得直接找到对应版本的显卡驱动直接安装.

最后,贴一下我的qemu命令:

 qemu-system-x86_64 \
    -boot order=d \
    -drive file=/home/algebnaly/.local/srv/virt/pool/win11.qcow2 \
    -drive if=pflash,format=raw,readonly=on,file=/usr/share/edk2/x64/OVMF_CODE.secboot.4m.fd \
    -drive if=pflash,format=raw,file=/home/algebnaly/vms/win11/OVMF_VARS.4m.fd \
    -drive file=/home/algebnaly/.local/srv/virt/pool/data.qcow2 \
    -m 8G \
    -machine q35 -cpu host -smp 6 \
    -vga none \
    -device qemu-xhci \
    -usb -device usb-tablet \
    -device ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1 \
    -device vfio-pci,host=0c:00.0,bus=root.1,addr=00.0,multifunction=on \
    -device vfio-pci,host=0c:00.1,bus=root.1,addr=00.1 \
    -vnc :2 \
    -enable-kvm