By accessing the website and accepting the Cookie Policy, you agree to use the cookies provided by the Site in accordance with to analyze traffic, remember your preferences, and optimize your experience.
用Proxmox搞定GPU穿透
pve Proxmox VE    2018-11-26 12:50:41    645    0    0
emengweb   pve Proxmox VE

台式机安装proxmox,做好设置并安装好虚拟机,并把宿主机的gpu资源透传给此虚拟机。如果透传正确,最起码能在虚拟机识别AMD显卡。按照这个思路,回到家马上开干。

 

宿主机上的操作

安装proxmox之前,需要确保cpu开启虚拟化支持,这个操作在bios里边完成,请按主板的说明书进行操作,一般不会有什么障碍。接下来,用u盘安装proxmox,我用的主板有点奇葩,需要对引导“BOOT”下的“安全”做更改,默认是windows,改成“其它操作系统”,否则一直无法用u盘引导及安装。

 

在安装过程中,设置好proxmox的ip地址及账号密码,能用浏览器登录并进行后台管理。以ssh登录系统,修改文件/etc/apt/sources.list.d/pve-enterprise.list ,把唯一的哪行内容注释掉(不注释的话,web界面登录进行管理时会提示软件更新失败,毕竟咱没花钱订阅)。执行命令”apt-get update && apt-get upgrade”,有利于随时对软件包进行更新。

 

由于gpu虚拟化还未能在proxmox的web管理界面提供支持,因此,要启用这个功能,得登录proxmox所在宿主机的系统debian,进行如下操作:

 

○修改grub(与centos稍有差异)。编辑文件/etc/default/grub,修改行“GRUB_CMDLINE_LINUX_DEFAULT="quiet",使其为“GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on" 。执行指令“update-grub” 使修改生效。

root@pve55:~# update-grub
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

往下创建硬盘,所设置的项如下图:

后边几步按实际情况分配资源,只到网络这步,选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显卡),暂时无法继续进行试验,希望有条件的老司机不妨试试,并把实验结果告知大家。







上一篇: 解决kvm虚拟化无法关闭客户机

下一篇: Windows2012R2 远程桌面服务(RDP)3389存在SSL漏洞的解决办法

645 人读过
文档导航