在oVirt中可以将主机上的物理GPU分配给虚拟机,以能够支撑那些需要硬件GPU支持的应用。
有两种方式可以将GPU分配给一个虚拟机:
一种是GPU透传:
可以将物理主机上的硬件GPU直接透传给虚拟机,由虚拟机独占使用,物理主机释放该硬件GPU。
另一种是GPU虚拟化(vGPU):
将一个物理GPU拆分成多个虚拟GPU设备,将这些虚拟的GPU设备分配给一个或多个虚拟机作为虚拟GPU使用。这些虚拟机共享同一个物理GPU的性能。这种方式下需要使用支持GPU虚拟化的物理GPU,例如AMD的S7150、Nvidia的Tesla M10/M60等。
注意无论是GPU透传还是GPU虚拟化,不同类型卡的处理方式不同,今天我们来看下如何在oVirt透传使用Nvidia普通的GPU卡。
环境信息
oVirt版本:4.3.10
显卡型号:Nvidia GeForce GTX 970
GuestOS:windows 7 x64
操作过程
首先SSH到插有物理GPU的主机上,通过“lspci -Dnn|grep -i NVIDIA”命令查看下显卡的信息,如下图;
可以看到有两个相关联的设备,一个是图形控制器“0000:65:00.0”,它的vendor-id:device-id是“10de:13c2”,另一个是音频控制器“0000:65:00.1”,它的vendor-id:device-id是“10de:0fbb”。
然后将主机维护,在主机列表页面,选中带GPU的主机,点击【管理】->【维护】,如下图:
维护成功后,选中该主机,点击【编辑】,弹出编辑对话框,选择【内核】选项卡,在“内核命令行”中输入“rdblacklist=nouveau intel_iommu=on pci-stub.ids=10de:13c2,10de:0fbb”,注意pci-stub.ids等号后面是上面查到的两个设备的ID,中间用逗号隔开,如下图;
完事点确定返回主机列表,选中该主机,点击【安装】->【重新安装】,采用默认的选项,执行重新安装主机的操作,如下图;
等待重新安装完成后,主机会自动激活,然后选中主机,点击【管理】->【重启】,执行重启主机的操作,如下图;
重启完成后,SSH到主机上,通过“cat /proc/cmdline”命令,确认下刚才的内核命令行参数添加成功,如下图;
接下来,按照以下步骤下载配置uefi固件:
- 下载此文件http://www.kraxel.org/repos/firmware.repo并将其拷贝到node主机上的/etc/yum.repo.d/目录下
- 执行“yum install -y edk2.git-ovmf-x64”
- 执行“mv /usr/share/edk2.git/ovmf-x64/OVMF_CODE-pure-efi.fd /usr/share/OVMF/OVMF_VARS_EFI.fd”
- 然后,在/usr/libexec/vdsm/hooks/before_vm_start路径下创建一个名为“50_nvgpu”的hook文件,内容如下:
#!/usr/bin/python2 import os import hooking domxml = hooking.read_domxml() vm_name = domxml.getElementsByTagName('name')[0].childNodes[0].nodeValue if vm_name != "HostedEngine": os_info = domxml.getElementsByTagName('os')[0] loader_info = domxml.createElement('loader') loader_value = domxml.createTextNode('/usr/share/OVMF/OVMF_VARS_EFI.fd') loader_info.appendChild(loader_value) loader_info.setAttribute('readonly', 'yes') loader_info.setAttribute('secure', 'no') loader_info.setAttribute('type', 'pflash') nvram_info = domxml.createElement('nvram') nvram_name = '/var/tmp/%s_VARS.fd' % vm_name nvram_value = domxml.createTextNode(nvram_name) nvram_info.appendChild(nvram_value) os.system("qemu-img create -f raw %s 1M" % nvram_name) os_info.appendChild(loader_info) os_info.appendChild(nvram_info) features_info = domxml.getElementsByTagName('features')[0] kvm_info = domxml.createElement('kvm') hidden_info = domxml.createElement('hidden') hidden_info.setAttribute('state', 'on') kvm_info.appendChild(hidden_info) features_info.appendChild(kvm_info) device_info = domxml.getElementsByTagName('devices')[0] video_info = domxml.getElementsByTagName('video') if video_info: video_info = video_info[0] device_info.removeChild(video_info) video_info = domxml.createElement('video') model_info = domxml.createElement('model') model_info.setAttribute('type', 'vga') video_info.appendChild(model_info) device_info.appendChild(video_info) hooking.write_domxml(domxml)
使用“chmod 755 50_nvgpu”修改该hook文件的权限
好,创建一个2核4G的windows7虚机,注意操作系统类型选择“Other OS”,如下图:
然后从CD引导正常安装windows7系统即可,注意由于上面的hook让虚机使用uefi启动,所以在开始启动时有一丁点不同,如下图:
此时敲任意键进入下一步即可;
此时敲任意键从CD(也就是iso镜像)引导,接下来按正常过程安装windows7即可;
安装完成windows7系统后,将Guesttools安装上;
将虚机关闭,我们要分配显卡了,进入到虚机的“主机设备”页面,点击【添加设备】,弹出“添加主机设备”对话框,从“有效的主机设备”列表中找到我们上面通过lspci查到的设备号“0000:65:00.0”和“0000:65:00.1”,注意两个要同时选中,点击下方的“箭头”,如下图;
然后点击确定,返回到虚机的“主机设备”页面查看下,如下图;
下一步,将虚机开机运行,进入到虚机中,查看设备管理器中的设备状态,如下图:
下一步安装显卡驱动,从Nvidia官网上下载对应的显卡驱动,如下图:(注意这里根据你自己的显卡型号来)
注意从这里之后我们使用“远程桌面”(也就是RDP)连接这个window7虚机。
下载显卡驱动后,将其拷贝到虚机中(远程桌面可以直接复制文件),运行安装,如下图:
(注意:安装驱动要通过远程桌面,不要通过novnc和spice客户端安装)
如果你碰到下面这种情况,那就按它的提示,将两个补丁文件下载下来先装上,重启虚机后再重新运行显卡的安装程序:
安装完显卡驱动后,重启虚机,然后我们再看下设备管理器中显卡的状态,如下图:
cmd里输入“dxdiag”查看下DirectX的状态:
ok,到这里我们就将一块普通的Nvidia显卡透传到了oVirt的Windows7虚机中了。
开源的spice协议目前是不支持物理GPU的。
PS:转载文章请注明来源:oVirt中文社区(www.cnovirt.com)
扫码?加好友拉你进oVirt技术交流群!
期待多块物理GPU组成vgpu池,按需分配给vm的大作来到。
为啥还是Python2??
4.4超融合没有uefi启动?