Proxmox VE で PCI Passthrough する

Proxmox VE で PCI Passthrough する方法を紹介します

前提条件

弊宅検証環境は下記の構成になります

KeyValue
OSProxmox VE 8.0.4
CPUi7-8700
MEM32GB
M/BASRock B365M Pro4
GPURTX2060 Super

やり方

確認

Intel なら CPU, M/B が VT-d, IOMMU に対応していることを確認しましょう。
AMD は持ち合わせがないのでドキュメントを読んでクレメンス

GPU は UEFI に対応しているのがベストです。未対応でも問題無い場合もありますが面倒なことになることが多いです。

Proxmox VE

GRUB の変更

Proxmox VE の GRUB に設定変更して IOMMU を有効にする必要があります。
また、 BOIS 上でも Intel VT-d と IOMMU を有効にしておいてください。

  • intel_iommu=on IOMMU を有効にするフラグ
  • iommu=pt 専有するフラグ
1
2
3
4
5
6
7
nano /etc/default/grub

# これを
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"

# こう変更した
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"

必須 Kernel Module の読み込みも設定しておく。事前に lsmod | grep vfio で読み込んでない事を確認したため、自動読み込みするように変更。

Important
変更した場合は update-grub 推奨
1
2
3
4
5
6
7
cat <<EOF>> /etc/modules
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd

EOF

変更後 GRUB を更新

1
update-grub

再起動後 dmesg | grep -e DMAR -e IOMMUDMAR: IOMMU enabled の記載があることを確認しておく

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
> dmesg | grep -e DMAR -e IOMMU
[    0.009308] ACPI: DMAR 0x000000006E069900 0000A8 (v01 INTEL  EDK2     00000001 INTL 00000001)
[    0.009339] ACPI: Reserving DMAR table memory at [mem 0x6e069900-0x6e0699a7]
[    0.049278] DMAR: IOMMU enabled
[    0.141083] DMAR: Host address width 39
[    0.141084] DMAR: DRHD base: 0x000000fed90000 flags: 0x0
[    0.141088] DMAR: dmar0: reg_base_addr fed90000 ver 1:0 cap 1c0000c40660462 ecap 19e2ff0505e
[    0.141091] DMAR: DRHD base: 0x000000fed91000 flags: 0x1
[    0.141094] DMAR: dmar1: reg_base_addr fed91000 ver 1:0 cap d2008c40660462 ecap f050da
[    0.141095] DMAR: RMRR base: 0x0000006ea02000 end: 0x0000006ec4bfff
[    0.141097] DMAR: RMRR base: 0x0000006f800000 end: 0x0000007fffffff
[    0.141099] DMAR-IR: IOAPIC id 2 under DRHD base  0xfed91000 IOMMU 1
[    0.141100] DMAR-IR: HPET id 0 under DRHD base 0xfed91000
[    0.141101] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping.
[    0.142609] DMAR-IR: Enabled IRQ remapping in x2apic mode
[    0.379486] DMAR: No ATSR found
[    0.379487] DMAR: No SATC found
[    0.379488] DMAR: IOMMU feature fl1gp_support inconsistent
[    0.379489] DMAR: IOMMU feature pgsel_inv inconsistent
[    0.379490] DMAR: IOMMU feature nwfs inconsistent
[    0.379491] DMAR: IOMMU feature pasid inconsistent
[    0.379492] DMAR: IOMMU feature eafs inconsistent
[    0.379492] DMAR: IOMMU feature prs inconsistent
[    0.379493] DMAR: IOMMU feature nest inconsistent
[    0.379494] DMAR: IOMMU feature mts inconsistent
[    0.379494] DMAR: IOMMU feature sc_support inconsistent
[    0.379495] DMAR: IOMMU feature dev_iotlb_support inconsistent
[    0.379496] DMAR: dmar0: Using Queued invalidation
[    0.379498] DMAR: dmar1: Using Queued invalidation
[    0.379961] DMAR: Intel(R) Virtualization Technology for Directed I/O

IOMMU Interrupt Remapping

dmesg | grep 'remapping'DMAR-IR: Enabled IRQ remapping in x2apic mode が表示されることを確認する

1
2
3
> dmesg | grep 'remapping'
[    0.141101] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping.
[    0.142609] DMAR-IR: Enabled IRQ remapping in x2apic mode

IOMMU の確認

2023/10/17 に公式ドキュメントを確認した所、確認方法が追加されていたので確認
{nodename} は各自の PVE ノード名に置き換えてください。

