Search

Search posts and notes…

Proxmox VE 9.0 GPU 直通實戰:RTX 4090 + AMD + Docker GPU 容器

Written 2026-07-19 ·小暑

This article is not available in English yet. Showing the original.

Also available in: 繁體中文

在虛擬機裡跑 AI 推理、Docker GPU 容器、甚至遊戲,一直是 Homelab 玩家的夢想。這篇文章記錄了我在 Proxmox VE 9.0 上,把 RTX 4090 直通進 Ubuntu VM,並成功讓 Docker 容器使用 GPU 的完整過程,包含遇到的坑和解法。

環境說明

  • 宿主機:Proxmox VE 9.0.3
  • CPU:AMD Ryzen(Granite Ridge 架構)
  • 顯卡:NVIDIA GeForce RTX 4090(直通用)
  • VM 系統:Ubuntu 26.04 LTS(Resolute)
  • 用途:Docker GPU 容器 / AI 推理

什麼是 GPU 直通?

預設情況下,VM 裡的顯卡是「虛擬顯卡」,效能幾乎為零。GPU 直通(GPU Passthrough)是讓宿主機把實體 GPU 直接交給 VM,讓 VM 像使用獨立顯卡一樣呼叫 GPU,效能接近裸機。

VFIO 直通 實體機器 Proxmox RTX 4090 實體顯卡 VM: docker-server Docker GPU 容器 AI 推理

技術原理

GPU 直通的底層是 VFIO(Virtual Function I/O) 搭配 IOMMU 硬體虛擬化:

3 items

IOMMU(Input-Output Memory Management Unit)是 CPU/主機板上的硬體功能,負責管理 PCIe 裝置的記憶體存取隔離。AMD 平台叫做 AMD-Vi,Intel 平台叫做 VT-d。開啟後,PCIe 裝置可以被分配到獨立的「IOMMU 群組」,讓 VM 可以獨佔使用。


Step 1:BIOS 設定

進入主機板 BIOS,AMD 平台需要開啟:

選項設定值說明
SVM ModeEnabledAMD CPU 虛擬化引擎
IOMMU / AMD-ViEnabledPCIe 裝置隔離基礎
Above 4G DecodingEnabled大 VRAM 顯卡必須
Resizable BAR / SAMDisabled開啟反而造成直通失敗
CSM / Legacy BootDisabled純 UEFI 模式更穩定

Resizable BAR 一定要關

很多人忽略這點。SAM(Smart Access Memory)在裸機可以提升效能,但在 GPU 直通時會造成 VM 無法啟動。務必在 BIOS 關閉。


Step 2:Proxmox GRUB 設定

編輯 /etc/default/grub,加入 AMD 直通所需的核心參數:

Bash
nano /etc/default/grub
Bash
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt initcall_blacklist=sysfb_init pcie_acs_override=downstream"

參數說明:

  • amd_iommu=on:啟用 AMD IOMMU
  • iommu=pt:只對直通裝置啟用 IOMMU,減少效能開銷
  • initcall_blacklist=sysfb_init:防止宿主機搶占顯卡 framebuffer
  • pcie_acs_override=downstream:強制 PCIe 裝置進入獨立 IOMMU 群組
Bash
update-grub
reboot

Step 3:載入 VFIO 模組

編輯 /etc/modules 加入以下模組,讓系統開機時自動載入:

Bash
vfio
vfio_iommu_type1
vfio_pci

再加入 KVM 穩定性設定,避免 VM 因 MSR 暫存器問題崩潰:

Bash
echo "options kvm ignore_msrs=1 report_ignored_msrs=0" > /etc/modprobe.d/kvm.conf

Step 4:封鎖宿主機顯卡驅動

編輯 /etc/modprobe.d/pve-blacklist.conf,防止宿主機搶先佔用 GPU:

Bash
blacklist nouveau
blacklist nvidia
blacklist nvidiafb
blacklist nvidia_drm

然後更新開機映像並重啟:

Bash
update-initramfs -u -k all
reboot

Step 5:確認 IOMMU 群組

重啟後執行以下腳本,查看 IOMMU 群組分配:

Bash
for g in $(find /sys/kernel/iommu_groups/* -maxdepth 0 -type d | sort -V); do
    echo "IOMMU Group ${g##*/}:"
    for d in $g/devices/*; do
        echo -e "\t$(lspci -nns ${d##*/})"
    done
done

我的結果是完美的獨立群組:

Text
IOMMU Group 12:
    01:00.0 VGA [0300]: NVIDIA GeForce RTX 4090 [10de:2684]
    01:00.1 Audio [0403]: NVIDIA HD Audio [10de:22ba]

理想的結果

RTX 4090 和它的音訊裝置獨立在 Group 12,沒有其他裝置混在一起。AMD Ryzen 平台的 IOMMU 隔離非常乾淨,完全不需要額外處理。

另外,AMD 內顯也獨立在自己的群組,可以留給宿主機使用:

Text
IOMMU Group 22:
    0c:00.0 VGA [0300]: AMD Radeon Graphics (Granite Ridge) [1002:13c0]

