用Proxmox搞定gpu穿透

在用proxmox加雲終端盒子測試完桌面虛擬機之後,看到某qq羣有人問能不能虛擬化gpu,用來作3D設計。正好閒置的臺式電腦有amd R9 290X及R9 390X兩塊顯卡,因爲挖礦太耗電,已經放棄挖礦(挖以太幣)。計劃用此臺式機,安裝proxmox,作好設置並安裝好虛擬機,並把宿主機的gpu資源透傳給此虛擬機。若是透傳正確,最起碼能在虛擬機識別AMD顯卡。按照這個思路,回到家立刻開幹。--猛戳此處有驚喜!!!
node

 

宿主機上的操做linux

安裝proxmox以前,須要確保cpu開啓虛擬化支持,這個操做在bios裏邊完成,請按主板的說明書進行操做,通常不會有什麼障礙。接下來,用u盤安裝proxmox,我用的主板有點奇葩,須要對引導「BOOT」下的「安全」作更改,默認是windows,改爲「其它操做系統」,不然一直沒法用u盤引導及安裝。ios

 

在安裝過程當中,設置好proxmox的ip地址及帳號密碼,能用瀏覽器登陸並進行後臺管理。以ssh登陸系統,修改文件/etc/apt/sources.list.d/pve-enterprise.list ,把惟一的哪行內容註釋掉(不註釋的話,web界面登陸進行管理時會提示軟件更新失敗,畢竟咱沒花錢訂閱)。執行命令」apt-get update && apt-get upgrade」,有利於隨時對軟件包進行更新。web

 

因爲gpu虛擬化還未能在proxmox的web管理界面提供支持,所以,要啓用這個功能,得登陸proxmox所在宿主機的系統debian,進行以下操做:windows

 

○修改grub(與centos稍有差別)。編輯文件/etc/default/grub,修改行「GRUB_CMDLINE_LINUX_DEFAULT="quiet",使其爲「GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on" 。執行指令「update-grub」 使修改生效。centos

root@pve55:~# update-grubapi

Generating grub configuration file ...瀏覽器

Found linux image:   /boot/vmlinuz-4.15.17-1-pve安全

Found initrd image:   /boot/initrd.img-4.15.17-1-pve服務器

Found memtest86+ image:   /boot/memtest86+.bin

Found memtest86+ multiboot image:   /boot/memtest86+_multiboot.bin

Adding boot menu entry for EFI firmware   configuration

done

爲檢驗其效果,用一下指令驗證其有效性。

root@pve55:~# dmesg   | grep -e DMAR -e IOMMU

[      0.000000] ACPI: DMAR 0x00000000C88CAD70 0000B8 (v01 INTEL  HSW        00000001 INTL 00000001)

[      0.000000] DMAR: Host address width 39

[      0.000000] DMAR: DRHD base: 0x000000fed90000 flags: 0x0

[      0.000000] DMAR: dmar0: reg_base_addr fed90000 ver 1:0 cap   c0000020660462 ecap f0101a

[      0.000000] DMAR: DRHD base: 0x000000fed91000 flags: 0x1

[      0.000000] DMAR: dmar1: reg_base_addr fed91000 ver 1:0 cap   d2008020660462 ecap f010da

[      0.000000] DMAR: RMRR base: 0x000000c883b000 end: 0x000000c8847fff

[      0.000000] DMAR: RMRR base: 0x000000cb000000 end: 0x000000cf1fffff

[      0.000000] DMAR-IR: IOAPIC id 8 under DRHD base  0xfed91000 IOMMU 1

[      0.000000] DMAR-IR: HPET id 0 under DRHD base 0xfed91000

[      0.000000] DMAR-IR: Queued invalidation will be enabled to support   x2apic and Intr-remapping.

[      0.000000] DMAR-IR: Enabled IRQ remapping in x2apic mode

若是執行「dmesg | grep -e DMAR -e IOMMU」沒有輸出,則代表存在問題。極有多是bios設置的問題,須要啓動cpu的vt-x支持。對於amd類型的cpu,/etc/default/grub文件對於修改成「GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on」。該項目還支持幾個值,可根據狀況增長。

 

○新增模塊。修改文件/etc/modules,加入以下的行(默認爲空):

vfio

vfio_iommu_type1

vfio_pci

vfio_virqfd

 

 IOMMU隔離校驗。執行指令 find /sys/kernel/iommu_groups/ -type l」,有輸出則表示正常。

root@pve55:~# find   /sys/kernel/iommu_groups/ -type l

/sys/kernel/iommu_groups/7/devices/0000:00:1b.0

