Proxmox 5.4使用vgpu_unlock,為GTX1060開啟vGPU支持


本文介紹如何為GTX1060顯卡開啟vGPU功能。消費級顯卡不支持nvidia GRID vGPU功能。在2021年初,疫情激發了黑客的創作熱情,給出了一個vgpu_unlock的補丁,可以讓消費級顯卡支持vGPU。但是vgpu_unlock 和 Proxmox 配合起來有好多坑。 

首先,Proxmox 不在nvida vGPU的官方支持支持的hypervisor內,不是每個Proxmox 版本都能穩定的支持nvidia vgpu。我的上一篇文章《DoraCloud for Proxmox桌面雲上啟用NVIDIA Tesla P4的vGPU功能 》講到了在Proxmox 5.4 上為 Tesla P4 啟動vGPU功能。 為啥是Proxmox 5.4,主要是這個版本的內核和nvidia vgpu配合起來比較穩定。 PVE 6.4,PVE7.x貌似都無法和nvida vgpu穩定的工作。

其次,Proxmox降低到 5.4后,5.4是源於Debian 9的。Debian 9 自帶 Python 3.5。 但是Python 3.5 和 vgpu_unlock的python部分的代碼不兼容。需要升級python3.6 或者 3.7。但是在PVE 5.4上安裝Python 3.6/3.7,特別費勁。 雖然也成功的讓 vgpu_unlock 成功啟用過。但是總有說不清的混亂出現。 另外為了運行 mdevctl,還需要加載 rust 的工具鏈和cargo包管理工具。感覺一個小補丁牽出了一頭牛。 

經過探索,vgpu_unlock已經衍生出C和語言版本,以及 RUST語言版本。 於是選擇RUST版本的vgpu_unlock,替代vgpu_unlock的Python配置vgpu服務的部分。

整體的安裝過程與之前的Proxmox 5.4上支持P4 vGPU的過程相似。

與P4的安裝過程相比,unlock的過程增加了如下環節:

1、下載vgpu_unlock項目,執行對nvidia  DKMS驅動打補丁的部分。 而對於vgpu service修改部分的不要執行,由 vgpu_unlock-rs 部分完成。 

國內位置:https://gitee.com/deskpool/vgpu_unlock.git

2、下載安裝 RUST工具鏈和cargo包管理器,並切換 USTC的源。

3、下載vgpu_unlock-rs項目,編譯配置使用vgpu_unlock-rs來啟用 unlock的服務。

國內位置:https://gitee.com/deskpool/vgpu_unlock-rs

 

1、下載安裝Proxmox 5.4.1

 
推薦中科大( USTC)的源下載 ISO,然后使用 rufus 制作 啟動U盤。 
 

2、修改中科大源,更新

 

替換中科大的源,更新升級系統。 

cp /etc/apt/sources.list /etc/apt/sources.list.backup
sed -i 's|^deb http://ftp.debian.org|deb https://mirrors.ustc.edu.cn|g' /etc/apt/sources.list sed -i 's|^deb http://security.debian.org|deb https://mirrors.ustc.edu.cn/debian-security|g' /etc/apt/sources.list mv /etc/apt/sources.list.d/pve-enterprise.list /etc/apt/sources.list.d/pve-enterprise.list.bak CODENAME=`cat /etc/os-release |grep PRETTY_NAME |cut -f 2 -d "(" |cut -f 1 -d ")"` echo "deb https://mirrors.ustc.edu.cn/proxmox/debian $CODENAME pve-no-subscription" > /etc/apt/sources.list.d/pve-no-subscription.list #更新 apt update && apt dist-upgrade -y

 安裝DKMS 依賴包

#安裝 DKMS 依賴包
apt install pve-headers dkms git pve-headers-4.15.18-12-pve -y

 

3、啟用 IOMMU

服務器為Intel 處理器,通過如下腳本啟用IOMMU,如果是AMD處理器,配置有差異。

# 復制如下腳本,啟用IO-MMU

# /etc/default/grub 的GRUB_CMDLINE_LINUX_DEFAULT,增加 intel_iommu=on iommu=pt sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="quiet"/GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"/g' /etc/default/grub update-grub # 加載 vfio vfio_iommu_type1 vfio_pci vfio_virqfd 4個Modules echo vfio >> /etc/modules echo vfio_iommu_type1 >> /etc/modules echo vfio_pci >> /etc/modules echo vfio_virqfd >> /etc/modules echo "options vfio_iommu_type1 allow_unsafe_interrupts=1" > /etc/modprobe.d/iommu_unsafe_interrupts.conf echo "options kvm ignore_msrs=1" > /etc/modprobe.d/kvm.conf echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf update-initramfs -u reboot 


