Proxmox VE 9.1.1 LXC 容器 NVIDIA 顯卡直通實戰紀錄
在 Proxmox VE 9.1.1 上把 RTX 4070 Ti 直通進 LXC 容器的完整步驟紀錄,包含 Host 驅動安裝、CT 設定檔配置、容器內 userspace 驅動安裝,踩過的坑一次整理。

前言
最近在 Proxmox VE 9.1.1 上開了一台 LXC 容器 (CT 101, hostname: dev-gpu),想把主機上的 NVIDIA GeForce RTX 4070 Ti 直通進去跑 AI 相關的工作負載。
先講結論:CT 的「GPU 直通」跟 VM 的 PCIe Passthrough 是不同的東西。CT 是 LXC 容器,共用 host 的 kernel,所以做法是把 /dev/nvidia* 這些裝置檔 bind mount 進容器裡,讓多個 CT 可以共享同一張 GPU。VM 的 passthrough 則是獨佔式的,一張卡只能給一台 VM。
這篇紀錄完整的操作流程,以及幾個容易踩的坑。
環境資訊
| 項目 | 規格 |
|---|---|
| Proxmox VE | 9.1.1 |
| Kernel | 6.17.2-1-pve |
| GPU | NVIDIA GeForce RTX 4070 Ti (12GB) |
| CT OS | Ubuntu (unprivileged) |
| CT ID | 101 (dev-gpu) |
| 驅動版本 | 580.126.09 |
| CUDA 版本 | 13.0 |
Step 1:Host 端安裝 NVIDIA 驅動
1.1 安裝 kernel headers 和編譯工具
驅動編譯需要 kernel headers,沒裝的話 .run 檔會直接失敗:
apt update
apt install pve-headers-$(uname -r) build-essential -y1.2 下載並安裝驅動
先確認自己的顯卡型號,到 NVIDIA 官網找到對應的 Linux 驅動。我的 4070 Ti 對應的是 580.126.09:

wget https://us.download.nvidia.com/XFree86/Linux-x86_64/580.126.09/NVIDIA-Linux-x86_64-580.126.09.run
chmod +x NVIDIA-Linux-x86_64-580.126.09.run
./NVIDIA-Linux-x86_64-580.126.09.run安裝過程中會問你要選 NVIDIA Proprietary 還是 MIT/GPL kernel module,選 NVIDIA Proprietary。MIT/GPL 是開源版,對 CUDA 和容器直通的相容性不如 proprietary 穩定。
如果有開 Secure Boot,NVIDIA 驅動會載不進去,記得先到 BIOS 關掉。
1.3 重開機並驗證
reboot重開完跑 nvidia-smi,應該要看到類似這樣的輸出:

