Đây là một bài viết hướng dẫn cách làm cho vGPU hoạt động với một GPU Nvidia trong Proxmox 7. Có rất nhiều thay đổi kể từ phiên bản ban đầu của vgpu_unlock
và mọi thứ trở nên đơn giản hơn nếu bạn sử dụng một GPU Nvidia tương thích được hỗ trợ bởi driver 460.73.01
. Nếu GPU của bạn không được hỗ trợ bởi driver này, bạn sẽ phải áp dụng và xây dựng driver bằng chính mình.
Tôi đã thử nghiệm quy trình này trên ba GPU Nvidia sau:
- EVGA GTX 1060 6GB – [GP106] Hoạt động với driver vGPU (host) Erinnnn 460.73.01.
- MSI RTX 2070 Super Gaming X 8GB – [TU104] Hoạt động với driver vGPU (host) Erinnnn 460.73.01.
- INNO3D GeForce RTX 2060 Twin X2 OC 12GB – [TU106] Hoạt động với driver vGPU (host) 460.107, nhưng không ổn định trong máy ảo (không thể sử dụng được trong lúc này).
Điều này có nghĩa là bạn có thể sử dụng các GPU được liệt kê trên với vGPU trong Proxmox 7 nếu bạn cài đặt driver vGPU tương ứng. Tuy nhiên, đối với GPU không được hỗ trợ trực tiếp, bạn có thể cần phải tự xây dựng driver để có thể sử dụng vGPU.
Lưu ý rằng sự ổn định của vGPU trên máy ảo có thể thay đổi tùy thuộc vào GPU cụ thể và phiên bản driver mà bạn sử dụng.
Các GPU được hỗ trợ:
- Card Nvidia Chip GPU Profil mở khóa vGPU
- GTX 900 Series (thế hệ đầu tiên) GM107 x4 Tesla M10
- GTX 900 Series (thế hệ thứ hai) GM204 x2 Tesla M60
- GTX 1000 Series GP102/104/106 Tesla P40
- Titan V, Quadro GV100 GV100 Tesla V100 16GB
- RTX 2000 Series TU102/104 Quadro RTX 6000
- RTX 3000 Series GA10x Ampere không được hỗ trợ
Trong hướng dẫn này, tôi tập trung vào các GPU dành cho người tiêu dùng như dòng GTX và RTX. Từ những gì tôi đã đọc, cũng có thể thiết lập vGPU trên các GPU dành cho doanh nghiệp như Tesla M40 có hỗ trợ vGPU sẵn có.
Bước 1 – Thiết lập các thông tin cơ bản trong Proxmox
Các lệnh dưới được sử dụng để chuẩn bị môi trường và cài đặt các gói phụ thuộc cần thiết cho quá trình mở khóa vGPU trong Proxmox.
Sao lưu file nguồn của apt
và pve-enterprise
.
cp /etc/apt/sources.list /etc/apt/sources.list.bak
cp /etc/apt/sources.list.d/pve-enterprise.list /etc/apt/sources.list.d/pve-enterprise.list.bak
Thêm repository Proxmox vào file nguồn sources.list
.
echo 'deb http://download.proxmox.com/debian/pve bullseye pve-no-subscription' | tee -a /etc/apt/sources.list
Xóa file nguồn của pve-enterprise
.
rm /etc/apt/sources.list.d/pve-enterprise.list
Cập nhật danh sách gói từ các nguồn đã chỉ định và nâng cấp các gói đã cài đặt lên phiên bản mới nhất.
apt update
apt -y upgrade
Cài đặt các gói phụ thuộc như Python 3, pip, git, build-essential, pve-headers, dkms, jq,…
apt install -y python3 python3-pip git build-essential pve-headers-`uname -r` dkms jq mdevctl unzip uuid
Cài đặt thư viện Frida thông qua pip3.
pip3 install frida
Bước 2 – Cấu hình và chuẩn bị môi trường để sử dụng vGPU trên Proxmox.
Các lệnh sau đây được sử dụng để cấu hình và chuẩn bị môi trường để sử dụng vGPU trên Proxmox.
Sửa đổi nội dung của file cấu hình Grub để thêm các thông số intel_iommu=on
và iommu=pt
.
sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="quiet"/GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"/g' /etc/default/grub
Cập nhật Grub: Lệnh update-grub
cập nhật cấu hình Grub để áp dụng thay đổi mới.
update-grub
Thêm các trường “vfio, vfio_iommu_type1, vfio_pci, vfio_virqfd
” vào file /etc/modules
.
echo vfio >> /etc/modules
echo vfio_iommu_type1 >> /etc/modules
echo vfio_pci >> /etc/modules
echo vfio_virqfd >> /etc/modules
Tạo file /etc/modprobe.d/iommu_unsafe_interrupts.conf
, /etc/modprobe.d/kvm.conf
, /etc/modprobe.d/blacklist.conf
và ghi các nội dung tương ứng vào các file này.
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
Cập nhật initramfs để áp dụng các thay đổi đã được thực hiện.
update-initramfs -u
Đầu ra của lệnh sẽ update-initramfs -u
sẽ như sau..
$ update-initramfs -u
update-initramfs: Generating /boot/initrd.img-5.15.108-1-pve
Running hook script 'zz-proxmox-boot'..
Re-executing '/etc/kernel/postinst.d/zz-proxmox-boot' in new private mount namespace..
No /etc/kernel/proxmox-boot-uuids found, skipping ESP sync.
Khởi động lại hệ thống để áp dụng các thay đổi.
reboot
Bước 3 – Kiểm tra xem hệ thống có hỗ trợ và đã kích hoạt DMAR và IOMMU hay không?
Lệnh dmesg | grep -e DMAR -e IOMMU
được sử dụng để lọc và hiển thị các dòng log trong dmesg (system message buffer) liên quan đến DMAR (DMA Remapping) và IOMMU (Input-Output Memory Management Unit).
Cụ thể, lệnh này giúp kiểm tra xem hệ thống có hỗ trợ và đã kích hoạt DMAR và IOMMU hay không. DMAR và IOMMU là các tính năng quan trọng trong việc xác định và quản lý bộ nhớ được sử dụng bởi các thiết bị ngoại vi và đảm bảo an toàn trong việc truy cập vào bộ nhớ từ các thiết bị ngoại vi.
Kết quả của lệnh sẽ hiển thị các thông báo liên quan đến DMAR và IOMMU, cho biết liệu chúng đã được kích hoạt và hoạt động chính xác hay không. Điều này hữu ích để đảm bảo rằng cấu hình DMAR và IOMMU đã được thiết lập đúng trên hệ thống, đặc biệt khi làm việc với các tính năng như vGPU hoặc ảo hóa GPU trên Proxmox.
$ dmesg | grep -e DMAR -e IOMMU
[ 0.000000] ACPI: DMAR 0x000000007AB707E0 000110 (v01 ALASKA A M I 00000001 INTL 20091013)
[ 0.000000] ACPI: Reserving DMAR table memory at [mem 0x7ab707e0-0x7ab708ef]
[ 0.000000] DMAR: IOMMU enabled
[ 0.000000] DMAR: Host address width 46
[ 0.000000] DMAR: DRHD base: 0x000000fbffc000 flags: 0x0
[ 0.000000] DMAR: dmar0: reg_base_addr fbffc000 ver 1:0 cap d2078c106f0466 ecap f020df
[ 0.000000] DMAR: DRHD base: 0x000000c7ffd000 flags: 0x0
[ 0.000000] DMAR: dmar1: reg_base_addr c7ffd000 ver 1:0 cap d2008c10ef0466 ecap f0205b
[ 0.000000] DMAR: DRHD base: 0x000000c7ffc000 flags: 0x1
[ 0.000000] DMAR: dmar2: reg_base_addr c7ffc000 ver 1:0 cap d2078c106f0466 ecap f020df
[ 0.000000] DMAR: RMRR base: 0x0000007b3e0000 end: 0x0000007b3f0fff
[ 0.000000] DMAR: ATSR flags: 0x0
[ 0.000000] DMAR: RHSA base: 0x000000c7ffc000 proximity domain: 0x0
[ 0.000000] DMAR: RHSA base: 0x000000fbffc000 proximity domain: 0x1
[ 0.000000] DMAR-IR: IOAPIC id 3 under DRHD base 0xfbffc000 IOMMU 0
[ 0.000000] DMAR-IR: IOAPIC id 1 under DRHD base 0xc7ffc000 IOMMU 2
[ 0.000000] DMAR-IR: IOAPIC id 2 under DRHD base 0xc7ffc000 IOMMU 2
[ 0.000000] DMAR-IR: HPET id 0 under DRHD base 0xc7ffc000
[ 0.000000] DMAR-IR: x2apic is disabled because BIOS sets x2apic opt out bit.
[ 0.000000] DMAR-IR: Use 'intremap=no_x2apic_optout' to override the BIOS setting.
[ 0.000000] DMAR-IR: Enabled IRQ remapping in xapic mode
[ 1.512692] DMAR: [Firmware Bug]: RMRR entry for device 81:00.2 is broken - applying workaround
[ 1.512695] DMAR: No SATC found
[ 1.512698] DMAR: IOMMU feature sc_support inconsistent
[ 1.512699] DMAR: IOMMU feature dev_iotlb_support inconsistent
[ 1.512701] DMAR: IOMMU feature sc_support inconsistent
[ 1.512702] DMAR: IOMMU feature dev_iotlb_support inconsistent
[ 1.512703] DMAR: dmar1: Using Queued invalidation
[ 1.512709] DMAR: dmar0: Using Queued invalidation
[ 1.512714] DMAR: dmar2: Using Queued invalidation
[ 1.522492] DMAR: Intel(R) Virtualization Technology for Directed I/O
Nếu khi sử dụng lệnh dmesg | grep -e DMAR -e IOMMU
mà cho kết quả trống thì khả năng bạn đã cấu hình sai hoặc thiếu hoặc có thể phần cứng của bạn không hỗ trợ.
Bước 4 – Xác định GPU nếu bạn có hơn một GPU trong hệ thống.
Trước tiên hãy truy xuất tất cả các GPU Nvidia trong hệ thống của bạn bằng lệnh lspci|grep -i nvidia
.
Đầu ra ví dụ:
root@pve:~# lspci|grep -i nvidia
27:00.0 VGA compatible controller: NVIDIA Corporation GP106 [GeForce GTX 1060 6GB] (rev a1)
27:00.1 Audio device: NVIDIA Corporation GP106 High Definition Audio Controller (rev a1)
28:00.0 VGA compatible controller: NVIDIA Corporation TU104 [GeForce RTX 2070 SUPER] (rev a1)
28:00.1 Audio device: NVIDIA Corporation TU104 HD Audio Controller (rev a1)
28:00.2 USB controller: NVIDIA Corporation TU104 USB 3.1 Host Controller (rev a1)
28:00.3 Serial bus controller [0c80]: NVIDIA Corporation TU104 USB Type-C UCSI Controller (rev a1)
Dựa vào thông tin đầu ra cung cấp, trong hệ thống của tôi có hai card đồ họa: GTX 1060 6GB và RTX 2070 Super 8GB. Bạn định chuyển tiếp (passthrough) card GTX 1060 6GB trực tiếp cho máy ảo Windows 11. Để thực hiện điều này, bạn cần biết các PCI ID của card đó (bao gồm VGA và bộ điều khiển âm thanh). Dựa trên thông tin bạn cung cấp, card GTX 1060 6GB nằm trên PCI Bus 27:00.
Để lấy thông tin PCI ID của card GTX 1060 6GB (VGA controller và Audio controller), bạn có thể sử dụng lệnh lspci -nn
trên Ubuntu. Chạy lệnh sau trong terminal:
lspci -n -s 27:00
Đầu ra sẽ hiển thị thông tin chi tiết về card đồ họa GTX 1060 6GB, bao gồm các PCI ID như VGA controller và Audio controller.
Lưu ý rằng các PCI ID có thể hiển thị dưới dạng chuỗi ký tự số và chữ cái, ví dụ: 10de:1c03
cho VGA controller và 10de:10f1
cho Audio controller.
Đầu ra ví dụ:
root@pve:~# lspci -n -s 27:00
27:00.0 0300: 10de:1c03 (rev a1)
27:00.1 0403: 10de:10f1 (rev a1)
Bạn đã có thông tin cần thiết và bạn định tạo một tệp trong thư mục modprobe.d.
Đầu tiên, mở tệp vfio.conf trong trình soạn thảo bằng lệnh vi /etc/modprobe.d/vfio.conf
và thêm vào dòng này.
options vfio-pci ids=10de:1c03,10de:10f1
Bước 5 – Cài đặt các gói phụ thuộc để cài đặt NVIDIA Graphics Driver cho Proxmox.
Cài đặt các gó cung cấp các phụ thuộc và công cụ cần thiết để phát triển và xây dựng các ứng dụng sử dụng X.Org, OpenGL và các thư viện liên quan. Việc cài đặt các gói này đảm bảo rằng bạn có môi trường phát triển đầy đủ để xây dựng và chạy các ứng dụng liên quan đến đồ họa trên hệ điều hành của bạn.
sudo apt-get install pkg-config xorg-dev libglvnd-dev xserver-xorg -y
Các gói này thường được cài đặt để hỗ trợ phát triển và xây dựng các ứng dụng đồ họa trên hệ thống sử dụng X.Org Server và OpenGL.
pkg-config
: Gói này cung cấp công cụpkg-config
cho phép bạn truy vấn và lấy thông tin về các gói phần mềm đã được cài đặt trên hệ thống. Công cụ này thường được sử dụng trong quá trình biên dịch và liên kết các ứng dụng.xorg-dev
: Gói này cung cấp các file và thư viện phát triển cho X.Org Server, một máy chủ hiển thị X Window System trên hệ điều hành Linux. Điều này cho phép bạn phát triển và xây dựng các ứng dụng liên quan đến đồ họa và giao diện người dùng trên hệ thống sử dụng X.Org Server.libglvnd-dev
: Gói này cung cấp các file và thư viện phát triển cho GLVND (OpenGL Vendor-Neutral Dispatch library). GLVND là một lớp trung gian giữa ứng dụng sử dụng OpenGL và các nhà cung cấp đồ họa khác nhau trên hệ thống. Gói này cho phép bạn phát triển và xây dựng các ứng dụng sử dụng OpenGL trên hệ thống.xserver-xorg
: Gói này cung cấp X.Org Server, một máy chủ hiển thị X Window System. X.Org Server là một thành phần quan trọng của hệ thống đồ họa trên Linux và được sử dụng để hiển thị giao diện người dùng đồ họa trên màn hình.
Nếu bạn sử dụng kernel 5.15 thì bạn cần cài đặt gói linux-headers-5.15.108-1-pve
hoặc chỉ định đường dẫn đến thư mục chứa tiêu đề kernel bằng cờ --kernelsourcedir
khi chạy lệnh dkms.
sudo apt-get install linux-headers-5.15.108-1-pve
Sử dụng lệnh uname -r
nhận biết bạn đang sử dụng kernel nào.
$ uname -r
5.15.108-1-pve
Bước 6 – Cài đặt NVIDIA Graphics Driver cho Proxmox.
Với phần cứng hiện tại của mình thì mình sẽ sử dụng NVIDIA Graphics Driver
phiên bản 460.73.01
bạn hãy download NVIDIA-Linux-x86_64-460.73.01-grid-vgpu-kvm-v5.run
chmod +x NVIDIA-Linux-x86_64-460.73.01-grid-vgpu-kvm-v5.run
./NVIDIA-Linux-x86_64-460.73.01-grid-vgpu-kvm-v5.run --dkms
Đầu ra sẽ là như vậy.
Verifying archive integrity... OK
Uncompressing NVIDIA Accelerated Graphics Driver for Linux-x86_64 460.73.01/02 (Merged+Unlocked+Patched) Rust Version...................
........................................................................................................................................
........................................................................................................................................
........................................................................................................................................
DKMS (Dynamic Kernel Module Support) là một công cụ hỗ trợ trong Linux giúp quản lý việc xây dựng và cài đặt các mô-đun kernel. Khi một mô-đun kernel cần được cài đặt, DKMS có thể tự động xây dựng lại mô-đun đó cho phiên bản kernel hiện tại. Tuy nhiên, nếu bạn cài đặt một phiên bản kernel khác sau này, mô-đun kernel sẽ không hoạt động và cần phải được xây dựng lại cho phiên bản kernel mới.
Khi bạn đăng ký các nguồn mã của mô-đun kernel với DKMS, nó sẽ tạo ra một môi trường để DKMS tự động xây dựng lại mô-đun kernel khi bạn cài đặt một phiên bản kernel mới. Điều này tiện lợi trong việc duy trì các mô-đun kernel được tương thích với các phiên bản kernel khác nhau trên hệ thống của bạn.
Tùy thuộc vào tình huống cụ thể và sự cần thiết của bạn, bạn có thể chọn “yes” (có) để đăng ký nguồn mã mô-đun kernel với DKMS để tự động xây dựng lại mô-đun cho các phiên bản kernel mới. Hoặc bạn có thể chọn “no” (không) nếu bạn không muốn DKMS tự động xây dựng lại mô-đun kernel khi cài đặt phiên bản kernel mới và bạn sẽ tự xây dựng lại mô-đun kernel theo cách thủ công khi cần thiết.
Bạn hãy bấm “yes” để đồng ý đăng ký các nguồn mã của mô-đun kernel với DKMS.
Khi bạn cài đặt các thư viện tương thích 32-bit của NVIDIA, các thư viện này sẽ cung cấp hỗ trợ cho các ứng dụng và trò chơi 32-bit. Điều này là cần thiết vì các ứng dụng và trò chơi 32-bit thường sử dụng các thư viện và phụ thuộc 32-bit riêng biệt, và trên hệ thống 64-bit, các thư viện 32-bit này không tự động có sẵn.
Bằng cách cài đặt các thư viện tương thích 32-bit của NVIDIA, bạn đảm bảo rằng các ứng dụng và trò chơi 32-bit sẽ có thể chạy trên hệ thống của bạn mà không gặp vấn đề về phụ thuộc thư viện hoặc tương thích.
Quá trình cài đặt bắt đầu.
Và đây là hình ảnh quá trình cài đặt thành công.
Tác dụng chi tiết của việc sử dụng tiện ích nvidia-xconfig để tự động cập nhật file cấu hình X là để đảm bảo rằng trình điều khiển NVIDIA X sẽ được sử dụng khi bạn khởi động lại X (môi trường đồ họa của bạn).
Khi bạn chạy nvidia-xconfig, nó sẽ tự động tạo hoặc cập nhật file cấu hình X (thường là /etc/X11/xorg.conf
) với cài đặt và cấu hình phù hợp để sử dụng trình điều khiển NVIDIA X. Việc này đảm bảo rằng hệ thống của bạn sẽ sử dụng trình điều khiển NVIDIA X khi khởi động lại X.
Đồng thời, trước khi cập nhật file cấu hình X, tiện ích nvidia-xconfig cũng sẽ sao lưu file cấu hình X hiện có (nếu có) để đảm bảo rằng bạn có thể phục hồi lại file cấu hình gốc nếu cần thiết.
Thông báo này cho biết rằng trình điều khiển đồ họa NVIDIA đã được cài đặt thành công và file cấu hình X (thường là /etc/X11/xorg.conf
) đã được cập nhật để sử dụng trình điều khiển đồ họa mới. Điều này đảm bảo rằng hệ thống của bạn sẽ sử dụng trình điều khiển NVIDIA mới nhất khi khởi động lại X và các tính năng đồ họa được tối ưu hóa.
Thông báo này cũng cung cấp thông tin về phiên bản của trình điều khiển đồ họa NVIDIA đã được cài đặt (version: 460.73.01). Điều này cho phép bạn biết rõ rằng bạn đã cài đặt phiên bản cụ thể của trình điều khiển và đảm bảo rằng hệ thống của bạn sử dụng phiên bản tương thích.
Sau khi cài đặt xong, bạn có thể sử dụng lệnh nvidia-smi
để hiển thị thông tin về trạng thái và sử dụng của card đồ họa NVIDIA trên hệ thống của bạn.
$ nvidia-smi
Sat Jul 1 18:32:40 2023
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 460.73.01 Driver Version: 460.73.01 CUDA Version: 11.2 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 GeForce RTX 2060 Off | 00000000:81:00.0 Off | N/A |
| 0% 53C P0 1W / 190W | 51MiB / 6143MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
Cụ thể, đầu ra nvidia-smi
bao gồm các thông tin sau:
- Driver Version: Phiên bản của trình điều khiển NVIDIA được cài đặt trên hệ thống.
- CUDA Version: Phiên bản của CUDA (Compute Unified Device Architecture) được cài đặt trên hệ thống.
- GPU Name: Tên của card đồ họa NVIDIA.
- Persistence-M: Trạng thái Persistence của card đồ họa. “Off” nghĩa là không hoạt động.
- Bus-Id: Định danh Bus của card đồ họa trên hệ thống.
- Disp.A: Trạng thái hiển thị của card đồ họa.
- Volatile Uncorr. ECC: Trạng thái ECC (Error Correction Code) không ổn định.
- Fan: Tốc độ quạt làm mát của card đồ họa.
- Temp: Nhiệt độ của card đồ họa.
- Perf: Trạng thái hiệu suất của card đồ họa.
- Pwr:Usage/Cap: Công suất sử dụng / Công suất tối đa của card đồ họa.
- Memory-Usage: Sử dụng bộ nhớ của card đồ họa.
- GPU-Util: Sử dụng GPU (Đơn vị xử lý đồ họa) của card đồ họa.
- Compute MIG M.: Trạng thái sử dụng MIG (Multi-Instance GPU) tính toán.
- Processes: Các tiến trình đang chạy trên card đồ họa.
Trên đầu ra của bạn, nó cho thấy rằng bạn đang sử dụng một card đồ họa GeForce RTX 2060, không có tiến trình nào đang chạy trên card và chỉ sử dụng một lượng nhỏ bộ nhớ (51MB) trên tổng bộ nhớ của card (6143MB). Nhiệt độ của card là 53 độ C và hiệu suất là P0 (hoạt động ở mức hiệu suất cao nhất).
Bước 7 – Cài đặt và config cho vgpu_unlock.
Đầu tiên bạn phải cài đặt phần mềm biên dịch Cargo bằng lệnh curl https://sh.rustup.rs -sSf | sh
. Hãy lựa chọn số "1"
tương ứng với (Proceed with installation (default))
và bấm Enter để tiếp tục cài đặt.
You can uninstall at any time with rustup self uninstall and
these changes will be reverted.
Current installation options:
default host triple: x86_64-unknown-linux-gnu
default toolchain: stable (default)
profile: default
modify PATH variable: yes
1) Proceed with installation (default)
2) Customize installation
3) Cancel installation
>1
< đã lược bỏ một số dòng không cần thiết >
Rust is installed now. Great!
To get started you may need to restart your current shell.
This would reload your PATH environment variable to include
Cargo's bin directory ($HOME/.cargo/bin).
To configure your current shell, run:
source "$HOME/.cargo/env"
Tiếp theo bạn chạy lệnh source source "$HOME/.cargo/env"
cargo có thể biên dịch được ngay.
source "$HOME/.cargo/env"
Tải vgpu_unlock về Server và di chuyển vào thư mục vgpu_unlock vừa tải xong.
git clone https://github.com/mbilker/vgpu_unlock-rs.git
cd vgpu_unlock-rs
Thực hiện quá trình biên dịch mã nguồn Rust thành một phiên bản release sẵn sàng để triển khai hoặc chạy trên hệ thống. Khi bạn chạy câu lệnh này, Cargo (công cụ quản lý gói và xây dựng dự án Rust) sẽ đọc file Cargo.toml
trong thư mục dự án và biên dịch mã nguồn thành các file thực thi.
Chế độ --release
đảm bảo rằng mã nguồn được biên dịch với cấu hình tối ưu hóa để đạt hiệu suất tốt nhất trong khi chạy. Điều này bao gồm việc tắt các chế độ gỡ lỗi và tăng cường tối ưu hóa mã.
cargo build --release
Đây là đầu ra của quá trình biên dịch.
$ cargo build --release
Updating crates.io index
Downloaded lock_api v0.4.10
Downloaded cfg-if v1.0.0
Downloaded autocfg v1.1.0
Downloaded parking_lot v0.11.2
Downloaded smallvec v1.10.0
Downloaded serde_derive v1.0.164
Downloaded libc v0.2.147
Downloaded instant v0.1.12
Downloaded parking_lot_core v0.8.6
Downloaded proc-macro2 v1.0.63
Downloaded ctor v0.1.26
Downloaded scopeguard v1.1.0
Downloaded serde v1.0.164
Downloaded syn v2.0.22
Downloaded unicode-ident v1.0.9
Downloaded toml v0.5.11
Downloaded quote v1.0.29
Downloaded syn v1.0.109
Downloaded 18 crates (1.6 MB) in 0.84s
Compiling proc-macro2 v1.0.63
Compiling unicode-ident v1.0.9
Compiling quote v1.0.29
Compiling autocfg v1.1.0
Compiling libc v0.2.147
Compiling syn v1.0.109
Compiling parking_lot_core v0.8.6
Compiling serde v1.0.164
Compiling cfg-if v1.0.0
Compiling scopeguard v1.1.0
Compiling smallvec v1.10.0
Compiling instant v0.1.12
Compiling lock_api v0.4.10
Compiling syn v2.0.22
Compiling parking_lot v0.11.2
Compiling serde_derive v1.0.164
Compiling ctor v0.1.26
Compiling toml v0.5.11
Compiling vgpu_unlock-rs v2.3.1 (/root/vgpu_unlock-rs)
Finished release [optimized] target(s) in 15.20s
Sau khi câu lệnh hoàn tất, bạn sẽ có file thực thi được tạo ra trong thư mục target/release của dự án, sẵn sàng để chạy hoặc triển khai.
Sao chép file libvgpu_unlock_rs.so
trong thư mục target/release/
vào thư mục /lib/nvidia/
.
cp target/release/libvgpu_unlock_rs.so /lib/nvidia/libvgpu_unlock_rs.so
Tiếp theo bạn hãy khởi động lại Proxmox để áp dụng các thay đổi.
reboot
Sau khi cài đặt và cấu hình vGPU, bạn được khuyến nghị kiểm tra các lỗi bằng cách sử dụng lệnh journalctl. Cụ thể, bạn được yêu cầu kiểm tra các lỗi trong hai dịch vụ sau:
- Lệnh này sẽ hiển thị các thông báo trong nhật ký hệ thống liên quan đến dịch vụ nvidia-vgpud. Bạn nên kiểm tra xem có xuất hiện bất kỳ lỗi nào liên quan đến việc khởi động hoặc hoạt động của dịch vụ này.
$ journalctl -u nvidia-vgpud.service | grep 'nvidia-vgpud.service: Succeeded.'
Jul 01 18:43:28 pve-node1 systemd[1]: nvidia-vgpud.service: Succeeded.
- Lệnh này sẽ hiển thị các thông báo trong nhật ký hệ thống liên quan đến dịch vụ nvidia-vgpu-mgr. Bạn nên kiểm tra xem có xuất hiện bất kỳ lỗi nào liên quan đến việc khởi động hoặc hoạt động của dịch vụ này.
$ journalctl -u nvidia-vgpu-mgr.service
-- Journal begins at Sat 2023-07-01 15:15:38 +07, ends at Sat 2023-07-01 18:44:25 +07. --
Jul 01 18:43:27 pve-node1 systemd[1]: Starting NVIDIA vGPU Manager Daemon...
Jul 01 18:43:27 pve-node1 systemd[1]: Started NVIDIA vGPU Manager Daemon.
Jul 01 18:43:28 pve-node1 nvidia-vgpu-mgr[1171]: notice: vmiop_env_log: nvidia-vgpu-mgr daemon started
Sau khi kiểm tra nhật ký của cả hai dịch vụ và không phát hiện bất kỳ lỗi nào, bạn nên kiểm tra lại trạng thái hoạt động của GPU bằng lệnh nvidia-smi
. Nếu GPU hoạt động bình thường và không có lỗi được báo cáo, điều đó có nghĩa là cài đặt và cấu hình vGPU đã thành công và GPU đang hoạt động chính xác trong môi trường của bạn.
$ nvidia-smi
Sat Jul 1 21:01:18 2023
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 460.73.01 Driver Version: 460.73.01 CUDA Version: 11.2 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 GeForce RTX 2060 On | 00000000:81:00.0 Off | N/A |
| 0% 46C P8 12W / 190W | 51MiB / 6143MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
Bước 8 – Tìm hiểu và xác định một số thông tin của Vga.
Kết quả của lệnh mdevctl types
cho thấy danh sách các loại vGPU (virtual GPU) có sẵn trên hệ thống của bạn và thông tin chi tiết về từng loại vGPU.
$ mdevctl types
0000:81:00.0
nvidia-256
Available instances: 24
Device API: vfio-pci
Name: GRID RTX6000-1Q
Description: num_heads=4, frl_config=60, framebuffer=1024M, max_resolution=5120x2880, max_instance=24
nvidia-257
Available instances: 12
Device API: vfio-pci
Name: GRID RTX6000-2Q
Description: num_heads=4, frl_config=60, framebuffer=2048M, max_resolution=7680x4320, max_instance=12
...
< đã lược bỏ bớt kết quả >
...
Dưới đây là giải thích của các thông số trong kết quả:
- Loại vGPU
nvidia-256
:- Số lượng phiên bản vGPU có sẵn: 24
- Giao diện thiết bị (Device API): vfio-pci
- Tên: GRID RTX6000-1Q
- Mô tả: num_heads=4, frl_config=60, framebuffer=1024M, max_resolution=5120×2880, max_instance=24
- Loại vGPU
nvidia-257
:- Số lượng phiên bản vGPU có sẵn: 12
- Giao diện thiết bị (Device API): vfio-pci
- Tên: GRID RTX6000-2Q
- Mô tả: num_heads=4, frl_config=60, framebuffer=2048M, max_resolution=7680×4320, max_instance=12
TIếp theo bạn hãy để ý tới con số 0000:81:00.0
. Số này được gọi là địa chỉ PCI (Peripheral Component Interconnect) và được sử dụng để định danh một thiết bị PCI trong hệ thống. Nó cho biết vị trí cụ thể của thiết bị trên bus PCI.
Trong trường hợp của mình, 0000:81:00.0
đại diện cho một thiết bị được kết nối vào bus PCI với địa chỉ 81:00.0
. Thông qua địa chỉ này, hệ điều hành và các công cụ quản lý hệ thống có thể xác định và tương tác với thiết bị cụ thể này.
Địa chỉ PCI có cấu trúc dạng “domain:bus:device.function”, trong đó:
domain
xác định miền PCI chứa bus hiện tại (thường là 0000).bus
xác định số hiệu của bus PCI.device
xác định số hiệu của thiết bị trên bus.function
xác định số hiệu của chức năng của thiết bị.
Với địa chỉ PCI 0000:81:00.0
, thiết bị được kết nối trực tiếp vào bus PCI có số hiệu 81 và là thiết bị đầu tiên trên bus đó.
Bạn cũng có thể xem địa chỉ PCI ở lệnh nvidia-smi
như hình dưới, lưu ý nếu xem bằng lệnh nvidia-smi
thì bạn hãy bỏ 4 số 0 ở đầu nhé.
Và dưới đây là một loạt các loại khác nhau mà GPU của bạn cung cấp và được chia thành 4 loại riêng biệt:
Type | Intended purpose |
---|---|
A | Virtual Applications (vApps) |
B | Virtual Desktops (vPC) |
C | AI/Machine Learning/Training (vCS or vWS) |
Q | Virtual Workstations (vWS) |
Loại Q profile có thể là loại bạn muốn sử dụng vì nó cho phép tận dụng đầy đủ GPU bằng cách sử dụng máy tính từ xa (ví dụ như Parsec). Bước tiếp theo là lựa chọn Q profile phù hợp cho GPU của bạn. Điều này phụ thuộc nhiều vào VRAM có sẵn trên GPU của bạn. Vì vậy, nếu RTX 2070 Super của bạn có 8GB VRAM và bạn muốn tạo ra 4 vGPU, mỗi vGPU có 2GB VRAM, bạn sẽ chọn một profile có 2GB VRAM. (8GB / 4 vGPU = 2GB). Trong trường hợp này, profile nvidia-257 (RTX6000-2Q) sẽ phù hợp.
Q profile là một cách để chia sẻ GPU thành nhiều máy ảo, cho phép nhiều người sử dụng GPU cùng một lúc. Bằng cách chọn profile có VRAM phù hợp, bạn đảm bảo rằng mỗi máy ảo sử dụng một lượng VRAM đủ cho yêu cầu của nó mà không gây ảnh hưởng đến các máy ảo khác hoặc GPU chính. Trong trường hợp của bạn, việc chọn profile nvidia-257 (RTX6000-2Q) với 2GB VRAM cho mỗi vGPU sẽ phù hợp với yêu cầu của bạn.
Bước 9 – Tạo UUID cho Vga.
Lệnh uuid -n 2
được sử dụng để tạo ra 2 chuỗi UUID ngẫu nhiên. UUID (Universally Unique Identifier) là một chuỗi gồm 128 bit được sử dụng để định danh duy nhất cho các đối tượng và tài nguyên trong hệ thống.
Ví dụ kết quả của lệnh uuid -n 2
có thể là:
$ uuid -n 2
6a8057f2-1818-11ee-9843-7feff7f43530
6a805928-1818-11ee-9844-4f80bf05816d
Mỗi lần chạy lệnh, bạn sẽ nhận được 2 chuỗi UUID khác nhau, đảm bảo tính duy nhất của chúng.
Bước 10 – Khởi chạy một thiết bị PCI ảo.
Lệnh mdevctl start
được sử dụng để khởi chạy một thiết bị ảo (virtual device) dựa trên một mẫu (type) cụ thể. Ví dụ trường hợp lệnh mdevctl start -u 6a8057f2-1818-11ee-9843-7feff7f43530 -p 0000:81:00.0 --type nvidia-257
được sử dụng để khởi chạy một thiết bị ảo với địa chỉ PCI 0000:81:00.0
và sử dụng mẫu nvidia-257
.
Tác dụng của lệnh này là tạo ra một thiết bị ảo dựa trên mẫu nvidia-257
trên địa chỉ PCI cụ thể 0000:81:00.0
. Thiết bị ảo này có thể được sử dụng để chạy các ứng dụng và công việc liên quan đến đồ họa và tính toán sử dụng GPU. Lệnh này thông báo cho hệ thống tạo và khởi chạy một thiết bị ảo với cấu hình tương tự như mẫu nvidia-257
, sử dụng địa chỉ PCI 0000:81:00.0
để gắn kết thiết bị ảo với phần cứng tương ứng trên máy chủ.
mdevctl start -u 6a8057f2-1818-11ee-9843-7feff7f43530 -p 0000:81:00.0 --type nvidia-257
mdevctl start -u 6a805928-1818-11ee-9844-4f80bf05816d -p 0000:81:00.0 --type nvidia-257
Lệnh mdevctl define --auto --uuid 6a8057f2-1818-11ee-9843-7feff7f43530
được sử dụng để định nghĩa một thiết bị ảo (virtual device) với UUID cụ thể 6a8057f2-1818-11ee-9843-7feff7f43530
. Tùy chọn --auto
được sử dụng để cho phép hệ thống tự động chọn các cấu hình phù hợp để tạo ra thiết bị ảo.
Tác dụng của lệnh này là định nghĩa một thiết bị ảo với UUID đã chỉ định. Thiết bị ảo này có thể được sử dụng để tạo ra các thiết bị ảo khác hoặc gắn kết với phần cứng vật lý trên máy chủ. Quá trình định nghĩa thiết bị ảo có thể liên quan đến việc xác định cấu hình, quản lý tài nguyên và tạo ra các file cấu hình tương ứng.
mdevctl define --auto --uuid 6a8057f2-1818-11ee-9843-7feff7f43530
mdevctl define --auto --uuid 6a805928-1818-11ee-9844-4f80bf05816d
Dùng lệnh mdevctl list
để kiếm tra danh sách thiết bị ảo đã định nghĩa ở trên.
$ mdevctl list
6a8057f2-1818-11ee-9843-7feff7f43530 0000:81:00.0 nvidia-257 (defined)
6a805928-1818-11ee-9844-4f80bf05816d 0000:81:00.0 nvidia-257 (defined)
Đây là đoạn config này thiết lập cho một thiết bị Quadro RTX6000, đoạn config này chứa các đối số (args) được sử dụng để cấu hình một thiết bị ảo (virtual device) sử dụng công nghệ vfio-pci và kết nối với thiết bị vật lý có địa chỉ /sys/bus/mdev/devices/6a8057f2-1818-11ee-9843-7feff7f43530.
Cấu hình này sử dụng các đối số như display=off để tắt hiển thị cho thiết bị ảo và id=hostpci0.0 để định danh thiết bị ảo. Ngoài ra, các đối số khác như bus, addr, x-pci-vendor-id, x-pci-device-id, x-pci-sub-vendor-id, x-pci-sub-device-id được sử dụng để xác định các thông số về bus và ID của thiết bị.
UUID 6a8057f2-1818-11ee-9843-7feff7f43530 được gán cho thiết bị ảo, cho phép nó được xác định và quản lý một cách duy nhất trên hệ thống.
Tuy nhiên, lưu ý rằng tác dụng cụ thể của đoạn config này phụ thuộc vào mục đích và cấu hình của hệ thống bạn đang làm việc. Nó có thể được sử dụng để gắn kết thiết bị ảo với một máy ảo hoặc một ứng dụng cụ thể trên hệ thống.
# Quadro RTX6000
args: -device 'vfio-pci,sysfsdev=/sys/bus/mdev/devices/6a8057f2-1818-11ee-9843-7feff7f43530,display=off,id=hostpci0.0,bus=ich9-pcie-port-1,addr=0x0.0,x-pci-vendor-id=0x10de,x-pci-device-id=0x1e30,x-pci-sub-vendor-id=0x10de,x-pci-sub-device-id=0x12ba' -uuid 6a8057f2-1818-11ee-9843-7feff7f43530
# Quadro RTX6000
args: -device 'vfio-pci,sysfsdev=/sys/bus/mdev/devices/6a805928-1818-11ee-9844-4f80bf05816d,display=off,id=hostpci0.0,bus=ich9-pcie-port-1,addr=0x0.0,x-pci-vendor-id=0x10de,x-pci-device-id=0x1e30,x-pci-sub-vendor-id=0x10de,x-pci-sub-device-id=0x12ba' -uuid 6a805928-1818-11ee-9844-4f80bf05816d
Lưu ý, phần x-pci-device-id
bạn có thể vào trang https://envytools.readthedocs.io/en/latest/hw/pciid.html
để lấy mã tương ứng với VGA.
Ví dụ ở trên mình lấy mã VGA 0x1e30
tương ứng với Quadro RTX 6000
.
Bước 11 – Gắn PCI ảo vào máy ảo.
Xác định ID của máy ảo và mở nó theo đường dẫn mặc định vi /etc/pve/qemu-server/<id_vm>.conf
và thêm nội dung dưới vào file này.
# Quadro RTX6000
args: -device 'vfio-pci,sysfsdev=/sys/bus/mdev/devices/6a8057f2-1818-11ee-9843-7feff7f43530,display=off,id=hostpci0.0,bus=ich9-pcie-port-1,addr=0x0.0,x-pci-vendor-id=0x10de,x-pci-device-id=0x1e30,x-pci-sub-vendor-id=0x10de,x-pci-sub-device-id=0x12ba' -uuid 6a8057f2-1818-11ee-9843-7feff7f43530
Và đây là một ví dụ sau khi đã thêm nội dung trên vào file /etc/pve/qemu-server/101.conf
.
bios: ovmf
boot: order=ide0;ide2;net0
cores: 4
efidisk0: directory-sdb:101/vm-101-disk-0.qcow2,efitype=4m,size=528K
ide0: directory-sdb:101/vm-101-disk-1.qcow2,backup=0,size=50G
ide2: none,media=cdrom
machine: pc-q35-7.2
memory: 8192
meta: creation-qemu=7.2.0,ctime=1688206086
name: vGPU-1
net0: e1000=D2:CC:42:B8:23:DF,bridge=vmbr0,firewall=1
numa: 0
ostype: win11
scsihw: virtio-scsi-single
smbios1: uuid=2f690201-26a2-45ac-9a13-c97179c20880
sockets: 1
vmgenid: 844cfb87-ab07-44f3-a4a5-49920223153e
#Quadro RTX6000
args: -device 'vfio-pci,sysfsdev=/sys/bus/mdev/devices/6a8057f2-1818-11ee-9843-7feff7f43530,display=off,id=hostpci0.0,bus=ich9-pcie-port-1,addr=0x0.0,x-pci-vendor-id=0x10de,x-pci-device-id=0x1e30,x-pci-sub-vendor-id=0x10de,x-pci-sub-device-id=0x12ba' -uuid 6a8057f2-1818-11ee-9843-7feff7f43530
Bây giờ bạn hãy bật máy ảo lên và lúc này bạn sẽ thấy tại phần Display adaptors sẽ xuất hiện 2 card mạng.
- Vga đầu tiên chính là vga mặc định để bạn console vào.
- Vga thứ 2 là vga của PCI ảo mà bạn đã thêm vào ở bước trên, nói chính xác hơn là mã Quadro RTX6000.
Giờ bạn hãy vào trang chủ của Nvidia và download drive dành cho Quadro RTX6000.
https://www.nvidia.com/Download/index.aspx?lang=en-us
Chọn đúng mã là Quadro RTX6000 cho Windows 10 nhé.
Bấm Download để tải Drive này về.
Giải nén Driver.
Chọn Custom (Advanced).
Bỏ tích RTX Desktop Manager và USBC Driver.
Quá trình cài đặt bắt đầu.
Cài đặt thành công, bấm close và khởi động lại máy ảo.
Và đây là kết quả sau khi bạn cài xong drive cho em nó.
Tiếp theo vì máy ảo không có card âm thanh và vga của máy ảo cũng là vga ảo nên không có cổng xuất âm thanh. Vì vậy chúng ta cần phải cài đặt âm Drive âm thanh ảo cho máy ảo.
Hãy vào link dưới và tải một phần mềm có tên là VB-CABLE Virtual Audio Device.
https://vb-audio.com/Cable/
Mình đang sử dụng Windows 10 nên mình chọn bản của Windows.
Sau khi download về, bạn hãy giải nén và tìm đến file VBCABLE_Setup_x64.
Bấm Install Driver.
Bấm Install.
Cài đặt xong, bạn được nhắc nhở có thể sẽ cần khởi động lại máy để nhận Driver ảo của âm thanh.
Và đây là kết quả.
Bước 12 – Tạo một Profile Override cho vGPU.
Nếu như bây giờ bạn dùng lệnh nvidia-smi vgpu
thì sẽ nhận được thông báo Not supported devices in vGPU mode
.
$ nvidia-smi vgpu
Not supported devices in vGPU mode
Để thoát khỏi thông báo này bạn phải tiến hành unlock vgpu, các bước tiến hành các bạn hãy tiếp tục theo dõi.
Đây là một quá trình tùy chỉnh các thiết lập của vGPU như độ phân giải tối đa, kích hoạt CUDA và vô hiệu hóa frame limiter cho mỗi profile. Qua đó, bạn có thể điều chỉnh các thiết lập này theo ý muốn của mình.
Các bước cụ thể trong quá trình tạo Profile Override như sau:
Tạo một thư mục mới trong /etc/vgpu_unlock/ bằng lệnh:
mkdir /etc/vgpu_unlock/
Trong file profile_override.toml
, chỉnh sửa các thiết lập theo ý muốn của bạn. Ví dụ:
cat > /etc/vgpu_unlock/profile_override.toml << 'OEF'
[profile.nvidia-257]
num_displays = 1
display_width = 1920
display_height = 1080
max_pixels = 2073600
cuda_enabled = 1
frl_enabled = 0
OEF
Trong đoạn config trên, bạn có thể thay đổi các giá trị của num_displays
, display_width
, display_height
, max_pixels
, cuda_enabled
, frl_enabled
và profile
để phù hợp với yêu cầu của bạn.
Tiếp theo, bạn cần tải xuống script nvidia-smi vGPU wrapper bằng lệnh:
wget https://raw.githubusercontent.com/wvthoog/nvidia_vgpu_proxmox_7/main/nvidia-smi
Đổi tên file nvidia-smi
gốc bằng lệnh:
mv /usr/bin/nvidia-smi /usr/bin/nvidia-smi.orig
Sao chép script wrapper nvidia-smi vào /usr/bin/ và cấp quyền thực thi cho nó bằng lệnh:
cp nvidia-smi /usr/bin/
chmod +x /usr/bin/nvidia-smi
Bây giờ, khi bạn thực thi lệnh nvidia-smi vgpu
, bạn sẽ thấy kết quả có thông tin đầu ra và hiện tại đã có 1 slot vga gắn vào máy ảo vGPU-1
$ nvidia-smi vgpu
Sat Jul 1 22:26:22 2023
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 460.73.01 Driver Version: 460.73.01 |
|---------------------------------+------------------------------+------------+
| GPU Name | Bus-Id | GPU-Util |
| vGPU ID Name | VM ID VM Name | vGPU-Util |
|=================================+==============================+============|
| 0 GeForce RTX 2060 | 00000000:81:00.0 | 0% |
| 3251634191 GRID RTX600... | 6a80... vGPU-1,debug-thr... | 0% |
+---------------------------------+------------------------------+------------+
Và đây là kết quả cuối cùng.
Tài liệu tham khảo:
- https://gitlab.com/polloloco/vgpu-proxmox?fbclid=IwAR2CrRnUoG8tTU4tSt_HHECUWFRzhOm92zKYy-Mt1X2rtq-997WLgjyGr7E#enabling-iommu
- https://wvthoog.nl/proxmox-7-vgpu-v2/
Tổng hợp một số link tải driver: