Proxmox VE LXC 部署(iGPU 透传)

推荐路径:PVE host → privileged LXC 容器 → 容器内 docker → 云瞰镜像。不要直接在 PVE host 上装 docker(Proxmox 官方不推荐,会和 PVE 的 iptables / apt 冲突)。LXC 是 namespace 隔离,性能损耗近零,/dev/dri 透传体验和 host 跑 docker 几乎一致。

1. 适用机型 & 推荐变体

机型推荐变体iGPU 状态
N100 / N305 / N355 mini PCopenvinoAlder Lake-N 核显,/dev/renderD128 可用
J4125 / J4105 老 NUCopenvinoApollo Lake 核显,/dev/renderD128 可用
i3-i7 11 代+ + Iris Xeopenvino性价比首选
NVIDIA GPU PVE 主机cuda 或 trt需 PVE host 装 NVIDIA 驱动 + LXC 透传 /dev/nvidia*

2. 准备工作(在 PVE host 上)

  1. 1

    确认 host 有 /dev/dri

    PVE shell 跑 ls -la /dev/dri/,应有 card0/card1 + renderD128;否则 PVE 内核没加载 i915,先 modprobe i915

  2. 2

    下载 Debian 12 模板

    PVE Web UI → local → CT Templates → Templates 按钮 → 找 debian-12-standard 下载(或 pveam download local debian-12-standard_12.x_amd64.tar.zst)

  3. 3

    查 render/video 组的 GID

    PVE shell 跑 getent group rendergetent group video,记下 GID(默认 render=104, video=44),后面 pct set 要用

3. 建 LXC 容器

bash
# 在 PVE host shell:建一个 vmid=101 的容器,4 核 4G 内存 40G 硬盘
pct create 101 local:vztmpl/debian-12-standard_12.12-1_amd64.tar.zst \
  --hostname yunkan \
  --cores 4 --memory 4096 --swap 1024 \
  --rootfs local-lvm:40 \
  --net0 name=eth0,bridge=vmbr0,ip=dhcp,firewall=0 \
  --unprivileged 0 \
  --features nesting=1,keyctl=1 \
  --onboot 1

pct start 101

必须 privileged + nesting=1 + keyctl=1

--unprivileged 0 = privileged LXC,这是家用最简选择(unprivileged 跑 docker 需要 90+ 行 lxc.conf 调优)。nesting=1 让容器内能再跑 docker,keyctl=1 让 docker overlayfs 工作。

4. 透传 iGPU 给 LXC

bash
# 在 PVE host:透传 renderD128 和 card1 给 vmid=101
pct set 101 -dev0 /dev/dri/renderD128,gid=104   # render group
pct set 101 -dev1 /dev/dri/card1,gid=44         # video group

# 重启容器让 dev 透传生效
pct reboot 101

# 验证:进容器看 /dev/dri 是否存在
pct exec 101 -- ls -la /dev/dri/

5. LXC 内装 docker + 跑云瞰

bash
# 进 LXC
pct enter 101

# 装 docker
curl -fsSL https://get.docker.com | sh

# 跑云瞰一键脚本(自动选 openvino 变体,因为检测到 /dev/dri)
curl -fsSL https://cdn.yun-kan.com/yunkan-install.sh | bash

脚本完成后给一个 LXC IP + 端口(例如 http://10.0.0.148:23406/)。从同网段任意机器浏览器访问进 Setup 向导

6. 升级

升級在 LXC 內操作(pct enter 101 進容器),和普通 Linux 裸機完全一樣,沒有 LXC 專屬步驟。首選方式 A(網頁後台一鍵升級,免登命令列);想手動鎖定版本或偏好命令列時用方式 B / C。

方式 A:网页一键升级(推荐)

打開 Web Admin → 設定 → 系統升級,點升級即可。系統會自動拉取新映像檔並重建主容器(升級瞬間會臨時出現一個一次性執行容器,完成後自動消失),新版起不來還會自動回滾到上一版,全程不用登命令列。LXC 內 docker socket 正常,這條路完全可用。

方式 B:命令行升级

想手動控制升級時機、鎖定特定版本時用。進 LXC 後到部署目錄(預設 ~/skyview)執行:

bash
pct enter 101
cd ~/skyview

# 升到当前 tag(默认 latest)的最新镜像并重建
docker compose -p yunkan -f compose.yml up -d --pull always

要锁定到指定版本,先改 compose 里的 image tag 再重建(注意保持变体不变,见下方警告):

bash
cd ~/skyview
# 把 0.9.9 换成目标版本号
sed -i 's|image: .*/yunkan-.*|image: registry.cn-hangzhou.aliyuncs.com/yunkan/yunkan-openvino:0.9.9|' compose.yml
docker compose -p yunkan -f compose.yml up -d --pull always --force-recreate

升级时别换错变体

image tag 里的变体(openvino / cpu / cuda / trt)必须和原来一致 —— LXC + iGPU 透传装的是 openvino,误填成 cpu 会丢硬件加速。不确定先 docker ps 看当前镜像名里是 -openvino 还是 -cpudata/recordings/ 卷跨版本兼容,DB 迁移由新容器启动时自动跑,升级不丢数据。

方式 C:重跑安装脚本

一鍵腳本是冪等的,重跑會重新拉映像檔、重新產生 compose、重建容器。適合想把老裝機刷成最新標準佈局(順帶清理舊版 yunkan-updater 升級容器)的場景:

bash
pct enter 101
curl -fsSL https://cdn.yun-kan.com/yunkan-install.sh | bash

7. 备份 / 恢复

  • LXC 快照:升级前 pct snapshot 101 pre-upgrade-$(date +%Y%m%d),出问题 pct rollback 101 <快照名> 秒回滚整个容器
  • LXC 备份:vzdump 101 --storage local 把整个容器(含 docker volume)走 PVE 标准备份;或 Web UI → 选 101 → Backup
  • 恢复:pct restore <新 vmid> <备份文件> 从备份还原
  • ⚠️ 不要 destroy + create 重建:LXC 重建会让 /etc/machine-id 变,license 指纹漂移 → 占新 slot 死循环。要重置一律走 pct restore 从备份恢复,不要新建容器

8. 常见问题

/dev/dri 不出现在 LXC 里

确认 pct set 命令正确(注意 gid 数字按你 host 实际查的);重启容器 pct reboot 101;再不行 pct config 101 | grep dev 看配置有没有写进去。

docker run 报 keyctl 错

建容器时漏加 --features keyctl=1。可补:pct set 101 --features nesting=1,keyctl=1,然后 pct reboot 101

把所有 LXC 集中管理

PVE Web UI → Datacenter → 选 LXC 101 → 可视化看 CPU/内存/磁盘/网络;比直接登 host 跑 docker stats 友好。
Proxmox VE LXC 部署 - 云瞰 文档