参考链接:

ovirt:

https://www.ovirt.org/documentation/install-guide/appe-Configuring_a_Host_for_PCI_Passthrough.html

https://www.ovirt.org/documentation/admin-guide/chap-Hosts.html

wiki百科

https://wiki.archlinux.org/index.php/PCI_passthrough_via_OVMF_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)#Nvidia_GPU%E7%9B%B4%E9%80%9A%E5%88%B0Windows_%E8%99%9A%E6%8B%9F%E6%9C%BA%E6%97%B6%E5%8F%91%E7%94%9F%22%E9%94%99%E8%AF%AF43:%E9%A9%B1%E5%8A%A8%E7%A8%8B%E5%BA%8F%E5%8A%A0%E8%BD%BD%E5%A4%B1%E8%B4%A5%E2%80%9D



前言:之前测试了好长一段时间nVidia的也没实现,结果是报43的问题,尝试好多方法都未果,后来直接用AMD HD6450 一次就成功了,也测试过AMD HD6450和AMD HD7480一起直通到同一台虚拟机以及不同虚拟机都是正常的。


测试环境:centos7

                    ovirt4.3 ( 4.2也适用)

                    显卡 AMD HD 6450 

                    cpu虚拟化技术已开

 

正文开始:

        1,进入主板BIOS 打开 Intel VT-d或 AMD-VI, 我当时是在北桥(north bridge)找到的,  这一步可以等重启再做。

 

        2, 对于Intel,编辑grub文件来启用IOMMU,在GRUB_CMDLINE_LINUX末尾添加intel_iommu=on

 

 # vi /etc/default/grub
   GRUB_CMDLINE_LINUX=....... .......intel_iommu=on

      

            对于AMD,编辑grub文件来启用IOMMU,在GRUB_CMDLINE_LINUX末尾添加amd_iommu=on

 

 # vi /etc/default/grub
  GRUB_CMDLINE_LINUX=....... .......amd_iommu=on

 

     3, 如果由于硬件不支持中断重新映射而导致传递失败,则可以考allow_unsafe_interrupts在虚拟机受信任的情况下启用该选项。

 

           

 # vi /etc/modprobe.d/local.conf
  options vfio_iommu_type1 allow_unsafe_interrupts=1


 

      4,刷新 grub.cfg ,若系统是EFI引导的应该在其他路径,尝试使用find  /  -name grub.cfg 查找所在路径,例如: /boot/efi/grub/grub.cfg

 

            # grub2-mkconfig -o /boot/grub2/grub.cfg
 
            # grub2-mkconfig -o /boot/grub/grub.cfg


         

             做到这里应该是要重启,可先不重启,先做后面的步骤再重启。

 

       5. (1) 登录管理门户,单击计算→ 虚拟机, 虚拟机先要关机。

           (2) 单击虚拟机名称以打开主机设备,单击增加设备

           (3) 找到显卡设备的视频和音频控制器,记录它的厂商号:产品号,如图10de:0a6310de:0be3 ,

                并且添加,若增加失败请关闭虚机或重启主机。

                     图片仅供参考,不是实验截图,实验使用amd的,这里显示是nVidia的

202003171009317241.png

 

 

            6, 单击 计算 -> 主机 ,编辑主机->内核,修改内核命令行(若灰色,点击重置,并且重新勾选:Hostdev 透传和 SR-IOV,Hostdev 透传和 SR-IOV,Hostdev 透传和 SR-IOV,Hostdev 透传和 SR-IOV,并且在将相应驱动加入黑名单和绑定pci-stub到前面的uuid号,nouveau是nVidia的默认驱动,后两个amd的默认驱动,自己根据情况写,都写了也不影响,内核命令行加入:

 pci-stub.ids=10de:0a63,10de:0be3 rdblacklist=nouveau rdblacklist=amdgpu rdblacklist=amdkfd


                     

            7,单击确认-->维护->重新安装主机->重启


 

            8,重启后可以用lspci -nnk 查看显卡内核驱动有没有绑定到pci-stub或者vfio-pci, 据我观察一般虚拟机启动后就会变成vfio-pci

                                         图片仅供参考,不是实验截图,实验使用amd的,这里显示是nVidia的

                     ovirt 显卡直通搭建记录_第1张图片


                                   

              9,编辑虚拟机,把ovirt4.3仿真机最好改成q35, 4.2的q35会报错,可以用默认的,或者使用rhel7.6-q35, 视频类型改成VGA ,此时就无法使用spice协议了,只能用VNC或者RDP协议,显卡设备应该直通到虚拟机上面了,之后就可以去官网下载对于的驱动安装了,window10系统貌似自带驱动,装完可遇过驱动代码31的错误,去官网下载对应显卡的驱动重新安装,然后就解决了。


 

             其他相关问题: 

   1,要使用模拟器,目前测试雷电模拟器是可以的,如果提示opengl版本过低,请用rdp协议连接(个人猜测用VNC协议amd的显卡就不会直接使用,而是使用基本的显示),其他模拟器用到虚拟化的可能会出现蓝屏(如mumu模拟器),VMware也是这样,可能与虚拟化有关,但我已开启嵌套虚拟化。

 

   2,虚拟机仿真机如果不改成q35,驱动就会异常

 

           3,win7安装驱动异常,原因未知,目前window10 是没问题的。

     

           4,nVidia 显卡驱动出现43问题,为解决。下面是我参考baidu,google尝试过的过程.

            (1)通过hook修改xml文件,屏蔽kvm的特性(QEMU 2.5.0和libvirt 1.3.3版本以上才行), 

                 ovirt4.2 会找不到hooking, 可以find / -name hooking.py 然后考到当前目录,不过ovirt4.2没有uefi所以也没必要了。

                仅用于实验,若报错请查看是拼写错误,缩进还是其他,然后进行修改。

 # cd /usr/libexec/vdsm/hooks/before_vm_start/


 # vi 50_passthough
   #!/usr/bin/python
  import hooking
  try:
      domxml = hooking.read_domxml()
      domain = domxml.getElementsByTagName('domain')[0]
      features = domxml.getElementsByTagName('features')[0]
      hyperv = domxml.getElementsByTagName('hyperv')[0]
      vender = domxml.createElement('vendor_id')
      vender.setAttribute('state', 'on')
      vender.setAttribute('value', 'sbsbsbnvidia')
      hyperv.appendChild(vender)
      kvm = domxml.createElement('kvm')
      hidden = domxml.createElement('hidden')
      hidden.setAttribute('state', 'on')
      kvm.appendChild(hidden)
      ioapic = domxml.createElement('ioapic')
      ioapic.setAttribute('driver','kvm')
      feautures.appendChild(ioapic)
      feature.appendChild(kvm)
      hooking.write_domxml(domxml)
  except:
    pass

                  

            (2)虚拟机要uefi启动,只要ovirt4.3才有这个选项,如果自己修改libvirtd,会导致vdsm无法启动。

            (3)若还是不行,在xml增加rom文件,同理需要通过hook            

            下载对于显卡的rom,https://www.techpowerup.com/vgabios


     ...
     
     ...

                

          5,或者通过驱动补丁,地址 https://github.com/sk1080/nvidia-kvm-patcher