Proxmox VE GPU 直通:讓 VM 摸到真正的顯卡
虛擬機預設只能用模擬的顯卡,畫面像在看 PowerPoint 投影片。GPU 直通(Passthrough)就是把實體顯卡整張遞進 VM 裡,讓它直接跟硬體對話,效能接近裸機。想在 VM 裡打遊戲、跑 Stable Diffusion、或者讓 Jellyfin 硬解 4K——都靠這招。
前提條件:硬體有沒有這個天賦
不是所有硬體都能玩直通,先確認這張入場券:
- CPU:Intel 要支援 VT-d,AMD 要支援 AMD-Vi(選購建議看硬體選購指南)
- 主機板 BIOS:IOMMU / VT-d 選項要打開(有些主機板預設關閉,藏在 Advanced 裡面)
- IOMMU Group:目標 GPU 最好自己獨佔一個 Group,不要跟一堆裝置擠在一起
買主機板之前先查 IOMMU Group 的分組狀況,不然買回來發現 GPU 跟 USB 控制器綁死,會想退貨。
第一步:啟用 IOMMU
改 GRUB 參數,告訴核心「我要用 IOMMU」:
# Intel CPU
sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="quiet"/GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"/' /etc/default/grub
update-grub
# AMD CPU
sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="quiet"/GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt"/' /etc/default/grub
update-grub
# 重開機
reboot重開後驗證:
dmesg | grep -e DMAR -e IOMMU
# 看到 "IOMMU enabled" 就對了第二步:設定 VFIO 驅動
VFIO 是 Linux 的裝置直通框架。我們要做兩件事:載入 VFIO 模組、阻止主機搶走 GPU。
# 載入必要模組
cat >> /etc/modules << 'EOF'
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
EOF
# 擋掉主機的 GPU 驅動(NVIDIA 為例)
echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nvidia" >> /etc/modprobe.d/blacklist.conf
# 查 GPU 的裝置 ID
lspci -nn | grep -i nvidia
# 輸出類似:01:00.0 VGA [10de:2684]
# 01:00.1 Audio [10de:22ba]
# 把 GPU 和它的音訊裝置都綁給 VFIO
echo "options vfio-pci ids=10de:2684,10de:22ba" >> /etc/modprobe.d/vfio.conf
# 更新 initramfs 並重開機
update-initramfs -u -k all
rebootGPU 通常自帶一個 Audio 裝置(HDMI 音訊),記得一起直通,不然 VM 裡會出怪事。就像養貓不能只帶貓不帶貓砂盆。
第三步:檢查 IOMMU Group
確認 GPU 的分組狀況:
for d in /sys/kernel/iommu_groups/*/devices/*; do
n=${d#*/iommu_groups/*}; n=${n%%/*}
printf 'IOMMU Group %s ' "$n"
lspci -nns "${d##*/}"
done理想狀態:GPU(VGA + Audio)自己一個 Group。如果跟其他裝置擠在一起,要嘛全部一起直通,要嘛換主機板,要嘛用 ACS Override Patch(有安全風險)。
第四步:VM 設定
建立 VM 的時候選好這些:
| 設定 | 值 |
|---|---|
| BIOS | OVMF (UEFI) |
| Machine | q35 |
| CPU Type | host(更多 VM 設定技巧見 VM 管理) |
| PCI Device | 你的 GPU |
| All Functions | 勾選 |
| ROM-Bar | 勾選 |
| PCI-Express | 勾選 |
或者直接改設定檔 /etc/pve/qemu-server/<vmid>.conf:
machine: q35
bios: ovmf
cpu: host,hidden=1,flags=+pcid
hostpci0: 0000:01:00,pcie=1,rombar=1,x-vga=1
NVIDIA Code 43 問題
NVIDIA 早期驅動會偵測「我是不是在虛擬機裡」,發現了就罷工丟出 Code 43 錯誤。解法是把虛擬化的痕跡藏起來:
cpu: host,hidden=1
args: -cpu 'host,+kvm_pv_unhalt,+kvm_pv_eoi,hv_vendor_id=proxmox,kvm=off'
好消息:NVIDIA 535 版之後的驅動已經不管這個了。如果你的驅動夠新,可以跳過這步。
進階玩法
SR-IOV:一張實體網卡切成多張虛擬的,各自獨立分配給不同 VM。企業級網卡(Intel X710)和高階 GPU(NVIDIA A100)才有。
vGPU:把一張 GPU 切成好幾份,每個 VM 分到一小塊。需要 NVIDIA 商業授權,口袋夠深再考慮。
Resource Mappings(PVE 8.0+):在叢集裡給裝置取一個統一名稱,VM 遷移到不同節點時自動對應。不用再每台機器硬編 PCI 位址。
常見問題速查
| 症狀 | 通常原因 |
|---|---|
| IOMMU 沒啟用 | BIOS 沒開 VT-d / GRUB 參數沒改 |
| Code 43 | 需隱藏虛擬化或更新驅動 |
| VM 開機黑螢幕 | 檢查 x-vga=1、rombar、ROM 檔 |
| IOMMU Group 太大 | 主機板 ACS 支援不佳,換板或 ACS override |
| 沒聲音 | 忘了直通 GPU 的 Audio function |
| VM 記憶體不足 | GPU 直通建議固定記憶體、關掉 Ballooning |
GPU 直通的設定步驟不少,但每一步都有明確的原因。搞定之後,一台 PVE 主機可以同時跑伺服器、跑 AI、跑遊戲——一台當三台用,錢花得值。
完整的 IOMMU 與 VFIO 設定細節可參考 Proxmox PCI Passthrough 官方文件,NVIDIA 驅動相容性問題則看 NVIDIA 官方驅動下載頁和 Proxmox VFIO Wiki。
常見問題
Q: Proxmox 顯卡直通一定要 UEFI 嗎?
強烈建議用 UEFI(OVMF)搭配 q35 機型。SeaBIOS 雖然也能直通,但相容性較差,特別是新款 NVIDIA 和 AMD 顯卡在 UEFI 模式下才能正確初始化 ROM。
Q: IOMMU Group 太大怎麼辦?
首選換一張 IOMMU 分組較好的主機板。如果不想換,可以使用 ACS Override Patch 強制拆分 Group,但這會降低 DMA 隔離安全性,Homelab 可以接受,生產環境不建議。
Q: GPU 直通後主機還能用那張顯卡嗎?
不行,直通的 GPU 完全交給 VM 控制,主機端看不到也用不了。如果主機也需要顯示輸出,建議用 CPU 內顯或另插一張便宜的亮機卡給主機用。
Q: VFIO 設定好了但 VM 開機黑螢幕怎麼辦?
檢查三個地方:一是 hostpci 設定要加 x-vga=1 和 rombar=1;二是有些顯卡需要手動指定 ROM 檔案;三是確認 VM 的顯示設定改為 none,避免虛擬顯卡衝突。
下一步
GPU 能用了,接下來把門鎖好——防火牆跟權限管理: 防火牆與權限管理