Living a Simple Life is a Happy Life

有饭吃,自由自在,就非常开心

PVE 9.1 显卡混合部署:LXC 共享 GPU

| Comments

🚀 PVE 9.1 显卡混合部署:LXC 共享 GPU 终程

本教程适用于:宿主机双显卡(一块直通 VM,一块共享给 LXC),且解决了 apt 驱动版本不一致的痛点。

第一步:宿主机(PVE)底层环境整备

在 PVE 宿主机上,我们需要确保 3060 归宿主机管,GT 720 归虚拟机管。

  1. 精准隔离硬件:修改 /etc/modprobe.d/vfio.conf,只填入要直通给 VM 的显卡 ID(如 GT 720),严禁填入 3060 的 ID。
1
2
   # 示例:只隔离 GT 720
   options vfio-pci ids=10de:1288,10de:0e0f
  1. 安装宿主机驱动:使用 .run 安装包安装最新驱动(如 580.142),建议加 –dkms 防止内核升级后驱动失效。
  2. 开启持久化模式:确保显卡不掉线。
1
2
3
   Bash
   nvidia-smi -pm 1
   systemctl enable nvidia-persistenced && systemctl start nvidia-persistenced
1
2
3
4
5
6
7
8
9
10
11
12
13
# nvidia-persistenced.service

[Unit]
Description=Enable NVIDIA Persistence Mode
After=network.target nvidia-kernel-common.service

[Service]
Type=oneshot
ExecStart=/usr/bin/nvidia-smi -pm 1
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
  1. grub更新
1
2
3
/etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_pstate=disable default_hugepagesz=2m hugepagesz=2m hugepages=65536 intel_iommu=on iommu=pt pcie_acs_override=downstream,multifunction nofb textonly nomodeset video=efifb:off"
1
update-initramfs -u

第二步:配置 LXC 容器(宿主机操作)