執行完畢腳本,會自動重啟服務器,然后查看日志,確認 IOMMU已經啟用。

root@pveserver:~# dmesg | grep -e DMAR -e IOMMU
[ 0.000000] ACPI: DMAR 0x0000000079A48648 0000A8 (v01 INTEL EDK2 00000002 01000013)
[ 0.000000] DMAR: IOMMU enabled
[ 0.004000] DMAR: Host address width 39
[ 0.004000] DMAR: DRHD base: 0x000000fed90000 flags: 0x0
[ 0.004000] DMAR: dmar0: reg_base_addr fed90000 ver 1:0 cap 1c0000c40660462 ecap 19e2ff0505e
[ 0.004000] DMAR: DRHD base: 0x000000fed91000 flags: 0x1
[ 0.004000] DMAR: dmar1: reg_base_addr fed91000 ver 1:0 cap d2008c40660462 ecap f050da

  

4、安裝DKMS 和 NVIDIA 內核驅動程序

 

#下載nvidia 驅動
wget http://www1.deskpool.com:9000/software/NVIDIA-Linux-x86_64-460.32.03-grid.run
wget http://www1.deskpool.com:9000/software/NVIDIA-Linux-x86_64-460.32.04-vgpu-kvm.run

chmod +x NVIDIA-Linux-x86_64-460.32.04-vgpu-kvm.run #安裝驅動 ./NVIDIA-Linux-x86_64-460.32.04-vgpu-kvm.run -dkms  

為了讓DoraCloud桌面雲系統能夠使用nvidia 的GPU資源,需要對Proxmox 5.4 打一個補丁。 該補丁對Proxmox的 API進行了增強。

wget http://www1.deskpool.com:9000/software/patch.tar.gz
tar -zxvf patch.tar.gz  -C /

 

NVIDIA 驅動安裝成功后,運行如下命令,重啟Proxmox 服務器。

systemctl daemon-reload
reboot

 如果GPU是支持NVIDA GRID的專業GPU,那么vGPU的驅動已經安裝好了。由於GPU是消費級GPU,需要執行vgpu_unlock。

 

5、安裝vgpu_unlock,對nvida 驅動源代碼打補丁

 

git clone https://gitee.com/deskpool/vgpu_unlock.git
chmod -R +x vgpu_unlock
sed -i 's/#include "nv-time.h"/#include "nv-time.h"\n\n#include "\/root\/vgpu_unlock\/vgpu_unlock_hooks.c"/g' /usr/src/nvidia-460.32.04/nvidia/os-interface.c

echo "ldflags-y += -T /root/vgpu_unlock/kern.ld" >>/usr/src/nvidia-460.32.04/nvidia/nvidia.Kbuild
dkms remove -m nvidia -v 460.32.04 --all
dkms install -m nvidia -v 460.32.04

 

6、安裝rust工具鏈和cargo包管理器

Proxmox 5.4 自帶的cargo版本太舊,會有問題。需要從rust官網安裝。以下為從中科大(USTC)源安裝 rust 和 cargo

執行如下腳本,並選擇 Y,通過 rustup 方式安裝 rust 和 cargo

#設置rustup的source為 USTC
export RUSTUP_DIST_SERVER=https://mirrors.ustc.edu.cn/rust-static
export RUSTUP_UPDATE_ROOT=https://mirrors.ustc.edu.cn/rust-static/rustup
wget -qO- https://cdn.jsdelivr.net/gh/rust-lang-nursery/rustup.rs/rustup-init.sh |sh

設置cargo的鏡像為 USTC

│#加載cargo的環境變量
source ~/.cargo/env

#設置cargo的源鏡像為 USTC
cat >>~/.cargo/config <<EOF
[source.crates-io]
replace-with = 'ustc'

[source.ustc]
registry = "git://mirrors.ustc.edu.cn/crates.io-index"
EOF

 

7、安裝rust工具鏈和cargo包管理器

#下載 vgpu_unlock-rs 項目
git clone https:
//gitee.com/deskpool/vgpu_unlock-rs cd vgpu_unlock-rs/ cargo build --release

 

#nvidia-vgpud 的unlock 服務
mkdir /etc/systemd/system/nvidia-vgpud.service.d
cat >>/etc/systemd/system/nvidia-vgpud.service.d/vgpu_unlock.conf <<EOF
[Service]
Environment=LD_PRELOAD=/root/vgpu_unlock-rs/target/release/libvgpu_unlock_rs.so
EOF

#nvidia-vgpu-mgr 的unlock服務
mkdir /etc/systemd/system/nvidia-vgpu-mgr.service.d
cat >>/etc/systemd/system/nvidia-vgpu-mgr.service.d/vgpu_unlock.conf <<EOF
[Service]
Environment=LD_PRELOAD=/root/vgpu_unlock-rs/target/release/libvgpu_unlock_rs.so
EOF

