0°

在oVirt中透传使用Nvidia普通GPU/显卡(GeForce GTX 970)

在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固件

  1. 下载此文件http://www.kraxel.org/repos/firmware.repo并将其拷贝到node主机上的/etc/yum.repo.d/目录下
  2. 执行“yum install -y edk2.git-ovmf-x64”
  3. 执行“mv /usr/share/edk2.git/ovmf-x64/OVMF_CODE-pure-efi.fd /usr/share/OVMF/OVMF_VARS_EFI.fd”
  4. 然后,在/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技术交流群!

3 条回复 A 作者 M 管理员 E
  1. 期待多块物理GPU组成vgpu池,按需分配给vm的大作来到。

  2. 为啥还是Python2??

  3. 4.4超融合没有uefi启动?

欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论