本文介紹如何為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
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 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤ 5 │ 1 │ num_heads=1, frl_config=60, framebuffer=24576M, max_resolution=4096x2160, max_instance=1 │ GRID P40-24C │ nvidia-287 │ 6 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤ 7 │ 1 │ num_heads=4, frl_config=60, framebuffer=24576M, max_resolution=7680x4320, max_instance=1 │ GRID P40-24Q │ nvidia-53 │ 8 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤ 9 │ 1 │ num_heads=1, frl_config=60, framebuffer=24576M, max_resolution=1280x1024, max_instance=1 │ GRID P40-24A │ nvidia-61 │ 10 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤ 11 │ 2 │ num_heads=1, frl_config=60, framebuffer=12288M, max_resolution=4096x2160, max_instance=2 │ GRID P40-12C │ nvidia-286 │ 12 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤ 13 │ 2 │ num_heads=4, frl_config=60, framebuffer=12288M, max_resolution=7680x4320, max_instance=2 │ GRID P40-12Q │ nvidia-52 │ 14 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤ 15 │ 2 │ num_heads=1, frl_config=60, framebuffer=12288M, max_resolution=1280x1024, max_instance=2 │ GRID P40-12A │ nvidia-60 │ 16 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤ 17 │ 3 │ num_heads=1, frl_config=60, framebuffer=8192M, max_resolution=1280x1024, max_instance=3 │ GRID P40-8A │ nvidia-59 │ 18 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤ 19 │ 3 │ num_heads=1, frl_config=60, framebuffer=8192M, max_resolution=4096x2160, max_instance=3 │ GRID P40-8C │ nvidia-285 │ 20 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤ 21 │ 3 │ num_heads=4, frl_config=60, framebuffer=8192M, max_resolution=7680x4320, max_instance=3 │ GRID P40-8Q │ nvidia-51 │ 22 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤ 23 │ 4 │ num_heads=1, frl_config=60, framebuffer=6144M, max_resolution=1280x1024, max_instance=4 │ GRID P40-6A │ nvidia-58 │ 24 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤ 25 │ 4 │ num_heads=1, frl_config=60, framebuffer=6144M, max_resolution=4096x2160, max_instance=4 │ GRID P40-6C │ nvidia-284 │ 26 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤ 27 │ 4 │ num_heads=4, frl_config=60, framebuffer=6144M, max_resolution=7680x4320, max_instance=4 │ GRID P40-6Q │ nvidia-50 │ 28 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤ 29 │ 6 │ num_heads=4, frl_config=60, framebuffer=4096M, max_resolution=7680x4320, max_instance=6 │ GRID P40-4Q │ nvidia-49 │ 30 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤ 31 │ 6 │ num_heads=1, frl_config=60, framebuffer=4096M, max_resolution=1280x1024, max_instance=6 │ GRID P40-4A │ nvidia-57 │ 32 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤ 33 │ 6 │ num_heads=1, frl_config=60, framebuffer=4096M, max_resolution=4096x2160, max_instance=6 │ GRID P40-4C │ nvidia-283 │ 34 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤ 35 │ 8 │ num_heads=4, frl_config=60, framebuffer=3072M, max_resolution=7680x4320, max_instance=8 │ GRID P40-3Q │ nvidia-48 │ 36 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤ 37 │ 8 │ num_heads=1, frl_config=60, framebuffer=3072M, max_resolution=1280x1024, max_instance=8 │ GRID P40-3A │ nvidia-56 │ 38 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤ 39 │ 12 │ num_heads=4, frl_config=45, framebuffer=2048M, max_resolution=5120x2880, max_instance=12 │ GRID P40-2B │ nvidia-156 │ 40 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤ 41 │ 12 │ num_heads=4, frl_config=60, framebuffer=2048M, max_resolution=7680x4320, max_instance=12 │ GRID P40-2Q │ nvidia-47 │ 42 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤ 43 │ 12 │ num_heads=1, frl_config=60, framebuffer=2048M, max_resolution=1280x1024, max_instance=12 │ GRID P40-2A │ nvidia-55 │ 44 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤ 45 │ 12 │ num_heads=4, frl_config=45, framebuffer=2048M, max_resolution=5120x2880, max_instance=12 │ GRID P40-2B4 │ nvidia-215 │ 46 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤ 47 │ 24 │ num_heads=4, frl_config=45, framebuffer=1024M, max_resolution=5120x2880, max_instance=24 │ GRID P40-1B4 │ nvidia-241 │ 48 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤ 49 │ 24 │ num_heads=4, frl_config=60, framebuffer=1024M, max_resolution=5120x2880, max_instance=24 │ GRID P40-1Q │ nvidia-46 │ 50 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤ 51 │ 24 │ num_heads=1, frl_config=60, framebuffer=1024M, max_resolution=1280x1024, max_instance=24 │ GRID P40-1A │ nvidia-54 │ 52 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤ 53 │ 24 │ num_heads=4, frl_config=45, framebuffer=1024M, max_resolution=5120x2880, max_instance=24 │ GRID P40-1B │ nvidia-62 │ 54 └───────────┴──────────────────────────────────────────────────────────────────────────────────────────┴──────────────┴────────────┘
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
版權所有,轉載請注明