#描述文件,控制GPU的顯示配置,以及cuda
mkdir /etc/vgpu_unlock
cat >>/etc/vgpu_unlock/profile_override.toml <<EOF
[profile.nvidia-55]
num_displays = 1
display_width = 1920
display_height = 1080
max_pixels = 2073600
cuda_enabled = 1
frl_enabled = 0
EOF

 

重啟動完畢后,觀察syslog日志,確定vgpu unlock 是否啟動

1 root@pveserver:~# cat /var/log/syslog |grep unlock
2 Dec 17 15:28:22 pveserver nvidia-vgpud: PID file unlocked.
3 Dec 17 15:41:36 pveserver nvidia-vgpud: PID file unlocked.

再觀察一下識別的vGPU類型,可以看到 GTX-1060已經被模擬成了P40

 1 root@pveserver:~# cat /var/log/syslog |grep VGPU |grep GRID
 2 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x3e: GRID P40-1B Class: NVS
 3 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x2e: GRID P40-1Q Class: Quadro
 4 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x2f: GRID P40-2Q Class: Quadro
 5 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x30: GRID P40-3Q Class: Quadro
 6 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x31: GRID P40-4Q Class: Quadro
 7 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x32: GRID P40-6Q Class: Quadro
 8 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x33: GRID P40-8Q Class: Quadro
 9 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x34: GRID P40-12Q Class: Quadro
10 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x35: GRID P40-24Q Class: Quadro
11 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x36: GRID P40-1A Class: NVS
12 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x37: GRID P40-2A Class: NVS
13 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x38: GRID P40-3A Class: NVS
14 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x39: GRID P40-4A Class: NVS
15 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x3a: GRID P40-6A Class: NVS
16 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x3b: GRID P40-8A Class: NVS
17 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x3c: GRID P40-12A Class: NVS
18 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x3d: GRID P40-24A Class: NVS
19 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x9c: GRID P40-2B Class: NVS
20 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0xd7: GRID P40-2B4 Class: NVS
21 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0xf1: GRID P40-1B4 Class: NVS
22 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x11f: GRID P40-24C Class: Compute
23 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x11b: GRID P40-4C Class: Compute
24 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x11c: GRID P40-6C Class: Compute
25 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x11d: GRID P40-8C Class: Compute
26 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x11e: GRID P40-12C Class: Compute

通過nvidia-smi看一下GPU卡的原始信息

 1 root@pveserver:~# nvidia-smi
 2 Fri Dec 17 16:28:13 2021
 3 +-----------------------------------------------------------------------------+
 4 | NVIDIA-SMI 460.32.04    Driver Version: 460.32.04    CUDA Version: N/A      |
 5 |-------------------------------+----------------------+----------------------+
 6 | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
 7 | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
 8 |                               |                      |               MIG M. |
 9 |===============================+======================+======================|
10 |   0  GeForce GTX 106...  On   | 00000000:01:00.0 Off |                  N/A |
11 | 21%   29C    P8     7W / 130W |     19MiB /  6143MiB |      0%      Default |
12 |                               |                      |                  N/A |
13 +-------------------------------+----------------------+----------------------+
14 
15 +-----------------------------------------------------------------------------+
16 | Processes:                                                                  |
17 |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
18 |        ID   ID                                                   Usage      |
19 |=============================================================================|
20 |  No running processes found                                                 |
21 +-----------------------------------------------------------------------------+

 

驗證一下 Proxmox的API。是否支持vGPU。其中的 name 字段,是上面的補丁(patch.tar.gz)安裝后的增強。便於DoraCloud的API使用。

 1 root@pveserver:~# pvesh get /nodes/pveserver/hardware/pci/01:00.0/mdev
 2 ┌───────────┬──────────────────────────────────────────────────────────────────────────────────────────┬──────────────┬────────────┐
 3 │ available │ description                                                                              │ name         │ type       │
 4 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
 51 │ num_heads=1, frl_config=60, framebuffer=24576M, max_resolution=4096x2160, max_instance=1 │ GRID P40-24C │ nvidia-287 6 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
 71 │ num_heads=4, frl_config=60, framebuffer=24576M, max_resolution=7680x4320, max_instance=1 │ GRID P40-24Q │ nvidia-53 8 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
 91 │ num_heads=1, frl_config=60, framebuffer=24576M, max_resolution=1280x1024, max_instance=1 │ GRID P40-24A │ nvidia-6110 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
