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重新启动虚拟机,此时显卡应该能正常使用