iommugroup が別れてることを確認します。もし別れていない場合は ACS (Access Control Services) 機能が BIOS で有効化する必要がある場合があります。最終手段として ACS を kernel patch でゴリ押しする方法がありますが、 PVE の公式ドキュメントに説明を譲ります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
> pvesh get /nodes/{nodename}/hardware/pci --pci-class-blacklist ""
┌──────────┬────────┬──────────────┬────────────┬────────┬────────────────────────────────────────────────────────────┬──────┬
│ class    │ device │ id           │ iommugroup │ vendor │ device_name                                                │ mdev │
╞══════════╪════════╪══════════════╪════════════╪════════╪════════════════════════════════════════════════════════════╪══════╪
│ 0x010601 │ 0xa282 │ 0000:00:17.0 │          5 │ 0x8086 │ 200 Series PCH SATA controller [AHCI mode]                 │      │
├──────────┼────────┼──────────────┼────────────┼────────┼────────────────────────────────────────────────────────────┼──────┼
│ 0x010802 │ 0xf1a6 │ 0000:03:00.0 │         11 │ 0x8086 │ SSD Pro 7600p/760p/E 6100p Series                          │      │
├──────────┼────────┼──────────────┼────────────┼────────┼────────────────────────────────────────────────────────────┼──────┼
│ 0x020000 │ 0x15b8 │ 0000:00:1f.6 │         10 │ 0x8086 │ Ethernet Connection (2) I219-V                             │      │
├──────────┼────────┼──────────────┼────────────┼────────┼────────────────────────────────────────────────────────────┼──────┼
│ 0x030000 │ 0x3e92 │ 0000:00:02.0 │          0 │ 0x8086 │ CoffeeLake-S GT2 [UHD Graphics 630]                        │      │
├──────────┼────────┼──────────────┼────────────┼────────┼────────────────────────────────────────────────────────────┼──────┼
│ 0x030000 │ 0x1f06 │ 0000:01:00.0 │          2 │ 0x10de │ TU106 [GeForce RTX 2060 SUPER]                             │      │
├──────────┼────────┼──────────────┼────────────┼────────┼────────────────────────────────────────────────────────────┼──────┼
│ 0x040300 │ 0xa2f0 │ 0000:00:1f.3 │          9 │ 0x8086 │ 200 Series PCH HD Audio                                    │      │
├──────────┼────────┼──────────────┼────────────┼────────┼────────────────────────────────────────────────────────────┼──────┼
│ 0x040300 │ 0x10f9 │ 0000:01:00.1 │          2 │ 0x10de │ TU106 High Definition Audio Controller                     │      │
├──────────┼────────┼──────────────┼────────────┼────────┼────────────────────────────────────────────────────────────┼──────┼
│ 0x048000 │ 0x000a │ 0000:04:00.0 │         12 │ 0xdd01 │                                                            │      │
├──────────┼────────┼──────────────┼────────────┼────────┼────────────────────────────────────────────────────────────┼──────┼
│ 0x058000 │ 0xa2a1 │ 0000:00:1f.2 │          9 │ 0x8086 │ 200 Series/Z370 Chipset Family Power Management Controller │      │
├──────────┼────────┼──────────────┼────────────┼────────┼────────────────────────────────────────────────────────────┼──────┼
│ 0x060000 │ 0x3ec2 │ 0000:00:00.0 │          1 │ 0x8086 │ 8th Gen Core Processor Host Bridge/DRAM Registers          │      │
├──────────┼────────┼──────────────┼────────────┼────────┼────────────────────────────────────────────────────────────┼──────┼
│ 0x060100 │ 0xa2cc │ 0000:00:1f.0 │          9 │ 0x8086 │                                                            │      │
├──────────┼────────┼──────────────┼────────────┼────────┼────────────────────────────────────────────────────────────┼──────┼
│ 0x060400 │ 0x1901 │ 0000:00:01.0 │          2 │ 0x8086 │ 6th-10th Gen Core Processor PCIe Controller (x16)          │      │
├──────────┼────────┼──────────────┼────────────┼────────┼────────────────────────────────────────────────────────────┼──────┼
│ 0x060400 │ 0xa2e9 │ 0000:00:1b.0 │          6 │ 0x8086 │ 200 Series PCH PCI Express Root Port #19                   │      │
├──────────┼────────┼──────────────┼────────────┼────────┼────────────────────────────────────────────────────────────┼──────┼
│ 0x060400 │ 0xa2eb │ 0000:00:1b.4 │          7 │ 0x8086 │ 200 Series PCH PCI Express Root Port #21                   │      │
├──────────┼────────┼──────────────┼────────────┼────────┼────────────────────────────────────────────────────────────┼──────┼
│ 0x060400 │ 0xa294 │ 0000:00:1c.0 │          8 │ 0x8086 │ 200 Series PCH PCI Express Root Port #5                    │      │
├──────────┼────────┼──────────────┼────────────┼────────┼────────────────────────────────────────────────────────────┼──────┼
│ 0x078000 │ 0xa2ba │ 0000:00:16.0 │          4 │ 0x8086 │ 200 Series PCH CSME HECI #1                                │      │
├──────────┼────────┼──────────────┼────────────┼────────┼────────────────────────────────────────────────────────────┼──────┼
│ 0x0c0330 │ 0xa2af │ 0000:00:14.0 │          3 │ 0x8086 │ 200 Series/Z370 Chipset Family USB 3.0 xHCI Controller     │      │
├──────────┼────────┼──────────────┼────────────┼────────┼────────────────────────────────────────────────────────────┼──────┼
│ 0x0c0330 │ 0x1ada │ 0000:01:00.2 │          2 │ 0x10de │ TU106 USB 3.1 Host Controller                              │      │
├──────────┼────────┼──────────────┼────────────┼────────┼────────────────────────────────────────────────────────────┼──────┼
│ 0x0c0500 │ 0xa2a3 │ 0000:00:1f.4 │          9 │ 0x8086 │ 200 Series/Z370 Chipset Family SMBus Controller            │      │
├──────────┼────────┼──────────────┼────────────┼────────┼────────────────────────────────────────────────────────────┼──────┼
│ 0x0c8000 │ 0x1adb │ 0000:01:00.3 │          2 │ 0x10de │ TU106 USB Type-C UCSI Controller                           │      │
├──────────┼────────┼──────────────┼────────────┼────────┼────────────────────────────────────────────────────────────┼──────┼
│ 0x118000 │ 0xa2b1 │ 0000:00:14.2 │          3 │ 0x8086 │ 200 Series PCH Thermal Subsystem                           │      │
└──────────┴────────┴──────────────┴────────────┴────────┴────────────────────────────────────────────────────────────┴──────┴