112 │ num_heads=1, frl_config=60, framebuffer=12288M, max_resolution=4096x2160, max_instance=2 │ GRID P40-12C │ nvidia-28612 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
132 │ num_heads=4, frl_config=60, framebuffer=12288M, max_resolution=7680x4320, max_instance=2 │ GRID P40-12Q │ nvidia-5214 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
152 │ num_heads=1, frl_config=60, framebuffer=12288M, max_resolution=1280x1024, max_instance=2 │ GRID P40-12A │ nvidia-6016 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
173 │ num_heads=1, frl_config=60, framebuffer=8192M, max_resolution=1280x1024, max_instance=3  │ GRID P40-8A  │ nvidia-5918 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
193 │ num_heads=1, frl_config=60, framebuffer=8192M, max_resolution=4096x2160, max_instance=3  │ GRID P40-8C  │ nvidia-28520 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
213 │ num_heads=4, frl_config=60, framebuffer=8192M, max_resolution=7680x4320, max_instance=3  │ GRID P40-8Q  │ nvidia-5122 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
234 │ num_heads=1, frl_config=60, framebuffer=6144M, max_resolution=1280x1024, max_instance=4  │ GRID P40-6A  │ nvidia-5824 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
254 │ num_heads=1, frl_config=60, framebuffer=6144M, max_resolution=4096x2160, max_instance=4  │ GRID P40-6C  │ nvidia-28426 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
274 │ num_heads=4, frl_config=60, framebuffer=6144M, max_resolution=7680x4320, max_instance=4  │ GRID P40-6Q  │ nvidia-5028 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
296 │ num_heads=4, frl_config=60, framebuffer=4096M, max_resolution=7680x4320, max_instance=6  │ GRID P40-4Q  │ nvidia-4930 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
316 │ num_heads=1, frl_config=60, framebuffer=4096M, max_resolution=1280x1024, max_instance=6  │ GRID P40-4A  │ nvidia-5732 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
336 │ num_heads=1, frl_config=60, framebuffer=4096M, max_resolution=4096x2160, max_instance=6  │ GRID P40-4C  │ nvidia-28334 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
358 │ num_heads=4, frl_config=60, framebuffer=3072M, max_resolution=7680x4320, max_instance=8  │ GRID P40-3Q  │ nvidia-4836 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
378 │ num_heads=1, frl_config=60, framebuffer=3072M, max_resolution=1280x1024, max_instance=8  │ GRID P40-3A  │ nvidia-5638 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
3912 │ num_heads=4, frl_config=45, framebuffer=2048M, max_resolution=5120x2880, max_instance=12 │ GRID P40-2B  │ nvidia-15640 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
4112 │ num_heads=4, frl_config=60, framebuffer=2048M, max_resolution=7680x4320, max_instance=12 │ GRID P40-2Q  │ nvidia-4742 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
4312 │ num_heads=1, frl_config=60, framebuffer=2048M, max_resolution=1280x1024, max_instance=12 │ GRID P40-2A  │ nvidia-5544 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
4512 │ num_heads=4, frl_config=45, framebuffer=2048M, max_resolution=5120x2880, max_instance=12 │ GRID P40-2B4 │ nvidia-21546 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
4724 │ num_heads=4, frl_config=45, framebuffer=1024M, max_resolution=5120x2880, max_instance=24 │ GRID P40-1B4 │ nvidia-24148 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
4924 │ num_heads=4, frl_config=60, framebuffer=1024M, max_resolution=5120x2880, max_instance=24 │ GRID P40-1Q  │ nvidia-4650 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
5124 │ num_heads=1, frl_config=60, framebuffer=1024M, max_resolution=1280x1024, max_instance=24 │ GRID P40-1A  │ nvidia-5452 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
5324 │ num_heads=4, frl_config=45, framebuffer=1024M, max_resolution=5120x2880, max_instance=24 │ GRID P40-1B  │ nvidia-6254 └───────────┴──────────────────────────────────────────────────────────────────────────────────────────┴──────────────┴────────────┘

 

8、使用vGPU

到這里,Proxmox虛擬化平台下,vGPU功能已經成功開啟。 接下來,還需要創建 VM,並安裝 nvidia grid 的guest 驅動。另外還涉及到 nvidia grid license 的申請。具體請參考Proxmox 以及nvidia vgpu的文檔。

 

如果您使用DoraCloud管理桌面,可以直接部署DoraCloud,通過DoraCloud下載桌面模板。桌面模板已經集成了nvidia vgpu驅動。

 

請參考我上一篇文章,第4部分部署 DoraCloud

https://www.cnblogs.com/doracloud/p/proxmox_doracloud_telsa_p4.html

 

DoraCloud for Proxmox的安裝

https://www.doracloud.cn/downloads/2-cn.html

 

版權所有,轉載請注明


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM