在虛擬機裡跑 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,效能接近裸機。
技術原理
GPU 直通的底層是 VFIO(Virtual Function I/O) 搭配 IOMMU 硬體虛擬化:
Step 1:BIOS 設定
進入主機板 BIOS,AMD 平台需要開啟:
| 選項 | 設定值 | 說明 |
|---|---|---|
| SVM Mode | Enabled | AMD CPU 虛擬化引擎 |
| IOMMU / AMD-Vi | Enabled | PCIe 裝置隔離基礎 |
| Above 4G Decoding | Enabled | 大 VRAM 顯卡必須 |
| Resizable BAR / SAM | Disabled | 開啟反而造成直通失敗 |
| CSM / Legacy Boot | Disabled | 純 UEFI 模式更穩定 |
Resizable BAR 一定要關
很多人忽略這點。SAM(Smart Access Memory)在裸機可以提升效能,但在 GPU 直通時會造成 VM 無法啟動。務必在 BIOS 關閉。
Step 2:Proxmox GRUB 設定
編輯 /etc/default/grub,加入 AMD 直通所需的核心參數:
nano /etc/default/grubGRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt initcall_blacklist=sysfb_init pcie_acs_override=downstream"參數說明:
amd_iommu=on:啟用 AMD IOMMUiommu=pt:只對直通裝置啟用 IOMMU,減少效能開銷initcall_blacklist=sysfb_init:防止宿主機搶占顯卡 framebufferpcie_acs_override=downstream:強制 PCIe 裝置進入獨立 IOMMU 群組
update-grub
rebootStep 3:載入 VFIO 模組
編輯 /etc/modules 加入以下模組,讓系統開機時自動載入:
vfio
vfio_iommu_type1
vfio_pci再加入 KVM 穩定性設定,避免 VM 因 MSR 暫存器問題崩潰:
echo "options kvm ignore_msrs=1 report_ignored_msrs=0" > /etc/modprobe.d/kvm.confStep 4:封鎖宿主機顯卡驅動
編輯 /etc/modprobe.d/pve-blacklist.conf,防止宿主機搶先佔用 GPU:
blacklist nouveau
blacklist nvidia
blacklist nvidiafb
blacklist nvidia_drm然後更新開機映像並重啟:
update-initramfs -u -k all
rebootStep 5:確認 IOMMU 群組
重啟後執行以下腳本,查看 IOMMU 群組分配:
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我的結果是完美的獨立群組:
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 內顯也獨立在自己的群組,可以留給宿主機使用:
IOMMU Group 22:
0c:00.0 VGA [0300]: AMD Radeon Graphics (Granite Ridge) [1002:13c0]Step 6:建立 VM 並掛載顯卡
在 Proxmox Web UI 建立 VM 時的關鍵設定:
| 設定 | 值 |
|---|---|
| Machine | q35 |
| BIOS | OVMF (UEFI) |
| Display | VirtIO-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:
- VM 關機後開機,開機瞬間狂按 ESC 進入 OVMF 設定
- Device Manager → Secure Boot Configuration
- 取消勾選 Attempt Secure Boot
- F10 儲存,重啟
確認已關閉:
sudo mokutil --sb-state
# 應顯示:SecureBoot disabled安裝驅動
sudo apt update
sudo apt install -y nvidia-driver-595
sudo reboot確認驅動正常:
nvidia-smi+-----------------------------------------------------------------------------------------+
| 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 |
+-----------------------------------------------------------------------------------------+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):
# 加入套件庫
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
docker run --rm --gpus all nvidia/cuda:12.4.0-base-ubuntu22.04 nvidia-smi結果:
+-----------------------------------------------------------------------------------------+
| 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 VE | 9.0.3 |
| Linux Kernel | 7.0.0-22-generic |
| VM 系統 | Ubuntu 26.04 LTS (Resolute) |
| 顯卡 | NVIDIA GeForce RTX 4090 (24GB) |
| NVIDIA Driver | 595.71.05 |
| CUDA | 13.2 |
| NVIDIA Container Toolkit | 1.19.1 |
| Docker | CE (最新穩定版) |
坑的整理
後記
這次整個設定過程踩了不少坑,但反過來想,這些坑也是最有價值的部分。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 推理的價值。