/sys/kernel/iommu_groups/5/devices/0000:00:16.0

/sys/kernel/iommu_groups/13/devices/0000:03:00.0

/sys/kernel/iommu_groups/3/devices/0000:00:03.0

/sys/kernel/iommu_groups/11/devices/0000:00:1d.0

/sys/kernel/iommu_groups/1/devices/0000:01:00.1

/sys/kernel/iommu_groups/1/devices/0000:00:01.0

/sys/kernel/iommu_groups/1/devices/0000:01:00.0

/sys/kernel/iommu_groups/8/devices/0000:00:1c.0

/sys/kernel/iommu_groups/6/devices/0000:00:1a.0

/sys/kernel/iommu_groups/4/devices/0000:00:14.0

/sys/kernel/iommu_groups/12/devices/0000:00:1f.3

/sys/kernel/iommu_groups/12/devices/0000:00:1f.2

/sys/kernel/iommu_groups/12/devices/0000:00:1f.0

/sys/kernel/iommu_groups/2/devices/0000:00:02.0

/sys/kernel/iommu_groups/10/devices/0000:00:1c.3

/sys/kernel/iommu_groups/10/devices/0000:04:00.0

/sys/kernel/iommu_groups/0/devices/0000:00:00.0

/sys/kernel/iommu_groups/9/devices/0000:00:1c.2

 

○查看gpu顯卡的地址,用於後邊對虛擬機進行配置。查看硬件信息的指令爲「lspci -i」,執行後,會有大量的信息輸出,咱們只需關心gpu顯卡。

blob.png

數字「01:00.0」就是gpu顯卡地址,記下這個數值,以備未來使用。

 

○gpu直通

l  用剛剛獲得的數值作參數,執行 lspci -n -s 01:00 ,獲得兩行輸出,將該輸出重定向到文件/etc/modprobe.d/vfio.conf.

root@pve55:~# lspci   -n -s 01:00

01:00.0 0300: 1002:67b0 (rev 80)

01:00.1 0403: 1002:aac8

root@pve55:~#echo "options vfio-pci ids=10de:1381,10de:0fbc" > /etc/modprobe.d/vfio.conf
 

 

l  驅動黑名單

echo "blacklist radeon" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nvidia" >> /etc/modprobe.d/blacklist.conf
 

 

◎建立windows虛擬機

在進行正式建立以前,可預先準備好2個鏡像文件。一個windows 10 iso,另一個virtio-win iso.將這兩個iso文件複製到proxmox所在系統的目錄」 /var/lib/vz/template/iso/」,用這種方式比從web界面上傳iso要可靠。

root@pve55:~# ls   -al /var/lib/vz/template/iso/

total 8574028

drwxr-xr-x 2 root root       4096 Aug 17 15:01 .

drwxr-xr-x 5 root root       4096 Aug 17 14:25 ..

-rw-r--r-- 1 root root 4159854592 Aug   17 10:59 cn_windows_10_education_x64_dvd_6847843.iso

-rw-r--r-- 1 root root 4303300608 Jul   16 18:04 cn_windows_10_multiple_editions_x64_dvd_6848463.iso

-rw-r--r-- 1 root root  316628992 Aug 17 14:52 virtio-win-0.1.141.iso

 

○web管理界面建立虛擬機  --猛戳此處有驚喜!!!

瀏覽器訪問 https://172.16.35.55:8006登陸系統,點擊頁面右上角按鈕「建立虛擬機」,操做系統選windows。下拉列表框選擇前一步手工上傳的iso文件,以下圖所示:

blob.png

往下建立硬盤,所設置的項以下圖:

blob.png

後邊幾步按實際狀況分配資源,只到網絡這步,選virtio(半虛擬化),提交完成建立。不過,這還沒完,還要幾個步驟須要執行(普通用途的虛擬機建立到這裏就完成了):

l  修改虛擬機的BIOS爲OVMF(默認是SeaBIOS),其操做以下圖所示:

blob.png

l  添加EFI磁盤,可不調整大小。若是不建立,後邊安裝windows操做系統極可能失敗。

blob.png

l  添加cd-rom,並將其與virtio驅動程序相關聯。不執行此操做,在安裝windows可能不能識別硬盤,沒法往下繼續進行。

blob.png

l  修改「顯示」項,爲了配合雲終端盒子,這裏我選」Spice」。

blob.png

l  命令行登陸系統,打開文件/etc/pve/nodes/pve55/qemu-server/100.conf ,其內容由上述操作所生成。

root@pve55:~# more   /etc/pve/nodes/pve55/qemu-server/100.conf

bios: ovmf