+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 580.126.09 Driver Version: 580.126.09 CUDA Version: 13.0 |
+-----------------------------------------+------------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| 0 NVIDIA GeForce RTX 4070 Ti Off | 00000000:01:00.0 Off | N/A |
| 35% 33C P0 37W / 285W | 0MiB / 12282MiB | 3% Default |
+-----------------------------------------+------------------------+----------------------+
1.4 記錄裝置的 major number
這步很關鍵,等等設定 CT 要用到:
ls -la /dev/nvidia*
ls -la /dev/dri/*我的系統輸出:

crw-rw-rw- 1 root root 195, 0 /dev/nvidia0
crw-rw-rw- 1 root root 195, 255 /dev/nvidiactl
crw-rw-rw- 1 root root 505, 0 /dev/nvidia-uvm
crw-rw-rw- 1 root root 505, 1 /dev/nvidia-uvm-tools
cr-------- 1 root root 508, 1 /dev/nvidia-caps/nvidia-cap1
cr--r--r-- 1 root root 508, 2 /dev/nvidia-caps/nvidia-cap2
crw-rw---- 1 root video 226, 0 /dev/dri/card0
crw-rw---- 1 root video 226, 1 /dev/dri/card1
crw-rw---- 1 root render 226, 128 /dev/dri/renderD128
major number(195、505、508、226)每台機器不一定一樣,不要照抄別人的教學,一定要看自己的
ls -la結果。
Step 2:設定 LXC 容器
2.1 停止容器
pct shutdown 1012.2 編輯 CT 設定檔

nano /etc/pve/lxc/101.conf在 unprivileged: 1 那行之後,加入 GPU 相關設定:
# GPU passthrough (bind mount)
lxc.cgroup2.devices.allow: c 195:* rwm
lxc.cgroup2.devices.allow: c 505:* rwm
lxc.cgroup2.devices.allow: c 508:* rwm
lxc.cgroup2.devices.allow: c 226:* rwm
lxc.mount.entry: /dev/nvidia0 dev/nvidia0 none bind,optional,create=file
lxc.mount.entry: /dev/nvidiactl dev/nvidiactl none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-uvm dev/nvidia-uvm none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-uvm-tools dev/nvidia-uvm-tools none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-caps dev/nvidia-caps none bind,optional,create=dir
lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir
# 因為是 unprivileged 容器,需要放寬 AppArmor
lxc.apparmor.profile: unconfined
lxc.apparmor.profile: unconfined會把 AppArmor 保護全拆掉,安全性較低。開發環境可以接受,正式環境請考慮使用 privileged container 或更精細的 AppArmor profile。
2.3 啟動容器並驗證裝置
pct start 101
pct enter 101
ls -la /dev/nvidia*如果看到 /dev/nvidia0、/dev/nvidiactl 等裝置檔案出現,就代表掛載成功了。
Step 3:容器內安裝 NVIDIA userspace 驅動
3.1 從 Host 推送驅動安裝檔進容器
在 host 上執行:
pct push 101 /root/NVIDIA-Linux-x86_64-580.126.09.run /root/NVIDIA-Linux-x86_64-580.126.09.run3.2 在容器內安裝(僅 userspace)
chmod +x /root/NVIDIA-Linux-x86_64-580.126.09.run
./NVIDIA-Linux-x86_64-580.126.09.run --no-kernel-module
--no-kernel-module這個參數很重要!CT 共用 host 的 kernel,不需要也不能在容器內編譯 kernel module,只裝 userspace libraries 就好。
3.3 驗證

nvidia-smi看到 RTX 4070 Ti 的資訊就代表成功了。
Step 4:Docker + GPU(選配)
如果你要在 CT 裡跑 Docker 容器並使用 GPU(例如 Ollama),還需要安裝 NVIDIA Container Toolkit:
apt install -y nvidia-container-toolkit
systemctl restart dockerDocker Compose 範例(以 Ollama 為例):
version: "3.3"
services:
ollama:
image: ollama/ollama
container_name: ollama
restart: always
ports:
- 11434:11434
volumes:
- ollama:/root/.ollama
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
volumes:
ollama: {}踩坑紀錄
容器內 nvidia-smi 噴 "couldn't communicate with the NVIDIA driver"
十之八九是以下其中一個原因:
- CT 設定檔沒加 GPU 掛載 — 最常見,就是我一開始犯的錯
- 容器內沒裝驅動的 userspace — 光掛裝置不夠,還要裝 libraries
- Host 跟 CT 的驅動版本不一致 — 必須一模一樣,差一個小版本號都不行
- 忘記加
lxc.apparmor.profile: unconfined— unprivileged 容器的權限被 AppArmor 擋住
Host 更新驅動後容器壞了
每次 host 升級 NVIDIA 驅動,CT 裡面也要裝同版本。這是「之前好好的怎麼突然壞了」最常見的原因。
小結
整個流程其實不複雜,核心觀念就是:
- Host 裝完整驅動(含 kernel module)
- CT 設定檔掛載 GPU 裝置(bind mount + cgroup allow)
- CT 內裝同版本 userspace 驅動(
--no-kernel-module)
LXC 容器共享 GPU 的好處是多個容器可以同時用同一張卡,而且幾乎沒有虛擬化 overhead。拿來跑 AI inference、影片轉碼這類工作非常適合。