编辑容器配置文件(如 /etc/pve/lxc/154.conf),手动打通硬件和库文件“投影”。

  1. 基础权限:确保容器是 Privileged (unprivileged: 0)
  2. 添加以下核心配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
   # 1. 硬件设备号允许 (195:Nvidia, 511:UVM, 236:Caps)
   lxc.cgroup2.devices.allow: c 195:\* rwm
   lxc.cgroup2.devices.allow: c 511:\* rwm
   lxc.cgroup2.devices.allow: c 236:\* rwm

   # 2. 硬件节点挂载 (映射真实的显卡通路)
   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

   # 3. 库文件投影 (直接投影 .142 版本,避开容器内 apt 版本过低的问题)
   lxc.mount.entry: /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.580.142 usr/lib/x86_64-linux-gnu/libnvidia-ml.so.580.142 none bind,optional,create=file
   lxc.mount.entry: /usr/lib/x86_64-linux-gnu/libcuda.so.580.142 usr/lib/x86_64-linux-gnu/libcuda.so.580.142 none bind,optional,create=file
   lxc.mount.entry: /usr/lib/x86_64-linux-gnu/libnvidia-ptxjitcompiler.so.580.142 usr/lib/x86_64-linux-gnu/libnvidia-ptxjitcompiler.so.580.142 none bind,optional,create=file

   # 4. 命令工具投影 (容器内无需再 apt install nvidia-utils)
   lxc.mount.entry: /usr/bin/nvidia-smi usr/bin/nvidia-smi none bind,optional,create=file
  1. 配置模版
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#ubuntu22.04 -> ubuntu24.04
arch: amd64
cores: 32
features: nesting=1
hostname: hpc-ai0
memory: 65535
mp0: /mnt/naspool,mp=/mnt/naspool
net0: name=eth0,bridge=vmbr0,firewall=1,gw=192.168.100.2,hwaddr=42:39:96:3D:44:E6,ip=192.168.100.153/24,type=veth
ostype: ubuntu
rootfs: thinpoolf:vm-153-disk-0,size=200G
swap: 512
unprivileged: 0
lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file
lxc.cgroup2.devices.allow: c 10:200 rwm
lxc.cgroup2.devices.allow: c 10:200 rwm
lxc.cgroup2.devices.allow: c 195:* rwm
lxc.cgroup2.devices.allow: c 511:* rwm
lxc.cgroup2.devices.allow: c 236:* rwm
lxc.cgroup2.devices.allow: c 10:* 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/nvram dev/nvram none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-caps/nvidia-cap1 dev/nvidia-caps/nvidia-cap1 none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-caps/nvidia-cap2 dev/nvidia-caps/nvidia-cap2 none bind,optional,create=file
lxc.mount.entry: /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.580.142 usr/lib/x86_64-linux-gnu/libnvidia-ml.so.580.142 none bind,optional,create=file
lxc.mount.entry: /usr/lib/x86_64-linux-gnu/libnvidia-cfg.so.580.142 usr/lib/x86_64-linux-gnu/libnvidia-cfg.so.580.142 none bind,optional,create=file
lxc.mount.entry: /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.580.142 usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1 none bind,optional,create=file
lxc.mount.entry: /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.580.142 usr/lib/x86_64-linux-gnu/libnvidia-ml.so none bind,optional,create=file
lxc.mount.entry: /usr/bin/nvidia-smi usr/bin/nvidia-smi none bind,optional,create=file
lxc.mount.entry: /usr/lib/x86_64-linux-gnu/libcuda.so.580.142 usr/lib/x86_64-linux-gnu/libcuda.so.580.142 none bind,optional,create=file
lxc.mount.entry: /usr/lib/x86_64-linux-gnu/libcuda.so.580.142 usr/lib/x86_64-linux-gnu/libcuda.so.1 none bind,optional,create=file
lxc.mount.entry: /usr/lib/x86_64-linux-gnu/libcuda.so.580.142 usr/lib/x86_64-linux-gnu/libcuda.so none bind,optional,create=file
lxc.mount.entry: /usr/lib/x86_64-linux-gnu/libnvidia-ptxjitcompiler.so.580.142 usr/lib/x86_64-linux-gnu/libnvidia-ptxjitcompiler.so.580.142 none bind,optional,create=file
lxc.mount.entry: /usr/lib/x86_64-linux-gnu/libnvidia-ptxjitcompiler.so.580.142 usr/lib/x86_64-linux-gnu/libnvidia-ptxjitcompiler.so.1 none bind,optional,create=file

第三步:容器内“胶水”配置(容器操作)

进入容器后,由于我们投影的是带版本号的长文件名,需要建立软链接让系统识别。

  1. 清理旧残留(如果之前乱装过):
1
   apt purge -y "nvidia-*" "libnvidia-*" && apt autoremove -y
  1. 建立版本重定向
1
2
3
4
5
6
7
8
9
10
   # 建立 NVML 链接
   ln -sf /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.580.142 /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1
   ln -sf /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1 /usr/lib/x86_64-linux-gnu/libnvidia-ml.so

   # 建立 CUDA 链接
   ln -sf /usr/lib/x86_64-linux-gnu/libcuda.so.580.142 /usr/lib/x86_64-linux-gnu/libcuda.so.1
   ln -sf /usr/lib/x86_64-linux-gnu/libcuda.so.1 /usr/lib/x86_64-linux-gnu/libcuda.so

   # 刷新缓存
   ldconfig

第四步:最终验证

在容器内输入:

1
nvidia-smi

看到表格即代表成功! 此时你的 3060 正在以 580.142 的驱动版本完美运行。

💡 核心经验总结(避坑指南)

  • 版本一致性:LXC 容器内千万不要运行驱动安装包。必须保证容器内的 .so 链接指向的文件版本与宿主机 nvidia-smi 显示的版本完全一致
  • vfio-pci 抢占:如果宿主机 nvidia-smi 报错,优先检查 /sys/bus/pci/drivers/vfio-pci/ 是否抢走了 3060。
  • 特权模式:LXC 访问硬件最稳妥的方式依然是 unprivileged: 0。

Comments