bootdisk: scsi0

cores: 4

efidisk0:   local-lvm:vm-100-disk-2,size=128K

ide0:   local:iso/virtio-win-0.1.141.iso,media=cdrom,size=309208K

ide2:   local:iso/cn_windows_10_education_x64_dvd_6847843.iso,media=cdrom

memory: 8196

name: s50

net0:   virtio=4E:62:86:E8:C4:A0,bridge=vmbr0

numa: 0

ostype: win10

scsi0:   local-lvm:vm-100-disk-1,cache=writethrough,size=100G

scsihw: virtio-scsi-pci

smbios1:   uuid=de02509a-298b-4150-b225-4be73f471210

sockets: 1

vga: qxl

還有幾個項,不能從瀏覽器添加進來,須要手工編輯並加入,其內容以下(加在100.conf文件的末尾):

machine: q35
hostpci0: 01:00,pcie=1,x-vga=on
args: -device intel-hda,id=sound5,bus=pci.0,addr=0x18
hostpci0: 01:00,pcie=1,x-vga=on
 

usb1:spice

usb2:spice

 

○安裝windows虛擬機

Web管理界面點擊已經建立好的虛擬機,啓動à控制檯。

blob.png

彈出windows安裝界面,按常規安裝windows操做系統的方法一步步往下進行。安裝過程有兩個鼠標軌跡,有點惱人。等系統安裝完之後,把驅動spice-guest-tool安裝上,就沒有這個問題。

blob.png

往下幾步,到選擇安裝位置的界面,沒有把硬盤給識別出來,須要進行處理加載驅動處理。

blob.png

與官方視頻介紹稍有差別,這裏進去之後,選vioscsi,先把硬盤驅動器識別上。

blob.png

進度條假意來回走動,向人昭示是真的在掃描驅動,片刻,硬盤驅動器癡線在界面中,能夠往下繼續進行。

blob.png


○解決屏幕上兩個鼠標問題。

安裝好的虛擬機,自動識別網卡並得到ip地址,用瀏覽器訪問http://www.spice-space.org,下載spice-guest-tools工具包,點擊幾回「一下步」便可完成。

blob.png

運行完畢,屏幕分辨率顯示正常,屏幕鼠標合二爲一。

 

◎虛擬機安裝gpu顯卡驅動

最開始,用的gpu顯卡爲adm Radeon R9 290x,虛擬機操做系統識別上屬主機的顯卡,在設備管理器裏邊,以×××歎號顯示設備可不用。分別嘗試用驅動精靈、360驅動大師去檢查,都能識別gpu顯卡,但執行安裝後重啓系統,又處於不能使用的狀態。從官網下載驅動軟件,400多M的文件,執行後,仍是不正常。算了,把R290X卸下來,換成R390x。運氣不錯,安裝完spice-guest-tools包,竟然把顯卡驅動也順帶安裝好了。

blob.png

如今,鼠標疊影解決了,顯示效果也很清晰。接下來的操做,就在虛擬出來的雲桌面上進行(雲終端盒子去連proxmox服務器端的自定義spice端口)。

blob.png


◎虛擬化gpu測試

關閉剛建立好並正常運行的虛擬機,在web管理界面以此虛擬機克隆出另一個。在克隆時,最好關閉虛擬機,或者生成一個模板,後邊建立虛擬機就用模板來克隆。虛擬機處於運行狀態執行克隆,速度慢得驚人,不建議在實際生產中使用。

 

啓動一個虛擬機,正常;再啓動第二個虛擬機,報錯,提示設備繁忙。這應該是gpu顯卡直通(pass-through)被前一個虛擬機獨佔所致。爲了驗證這一想法,關掉正常啓動那個虛擬機,再啓動另一個,正常,緣由確實是這個。

 023.jpg

我的認爲,這種獨佔方式在實際應用中不具有太多的優點。以一個高配的顯卡,虛擬化多個gpu,共享給更多的人使用,纔有有吸引力。查了兩大顯卡設備製造商amd與nvida,已經有解決方案;amd的稱mxgpu,而nvida的叫vgpu。兩家都發布了對應操做系統的驅動程序,受條件限制(amd 推薦radeon firepro S7100顯卡),暫時沒法繼續進行試驗,但願有條件的老司機不妨試試,並把實驗結果告知你們。

 

最後,和你們分享個人訂閱專欄《負載均衡高手煉成記》,本專欄依託做者十餘年IT運維經驗,從入門到實操,手把手教你構建運行不一樣場景下負載均衡以及平常維護。

aaaaa.jpg

相關文章
相關標籤/搜索