OpenStack Pike版本+KVM+Passthrough+NVIDIA显卡1060透传

OpenStack显卡透传主要分两部分:

1、KVM PassThrough Nvidia1060 制作能透传显卡的OpenStack镜像

2、配置OpenStack环境

折腾大半个月,主要解决的问题:NVIDIA显卡透传臭名昭著error43问题。


一、KVM 显卡透传:

出现error43的主要问题:

本文的KVM显卡透传主要是基于点击打开链接此篇文档:相比原文档的启动脚本,为了便于调试,去掉了-vga none \
-nographic \

#!/bin/bash

vmname="windows10vm"

if ps -A | grep -q $vmname; then
echo "$vmname is already running." &
exit 1

else

# use pulseaudio
export QEMU_AUDIO_DRV=pa
export QEMU_PA_SAMPLES=8192
export QEMU_AUDIO_TIMER_PERIOD=99
export QEMU_PA_SERVER=/run/user/1000/pulse/native

cp /usr/share/OVMF/OVMF_VARS.fd /tmp/my_vars.fd

qemu-system-x86_64 \
-name $vmname,process=$vmname \
-machine type=q35,accel=kvm \
-cpu host,kvm=off \
-smp 4,sockets=1,cores=2,threads=2 \
-m 8G \
-mem-path /run/hugepages/kvm \
-mem-prealloc \
-balloon none \
-rtc clock=host,base=localtime \
-serial none \
-parallel none \
-soundhw hda \
-usb -usbdevice host:045e:076c -usbdevice host:045e:0750 \
-device vfio-pci,host=02:00.0,multifunction=on \
-device vfio-pci,host=02:00.1 \
-drive if=pflash,format=raw,readonly,file=/usr/share/OVMF/OVMF_CODE.fd \
-drive if=pflash,format=raw,file=/tmp/my_vars.fd \
-boot order=dc \
-drive id=disk0,if=virtio,cache=none,format=raw,file=/media/user/win.img \
-drive file=/home/user/ISOs/win10.iso,index=1,media=cdrom \
-drive file=/home/user/Downloads/virtio-win-0.1.140.iso,index=2,media=cdrom \
-netdev type=tap,id=net0,ifname=vmtap0,vhost=on \
-device virtio-net-pci,netdev=net0,mac=00:16:3e:00:01:01

exit 0
fi

但是要特别注意的是:


(1)确认显卡支持透传,检查你gpu的rom的完整性,点击打开链接参考此点击打开链接(此网址是git上的一个检查gpu rom完整性的小程序)。如果gpu rom完整,则运行后如下

# ./rom-parser evga_gtx970.dump
Valid ROM signature found @0h, PCIR offset 1a0h
        PCIR: type 0 (x86 PC-AT), vendor: 10de, device: 13c2, class: 030000
        PCIR: revision 0, vendor revision: 1
Valid ROM signature found @f400h, PCIR offset 1ch
        PCIR: type 3 (EFI), vendor: 10de, device: 13c2, class: 030000
        PCIR: revision 3, vendor revision: 0
                EFI: Signature Valid, Subsystem: Boot, Machine: X64
Last image

(2)出现error43,参考点击打开链接中这部分内容Error 43: Driver failed to load" on Nvidia GPUs passed to Windows VMs

(3)透传的安装镜像最好选择Windows10,因为Windows10原声支持uefi启动。

(4)编辑/etc/default/grub 不确定是否有效,不过建议加上

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on video=vesafb:off,efifb:off"
(5)若出现
vfio-pci 0000:09:00.0: BAR 3: cannot reserve [mem 0xf0000000-0xf1ffffff 64bit pref]

则需要

# echo 1 > /sys/bus/pci/devices/0000\:00\:03.1/remove
# echo 1 > /sys/bus/pci/rescan

二、配置OpenStack主要参考文档点击打开链接

(1)首先利用上文KVM上传的windows10.raw镜像文件,制作OpenStack镜像qcow2镜像;

(2)完成后,仍然可能出现error43,此时需要,更改OpenStack 计算节点的源代码,

cd /var/lib/nova/instances
vim instance.xml
查看虚拟机启动配置文件,若出现
 
  <features>
    <acpi/>
    <apic/>
    <hyperv>
      <relaxed state='on'/>
      <vapic state='on'/>
      <spinlocks state='on' retries='8191'/>
    </hyperv>
    <kvm>
      <hidden state='on'/>
    </kvm>
  </features>

则正常,但实际上,由于NVIDIA显卡后期的显卡驱动拒绝在虚拟机运行,此时,你需要在更改OpenStack的源代码,保证生成的虚拟机启动xml中存在,以使显卡驱动正常使用

<vendor_id state='on' value='1234567890ab'/>
  <features>
    <acpi/>
    <apic/>
    <hyperv>
      <relaxed state='on'/>
      <vapic state='on'/>
      <spinlocks state='on' retries='8191'/>
      <vendor_id state='on' value='1234567890ab'/>
    </hyperv>
    <kvm>
      <hidden state='on'/>
    </kvm>
  </features>

因此在nova/virt/libvirt/config.py文件的2076行

原:

    def format_dom(self):
        root = super(LibvirtConfigGuestFeatureHyperV, self).format_dom()

        if self.relaxed:
            root.append(etree.Element("relaxed", state="on"))
        if self.vapic:
            root.append(etree.Element("vapic", state="on"))
        if self.spinlocks:
            root.append(etree.Element("spinlocks", state="on",
                                      retries=str(self.spinlock_retries)))

        return root
现为
    def format_dom(self):
        root = super(LibvirtConfigGuestFeatureHyperV, self).format_dom()

        if self.relaxed:
            root.append(etree.Element("relaxed", state="on"))
        if self.vapic:
            root.append(etree.Element("vapic", state="on"))
        if self.spinlocks:
            root.append(etree.Element("spinlocks", state="on",
                                      retries=str(self.spinlock_retries)))
        root.append(etree.Element("vendor_id", state="on",
                                  value="1234567890ab"))
        return root

并重新将config.py文件重新编译,并替换原有的config.pyc文件

python -m py_compile config.py
重新启动虚拟机,此时显卡应该能正常使用



猜你喜欢

转载自blog.csdn.net/u010845350/article/details/80599984