LXC 直通顯示卡 - PVE 7
BUBU 因之前寫過一篇如何在 kvm 模式下直接顯示卡那是在 Windows 環境下去操作,這次剛好有朋友要使用 Linux 的環境下運行 GPU 的服務,那剛好想說看是否可以用 PVE 下的 LXC 服務是否可直通顯示卡,有在網路上找到一篇教學是可以是可以執行的,測試過是可以運行我先把這整個過程都記錄。
運行環境
環境都是在 「Proxmox VE 」 虛擬系統上架設,都是以 「 LXC 」模式為主,除非有特殊狀況會告知使用 「 VM 」 模式
- 系統環境: Proxmox VE 7.0、Debian 10、Ubuntu 18.04
測試過程
Proxmox VE 設定及安裝驅動
- 新增加
Nvidia
來源庫,以下的來源庫是 Debian 11 版本的來源庫
#bullseye backport
deb http://deb.debian.org/debian bullseye-backports main contrib non-free
deb-src http://deb.debian.org/debian bullseye-backports main contrib non-free
- 修改好來源庫之後要更新一下來源庫
apt update
- 安裝
header
在安裝之前先檢查當下的核心版本
uname -a
- 查詢出來結果如下
- 在用
pve-header
查詢核心版本
apt-cache search pve-header
- 查詢出來的版本,看是否有與
uname -a
查出來的版本一樣
- 會自動安裝當下的核心版本
apt install pve-headers-$(uname -r)
- 安裝
dkms
如果沒有安裝這個在安裝驅動會容易報錯
apt update
apt install dkms -y
- 查詢是否有
nvidia
的顯卡
lspci | grep -i nvidia
- 查詢結果如下
- 再用另一個指詢查詢
nvidia
lspci -vvv |grep -i -A 20 nvidia
- 查詢結果如下,但是要確認一下紅色框框內的資訊是否有正常顯示出這樣子的畫面,如果沒有正常顯示出這樣子的畫面有可能會無法正常安裝
- 在 PVE 上安裝顯示卡驅動
apt-get update
apt-get install -t bullseye-backports nvidia-driver nvidia-smi
- 安裝完成後要增加關於
nvidia
模組vim /etc/modules-load.d/nvidia.conf
nvidia-drm
nvidia
nvidia_uvm
- 在確認一下其他檔案是否有增加過
nouveau
、nvidiafb
這兩個檔案,如果沒有的的話就在剛剛增加的設定檔上增加下面兩行指令
blacklist nouveau
blacklist nvidiafb
- 更新模組資訊
update-initramfs -u -k all
- 新增加規則
vim /etc/udev/rules.d/70-nvidia.rules
KERNEL=="nvidia", RUN+="/bin/bash -c '/usr/bin/nvidia-smi -L && /bin/chmod 666 /dev/nvidia*'"
KERNEL=="nvidia_uvm", RUN+="/bin/bash -c '/usr/bin/nvidia-modprobe -c0 -u && /bin/chmod 0666 /dev/nvidia-uvm*'"
-
以上流程都設定完之後重開 PVE 主機
-
驗證剛剛安裝的驅動是否都正常
-
第一個指令
ls -al /dev/nvidia*
- 結果如下
- 第二個指令
ls -al /dev/dri/*
- 結果如下
- 第三個指令
nvidia-smi
- 結果如下
以上流程確認完之後就開始開一台 LXC 服務運行
LXC模式直通設定
要讓 LXC 服務上直通顯卡,這上面的驅動要跟本機上的驅動要一樣例如我目前安裝的版臺是 460.91.03
,到時再去官方查下載的載點。
- 在 LXC 服務下載驅動程式
wget https://tw.download.nvidia.com/XFree86/Linux-x86_64/460.91.03/NVIDIA-Linux-x86_64-460.91.03.run
- 讓剛剛下載好的驅動程式能有執行權限
chmod +x NVIDIA-Linux-x86_64-460.91.03.run
- 安裝時不要安裝核心服務,要下指令是無核心版本
sudo ./NVIDIA-Linux-x86_64-460.91.03.run --no-kernel-module
- 安裝完 LXC 上的驅動,就先把 LXC 先關機,進到 PVE 去修改設定檔,以下是我所填加的指令,要注意一下數字是不是跟您在本機上查詢是否一樣,設定完成之後存檔,設定檔位置在
vim /etc/pve/lxc/XXX.conf
lxc.cgroup2.devices.allow: c 195:* rwm
lxc.cgroup2.devices.allow: c 234:* 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-modeset dev/nvidia-modeset 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/dri dev/dri none bind,optional,create=dir
要注意一下如果使用到 PVE 7 的系統因 cgroup 已經更新到 cgroup2 ,所以在設定時要注意
- 再開啟剛剛所設定的 LXC 服務,在下一段查詢的指令看是否正常
ls -al /dev/nvidia*
ls -al /dev/dri/*
nvidia-smi
- 查詢出來的結果跟您剛剛在本機上的查詢結果要一樣,就表示您的 LXC 服務已可以直通顯卡並且有 GPU 功能
CUDA
安裝 CUDA 功能
-
首先到 Nvidia 官網取得套件載點,會建議以
nvidia-smi
所查詢出來的版本下去安裝 -
先安裝必要的套件
apt update
sudo apt-get install gcc g++ freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libglu1-mesa libglu1-mesa-dev -y
- 因我目前所查到的版本是 11.2 版,我從官方下載該版本
wget https://developer.download.nvidia.com/compute/cuda/11.2.2/local_installers/cuda_11.2.2_460.32.03_linux.run
- 執行安裝 cuda 套件
sudo sh cuda_11.2.2_460.32.03_linux.run
- 在安裝過程中不要選擇安裝驅動程式,請參考下面圖示,取消後就選擇安裝,安裝時會需要一點時間
- 如果下
nvcc -V
查不到,因為環境變數沒有設定好,那請在.bashrc
這裡新增兩行環境變數(請注意在安裝完成後畫面會顯示您要增加的路徑),我不確定路徑是否會與我相同要注意
export PATH=/usr/local/cuda-11.2/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-11.2/lib64:$LD_LIBRARY_PATH
- 設定完環境變數,如果要立刻生效請下
. .bashrc
- 在再下一次
nvcc -V
這樣子就會出現目前的資訊
- 在利用官方提供的測試功具
cuda-install-samples-11.2.sh ~
cd ~/NVIDIA_CUDA-11.2_Samples/5_Simulations/nbody
sudo apt-get install libglu1-mesa libxi-dev libxmu-dev libglu1-mesa-dev
sudo apt-get install freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libgl1-mesa-glx libglu1-mesa libglu1-mesa-dev libglfw3-dev libgles2-mesa-dev
GLPATH=/usr/lib make
./nbody numdevices=1 -benchmark
那 BUBU 這一張顯卡的運算只有 6.1 分
備註
參考相關網頁
- 【亿点笔记】Proxmox VE(PVE) 下直通GPU给LXC 进行CUDA coding
- LXC GPU passthrough for Plex
- Executing Cuda script in LXC container results in "cuda error: no CUDA-capable device is detected"
- Guide: Pass GPU (NVENC) into an LXC Container (with FFMPEG)
- 解决nvcc --version显示command not found问题
- Proxmox 7 LXC Multi-GPU Passthrough
- Plex GPU transcoding in Docker on LXC on Proxmox