Step 6:建立 VM 並掛載顯卡

在 Proxmox Web UI 建立 VM 時的關鍵設定:

設定值
Machineq35
BIOSOVMF (UEFI)
DisplayVirtIO-GPU(初始設定用)

加入 PCI 裝置時勾選:

  • ✅ All Functions(同時傳遞 GPU 本體和音訊)
  • ✅ PCI-Express(原生 PCIe 模式)
  • ✅ ROM-Bar

Step 7:安裝 NVIDIA 驅動

Secure Boot 的坑

遇到的坑:Secure Boot

VM 使用 OVMF UEFI 且 EFI 磁碟設定了 pre-enrolled-keys=1,導致 Secure Boot 開啟。安裝 NVIDIA 驅動時跳出「Configuring Secure Boot」視窗,要求設定 MOK 金鑰密碼。

解法:直接從 OVMF UEFI 介面關掉 Secure Boot:

  1. VM 關機後開機,開機瞬間狂按 ESC 進入 OVMF 設定
  2. Device Manager → Secure Boot Configuration
  3. 取消勾選 Attempt Secure Boot
  4. F10 儲存,重啟

確認已關閉:

Bash
sudo mokutil --sb-state
# 應顯示:SecureBoot disabled

安裝驅動

Bash
sudo apt update
sudo apt install -y nvidia-driver-595
sudo reboot

確認驅動正常:

Bash
nvidia-smi
Text
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 595.71.05    Driver Version: 595.71.05    CUDA Version: 13.2                |
+-----------------------------------------+------------------------+----------------------+
|   0  NVIDIA GeForce RTX 4090        Off |   00000000:01:00.0 Off |                  Off |
| 30%   40C    P8             12W /  350W |       1MiB /  24564MiB |      0%      Default |
+-----------------------------------------------------------------------------------------+

Done

RTX 4090 在 VM 中完整識別,24GB VRAM 全部可用,驅動版本 595.71.05,CUDA 13.2。


Step 8:安裝 NVIDIA Container Toolkit

讓 Docker 容器可以使用 GPU。

Ubuntu 26.04 的坑

NVIDIA Container Toolkit 的套件庫還沒有 ubuntu26.04 的分支,使用自動偵測版本的指令會得到 404 錯誤。解法是使用新的通用 stable/deb/ 路徑,不指定 Ubuntu 版本號。

正確的安裝方式(官方最新文件,v1.19.1):

Bash
# 加入套件庫
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | \
  sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg && \
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
  sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
  sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

# 安裝指定版本
sudo apt-get update && sudo apt-get install -y \
  nvidia-container-toolkit=1.19.1-1 \
  nvidia-container-toolkit-base=1.19.1-1 \
  libnvidia-container-tools=1.19.1-1 \
  libnvidia-container1=1.19.1-1

# 設定 Docker runtime
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

測試:Docker 容器使用 GPU

Bash
docker run --rm --gpus all nvidia/cuda:12.4.0-base-ubuntu22.04 nvidia-smi

結果:

Text
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 595.71.05    Driver Version: 595.71.05    CUDA Version: 13.2                |
|   0  NVIDIA GeForce RTX 4090        Off |   00000000:01:00.0 Off |                  Off |
| 30%   37C    P8             12W /  350W |       1MiB /  24564MiB |      0%      Default |
+-----------------------------------------------------------------------------------------+

🎉 全部完成!

Docker 容器內可以完整看到 RTX 4090,CUDA 13.2 可用,24GB VRAM 全部可存取。之後跑任何 AI 容器只需要加上 --gpus all 參數即可。


軟硬體版本總表

項目版本 / 型號
Proxmox VE9.0.3
Linux Kernel7.0.0-22-generic
VM 系統Ubuntu 26.04 LTS (Resolute)
顯卡NVIDIA GeForce RTX 4090 (24GB)
NVIDIA Driver595.71.05
CUDA13.2
NVIDIA Container Toolkit1.19.1
DockerCE (最新穩定版)

坑的整理

3 items


後記

這次整個設定過程踩了不少坑,但反過來想,這些坑也是最有價值的部分。Proxmox 的文件對 AMD 平台的直通說明不多,大部分資料都是針對舊版或 Intel 平台,遇到問題只能自己查。

最讓我意外的是 AMD Ryzen 的 IOMMU 群組天生就非常乾淨,RTX 4090 和其他裝置完全隔離在不同群組,連 pcie_acs_override 在我的環境裡都不是必要的(雖然還是加了保險)。相比 Intel 平台很多人反映要花大量時間處理群組問題,AMD 這點體驗好很多。

Secure Boot 的問題則是純粹的設計矛盾:OVMF 預設開啟 Secure Boot 是正確的安全設計,但對 Homelab VM 來說毫無意義,反而是最大的阻礙。以後建立 VM 時應該養成習慣直接在 OVMF 把它關掉,省去一大堆麻煩。

接下來打算繼續在這台 VM 上跑 Ollama + Open WebUI,讓 RTX 4090 真正發揮 AI 推理的價值。

丙午年 小暑

唯一 書

Loading comment section...