上記 IOMMU が正しく設定されていればすでに、仮想マシンの PCI 画面で一覧表示される状態となっているはずです。

Host Device Passthrough

Host Device Passthrough を設定する物理ホストには下記のように接続されている

物理(CPUに近い方から)lspci
PCIe x16 (RTX2060 Super)01:00.0
なし
PCIe x1
PCIe x4 (DD Max M4)04:00.0

IOMMU Isolation が効いているか確認しておく今回は問題なさそう

  • 01:00.0: IOMMU group 2
  • 04:00.0: IOMMU group 12

下記の表示がある場合はホスト側のドライバーがあたった状態のためこれを vfi-pci に専有させることで VM から見えなくなる事象を軽減させる。

1
2
        Kernel driver in use: nouveau
        Kernel modules: nvidiafb, nouveau

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
> lspci -nn -v -s 01:00.0
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation TU106 [GeForce RTX 2060 SUPER] [10de:1f06] (rev a1) (prog-if 00 [VGA controller])
        Subsystem: NVIDIA Corporation TU106 [GeForce RTX 2060 SUPER] [10de:13a3]
        Flags: bus master, fast devsel, latency 0, IRQ 145, IOMMU group 2
        Memory at de000000 (32-bit, non-prefetchable) [size=16M]
        Memory at c0000000 (64-bit, prefetchable) [size=256M]
        Memory at d0000000 (64-bit, prefetchable) [size=32M]
        I/O ports at e000 [size=128]
        Expansion ROM at df000000 [disabled] [size=512K]
        Capabilities: [60] Power Management version 3
        Capabilities: [68] MSI: Enable+ Count=1/1 Maskable- 64bit+
        Capabilities: [78] Express Legacy Endpoint, MSI 00
        Capabilities: [100] Virtual Channel
        Capabilities: [250] Latency Tolerance Reporting
        Capabilities: [258] L1 PM Substates
        Capabilities: [128] Power Budgeting <?>
        Capabilities: [420] Advanced Error Reporting
        Capabilities: [600] Vendor Specific Information: ID=0001 Rev=1 Len=024 <?>
        Capabilities: [900] Secondary PCI Express
        Capabilities: [bb0] Physical Resizable BAR
        Kernel driver in use: nouveau
        Kernel modules: nvidiafb, nouveau

