参考链接:
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:0a63和10de:0be3 ,
并且添加,若增加失败请关闭虚机或重启主机。
图片仅供参考,不是实验截图,实验使用amd的,这里显示是nVidia的
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的
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