VFIO - Intel 4770 から QEMU 仮想マシンへの igpu パススルー (Proxmox)

VFIO - Intel 4770 から QEMU 仮想マシンへの igpu パススルー (Proxmox)

私は最新の Proxmox (現時点では 6.3-3、完全に更新済み) を実行していて、Core i7 4770 CPU のオンボード GPU を Windows 10 VM にパススルーしようとしています。システムで iommu をすでに有効にしており、intel_iommu=on video=efifb:offgrub カーネル オプションを追加して、システムがデバイスを要求しないように grub に指示しました。dmesg をチェックして、IOMMU が実際に利用可能であることを確認しました。

# dmesg | grep -e DMAR -e IOMMU -e AMD-Vi
[    0.007556] ACPI: DMAR 0x00000000D88C33C8 0000B8 (v01 INTEL  HSW      00000001 INTL 00000001)
[    0.083595] DMAR: IOMMU enabled
[    0.180445] DMAR: Host address width 39
[    0.180446] DMAR: DRHD base: 0x000000fed90000 flags: 0x0
[    0.180449] DMAR: dmar0: reg_base_addr fed90000 ver 1:0 cap c0000020660462 ecap f0101a
[    0.180449] DMAR: DRHD base: 0x000000fed91000 flags: 0x1
[    0.180451] DMAR: dmar1: reg_base_addr fed91000 ver 1:0 cap d2008020660462 ecap f010da
[    0.180452] DMAR: RMRR base: 0x000000d8842000 end: 0x000000d884efff
[    0.180452] DMAR: RMRR base: 0x000000db000000 end: 0x000000df1fffff
[    0.180454] DMAR-IR: IOAPIC id 8 under DRHD base  0xfed91000 IOMMU 1
[    0.180454] DMAR-IR: HPET id 0 under DRHD base 0xfed91000
[    0.180455] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping.
[    0.180831] DMAR-IR: Enabled IRQ remapping in x2apic mode
[    0.874497] DMAR: No ATSR found
[    0.874527] DMAR: dmar0: Using Queued invalidation
[    0.874531] DMAR: dmar1: Using Queued invalidation
[    1.026818] DMAR: Intel(R) Virtualization Technology for Directed I/O

また、ホスト OS が iGPU (および関連するオーディオ デバイス) を要求しないようにブラックリストに追加しました。

# cat /etc/modprobe.d/blacklist.conf
blacklist snd_hda_intel
blacklist snd_hda_codec_hdmi
blacklist i915

# cat /etc/modprobe.d/vfio.conf
options vfio-pci ids=8086:0412 disable_vga=1

最後に、ホストに新しい Windows 10 VM を q35 チップセットと uEFI (OVMF) BIOS とともにセットアップしました。どうやらこれがハードウェアをパススルーする最も「互換性のある」方法のようです。また、Proxmox ホストの HDMI ポートに外部スクリーンを接続しました。VM が起動すると、このスクリーンが起動するはずです。VM の qemu 構成ファイルは次のとおりです。

agent: 1
balloon: 0
bios: ovmf
boot: order=virtio0;ide2;net0
cores: 4
efidisk0: local-1tb-nvme-thinpool:vm-118-disk-1,size=4M
hostpci0: 00:02,pcie=1,x-vga=1
ide2: none,media=cdrom
machine: q35
memory: 4096
name: VFIOtest
net0: virtio=52:D7:02:CA:B6:2E,bridge=vmbr0,firewall=1
numa: 0
ostype: win10
scsihw: virtio-scsi-pci
smbios1: uuid=cd9d41e9-d8c2-465e-94dc-798aa8e517e2
sockets: 1
virtio0: local-1tb-nvme-thinpool:vm-118-disk-0,backup=0,discard=on,size=60G
vmgenid: 2cb8ce5e-5dda-4870-9cf3-774bb025057f

それを済ませたら、VMを起動できます。VMを起動するとすぐに、画面がスタンバイ状態になり、信号がないことを示します。しかし、その後、システムにRDP接続すると、デバイスマネージャにIntel HD Graphics 4600が表示されます。そこで、IntelのWebサイトから最新のドライバーをインストールしました。残念ながら、デバイスは起動せず、その横に感嘆符が表示されます。デバイスステータスには次のように表示されます。

Windows has stopped this device because it has reported problems. (Code 43)

残念ながら、このcode 43エラーは単に何かが間違っていることを意味するだけで、何が原因なのかは具体的にはわかりません。

好奇心から、UEFI BIOS を搭載した Ubuntu 20.04 VM を作成し、GPU をそこに渡したところ、完璧に動作しました (マザーボードに接続されているモニターでデスクトップなどを見ることができます)。

この時点で何を試せばいいのかよくわかりません。この問題を修正し続けるための支援があれば助かります。

編集: しばらく格闘した後、私はこれをあきらめました。これは Windows 10 内の問題が原因であるようです。Ubuntu 20.04 デスクトップ VM (q35 チップセット搭載) をセットアップし、iGPU を介してそれにパススルーしました。すぐに動作します (HDMI 経由でマザーボードに接続されたモニターに Ubuntu デスクトップが表示されます)。

関連情報