> lspci -nn -v -s 04:00.0
04:00.0 Multimedia controller [0480]: Digital Devices GmbH Device [dd01:000a]
        Subsystem: Digital Devices GmbH Device [dd01:0050]
        Flags: bus master, fast devsel, latency 0, IRQ 148, IOMMU group 12
        Memory at df100000 (64-bit, non-prefetchable) [size=64K]
        Capabilities: [50] Power Management version 3
        Capabilities: [70] MSI: Enable+ Count=1/1 Maskable- 64bit+
        Capabilities: [90] Express Endpoint, MSI 00
        Capabilities: [100] Vendor Specific Information: ID=0000 Rev=0 Len=00c <?>

lspci -nn -v -s の結果から VendorID と DeviceID が確認できたのでこれを /etc/modprobe.d/ に設定する

  • RTX2060 Super:
    • 01:00.0 VGA compatible controller [0300]: NVIDIA Corporation TU106 [GeForce RTX 2060 SUPER] [10de:1f06] (rev a1) (prog-if 00 [VGA controller])
  • DD Max M4: dd01:000a
    • 04:00.0 Multimedia controller [0480]: Digital Devices GmbH Device [dd01:000a]
1
2
3
4
5
6
7
cat <<EOF> /etc/modprobe.d/vfio-pci.conf
# Host Device Passthrough
## NVIDIA Corporation TU106 [GeForce RTX 2060 SUPER] [10de:1f06]
## Digital Devices GmbH Device [dd01:000a]
options vfio-pci ids=10de:1f06,dd01:000a

EOF

再起動して確認 Kernel driver in use: vfio-pci のため両方設定できている

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
> lspci -nn -v -s 01:00.0
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation TU106 [GeForce RTX 2060 SUPER] [10de:1f06] (rev a1) (prog-if 00 [VGA controller])
        Subsystem: NVIDIA Corporation TU106 [GeForce RTX 2060 SUPER] [10de:13a3]
        Flags: fast devsel, IRQ 11, IOMMU group 1
        Memory at de000000 (32-bit, non-prefetchable) [disabled] [size=16M]
        Memory at c0000000 (64-bit, prefetchable) [disabled] [size=256M]
        Memory at d0000000 (64-bit, prefetchable) [disabled] [size=32M]
        I/O ports at e000 [disabled] [size=128]
        Expansion ROM at df000000 [disabled] [size=512K]
        Capabilities: [60] Power Management version 3
        Capabilities: [68] MSI: Enable- Count=1/1 Maskable- 64bit+
        Capabilities: [78] Express Legacy Endpoint, MSI 00
        Capabilities: [100] Virtual Channel
        Capabilities: [250] Latency Tolerance Reporting
        Capabilities: [258] L1 PM Substates
        Capabilities: [128] Power Budgeting <?>
        Capabilities: [420] Advanced Error Reporting
        Capabilities: [600] Vendor Specific Information: ID=0001 Rev=1 Len=024 <?>
        Capabilities: [900] Secondary PCI Express
        Capabilities: [bb0] Physical Resizable BAR
        Kernel driver in use: vfio-pci
        Kernel modules: nvidiafb, nouveau

> lspci -nn -v -s 04:00.0
04:00.0 Multimedia controller [0480]: Digital Devices GmbH Device [dd01:000a]
        Subsystem: Digital Devices GmbH Device [dd01:0050]
        Flags: fast devsel, IRQ 11, IOMMU group 12
        Memory at df100000 (64-bit, non-prefetchable) [disabled] [size=64K]
        Capabilities: [50] Power Management version 3
        Capabilities: [70] MSI: Enable- Count=1/1 Maskable- 64bit+
        Capabilities: [90] Express Endpoint, MSI 00
        Capabilities: [100] Vendor Specific Information: ID=0000 Rev=0 Len=00c <?>
        Kernel driver in use: vfio-pci

以上で Proxmox VE 側の設定は完了

VM の起動設定

VM は通常通り作成すれば良いが、一部修正の必要があるので記載する。

Create Virtual Maschine -> System の画面で Maschine を q35, BOIS を OVMF(UEFI) を選択する必要がある

KeyValue
Maschineq35
BOISOVMF (UEFI)
EFI Diskchecked
EFI Storagelocal-lvm
SCSI ControllerVirtlO SCSI
Qemu Agentchecked

System 画面

PCIe のアタッチ

VM のハードウェアから Add -> PCI Device 必要なものを選択するこの時下記のチェックつける今回の構成では Primary GPU はチェックを入れない。これにチェックオンすると RTX2060 に画面が出力され PVE の Console で画面が確認できなくなる。

KeyValue
All Functionschecked
ROM-Barchecked
PCI-Expresschecked

Add: PCI Device

確認

設定ができていれば Hardware 画面で赤下線の箇所が同じように設定されているはずです。

Hardware 画面

Built with Hugo
テーマ StackJimmy によって設計されています。