參考鏈接:
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百科
前言:之前測試了好長一段時間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號,內核命令行加入:
pci-stub.ids=10de:0a63,10de:0be3 rdblacklist=nouveau
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
<hostdev> ... <rom file='/path/to/your/gpu/gpu.rom'/> ... </hostdev>
5,或者通過驅動補丁,地址 https://github.com/sk1080/nvidia-kvm-patcher