跳到主內容

在 VM 裡面使用顯示卡

BUBU 公司目前有在計畫把設計及研發的由實體設備轉換為虛擬機,讓使用者從遠端連線方式使用。
Proxmox VE 在 5.3-5 的時候已經有加入此功能,可以在虛擬機上面增加顯示卡,這樣子在跑 3D 的時候可以使用 GPU 的運算能力。在 VM 下面的硬體選項裡面新增加一個 PCI 裝置,新增時發現出現下面的訊息。

109.03.19 由於剛好有幫群友測試問題,因 Proxmox VE 在 6 版之後已經有支援 UEFI 模式,因此設定的方式是不太一樣。請參考下方式的設定方式

110.10.30 剛好有幫群友測試,新增 Linux 的 Ubuntu 在 KVM 環境操作

運行環境


Proxmox VE 5版、6版、7版、8版

確認 IOMMU


在設定過程中如果發現到要新增新的 PCI 裝置的出現以下的訊息請先確認 BOIS 裡面的 VT-Dsr-iov 這兩個選項是否有正確啟動,如果沒有開啟的話請先進到 BOIS 裡面啟用此功能。已啟用再進到命令列修改設定檔。

注意 sr-iov 這個功能不是每一台 BIOS 都會有以及名稱也不一定會一樣,請多多注意一下

No IOMMU detected, please activate it.See Documentation for further information.

IOMMU.png

設定過程


我所設定的設備環境是以 Intel CPU 來設定的,如果是使用 AMD CPU 請在參考一下官方文件手冊,日後如有碰到使用 AMD CPU ,小弟會在上來修改文章

GRUB 模式

  • Proxmox VE 7 版以下 此模式是當時如果在安裝 Proxmox VE 時,是以 Legacy 傳統模式安裝的話,設定方式如下
vim /etc/default/grub

尋找
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
修改成
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"
更新設定檔
update-grub

設定完之後,重啟 pve 主機
  • Proxmox VE 8 版以上 此模式是當時如果在安裝 Proxmox VE 時,是以 Legacy 傳統模式安裝的話,設定方式如下
vim /etc/default/grub

尋找
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
修改成
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt pcie_acs_override=downstream,multifunction initcall_blacklist=sysfb_init"
更新設定檔
update-grub

設定完之後,重啟 pve 主機
UEFI 模式

此模式是當時如果在安裝 Proxmox VE 時,是以 UEFI 模式安裝的話,設定方式如下

vim /etc/kernel/cmdline

#在後面增加 intel_iommu=on
#修改前
root=ZFS=rpool/ROOT/pve-1 boot=zfs

#修改後
root=ZFS=rpool/ROOT/pve-1 boot=zfs intel_iommu=on

#更新設定檔
pve-efiboot-tool refresh
設定 VFIO 模組

  • 新增加 vim /etc/modules
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
kvmgt
  • 修改 IOMMU
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
  • 更新設定
update-initramfs -u -k all

以上設定完之後,要重啟 PVE 主機設定值才會生效

  • 重啟後確認是否有啟動 IOMMU 服務
dmesg | grep -e DMAR -e IOMMU

iommu-02.png

設定 VM 服務環境


  • 使用 Nvidia 繪圖卡,禁用讓本機使用Nvidia Drive on host
echo "blacklist radeon" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nvidia" >> /etc/modprobe.d/blacklist.conf
  • 使用 AMD 繪圖卡,禁用讓本機使用AMD Drive on host(還沒有使用過 AMD 的顯卡日後有機會待驗證)
echo "blacklist radeon" >> /etc/modprobe.d/blacklist.conf
echo "blacklist amdgpu" >> /etc/modprobe.d/blacklist.conf
  • 使用 INTEL 繪圖卡,禁用讓本機使用INTEL Drive on host(還沒有使用過 INTEL 的顯卡日後有機會待驗證)
echo "blacklist snd_hda_intel" >> /etc/modprobe.d/blacklist.conf
echo "blacklist snd_hda_codec_hdmi" >> /etc/modprobe.d/blacklist.conf
echo "blacklist i915" >> /etc/modprobe.d/blacklist.conf
  • 找出顯卡 PCI ID
lspci | grep VGA

01:00.0 VGA compatible controller: NVIDIA Corporation GM107GL [Quadro K2200] (rev a2)

PVEGUI-3.png

  • 查看規格
lspci -n -s 01:00

01:00.0 0300: 10de:13ba (rev a2)
01:00.1 0403: 10de:0fbc (rev a1)

PVEGUI-4.png

  • 使用上面獲得的ID將GPU分配給vfio:
echo "options vfio-pci ids=10de:13ba,10de:0fbc disable_vga=1" > /etc/modprobe.d/vfio.conf
  • 更新設定檔並且生效
update-initramfs -u
  • 到虛擬機conf 修改或新增 vim /etc/pve/qemu-server/XXX.conf (現在可以在管理介面上直接增加顯示卡所以不一定要進到該 VM 的設定檔進行設定以下修改方式可以選擇性修改,如果您很了解設定的話可以再進來這裡去設定)

  • Proxmox VE 7 版以下

bios: ovmf
machine: q35
cpu: host,hidden=1,flags=+pcid
numa: 1
hostpci0: 04:00,x-vga=on,pcie=1
#當無法開機跳出不正確pcie id時 改為
#hostpci0: 0000:04:00,x-vga=on,pcie=1
#如果純粹只需要顯卡算力,請改用以下格式:
hostpci0: 04:00,pcie=1(AMD系列GPU需要移除 pcie=1 選項)
#如果還會顯示代號43,請加入這一行試試看
args: -cpu 'host,+kvm_pv_unhalt,+kvm_pv_eoi,hv_vendor_id=NVVM,kvm=off'

hv_vendor_id 這可以修改其他的代號

  • Proxmox VE 8 版以上
bios: ovmf
machine: q35
cpu: host
numa: 1
hostpci0: 04:00,pcie=1
#當無法開機跳出不正確pcie id時 改為
#hostpci0: 0000:04:00,x-vga=on,pcie=1
#如果純粹只需要顯卡算力,請改用以下格式:
hostpci0: 04:00,pcie=1(AMD系列GPU需要移除 pcie=1 選項)

  到網頁上的硬體那裡去新增 PCI 裝置 選擇所以安裝的顯卡,並且把所有功能要打勾,主要 GPU 不用勾沒關係

  • 新增或編輯 PCI 裝置

PVEGUI-1.png

  • 選擇您想要使用的顯示卡

PVEGUI-2.png

  • 選擇完之後在您剛剛設定的服務遠端進去之後是否能夠正常顯示該設備名稱

PVEGUI-5.png

Linux VM 設定

  本篇是在 Ubuntu 18.04 環境下做設定的

  • 安裝 ubuntu-drivers-common
apt install ubuntu-drivers-common
  • 自動安裝驅動,安裝完成要重啟系統
ubuntu-drivers autoinstall
  • 確認是否有安裝成功
nvidia-smi
  • 安裝 CUDA 套件,安裝完成要重啟系統
apt install nvidia-cuda-toolkit
  • 確認是否有安裝成功
nvidia-smi

vm-vga-01.png




參考相關網頁