OpenStack下利用透传技术(passthrough)对GPU实现虚拟化

Tips:默认已安装好OpenStack相关必要组件并可以正常运行的情况下,本文只涉及GPU 虚拟化的相关配置说明。
一 配置GPU Passthrough的系统相关设置

  1. 在BIOS中enable VT-x, VT-d, Onboard VGA. Onboard VGA 的enable可以避免一些错误的出现,具体参考Not only for miners GPU integration in Nova environment.

  2. 编辑文件 /etc/modules, 添加以下内容:

pci_stub
vfio
vfio_iommu_type1
vfio_pci
kvm
kvm_intel

  1. 修改文件 /etc/default/grub:

对于Intel芯片:

GRUB_CMDLINE_LINUX_DEFAULT=“intel_iommu=on”

对于AMD芯片:

GRUB_CMDLINE_LINUX_DEFAULT=“iommu=pt iommu=1”

  1. 运行

update-grub

  1. 将下列内容加入到blacklist中以避免被宿主机占用,编辑文件 /etc/modprobe.d/blacklist.conf:

blacklist snd_hda_intel
blacklist amd76x_edac
blacklist vga16fb
blacklist nouveau
blacklist rivafb
blacklist nvidiafb
blacklist rivatv

  1. 查找显卡的Product ID 以及 Vendor ID:

root@computer1:~# lspci -nn | grep NVIDIA
04:00.0 VGA compatible controller [0300]: NVIDIA Corporation Device [10de:1b06] (rev a1)
04:00.1 Audio device [0403]: NVIDIA Corporation Device [10de:10ef] (rev a1)
05:00.0 VGA compatible controller [0300]: NVIDIA Corporation Device [10de:1b06] (rev a1)
05:00.1 Audio device [0403]: NVIDIA Corporation Device [10de:10ef] (rev a1)

相关参数解释参考OpenStack 企业私有云的若干需求(1):Nova 虚机支持 GPU

  1. 编辑文件 /etc/modprobe.d/vfio.conf:

GTX 1080Ti and its audio controller

options vfio-pci ids=10de:1b06,10de:10ef

  1. 运行:

update-initramfs -u

  1. 重启服务器

  2. 验证:

root@computer1:~$ lspci -nnk -d 10de:1b06
04:00.0 VGA compatible controller [0300]: NVIDIA Corporation Device [10de:1b06] (rev a1)
Subsystem: Micro-Star International Co., Ltd. [MSI] Device [1462:3609]
Kernel driver in use: vfio-pci
Kernel modules: nvidiafb, nouveau
05:00.0 VGA compatible controller [0300]: NVIDIA Corporation Device [10de:1b06] (rev a1)
Subsystem: Micro-Star International Co., Ltd. [MSI] Device [1462:3609]
Kernel driver in use: vfio-pci
Kernel modules: nvidiafb, nouveau

显示结果中"Kernel driver in use: vfio-pci"说明已经配置成功,接下来是OpenStack的配置过程。

如果经过以上步骤设备仍然被占用,可以根据文后参考资料中的最后两篇文章解绑设备。
二 OpenStack的相关配置

  1. 配置nova-scheduler (controller节点),编辑文件 /etc/nova/nova.conf:

[DEFAULT]
scheduler_default_filters = RetryFilter, AvailabilityZoneFilter, RamFilter, ComputeFilter, ComputeCapabilitiesFilter, ImagePropertiesFilter, ServerGroupAntiAffinityFilter, ServerGroupAffinityFilter, PciPassthroughFilter
scheduler_available_filters = nova.scheduler.filters.all_filters

重启nova-scheduler服务

  1. 配置nova-api (controller节点),编辑文件 /etc/nova/nova.conf:

[pci]

alias = { “name”: “nvidia1080”, “product_id”: “1b06”, “vendor_id”: “10de”, “device_type”: “type-PCI” }

重启nova-api服务

  1. 配置nova-compute(compute 节点),编辑文件/etc/nova/nova.conf:

[pci]

passthrough_whitelist = { “vendor_id”: “10de”, “product_id”: “1b06” }

alias = {
“name”: “nvidia1080”,
“product_id”: “1b06”,
“vendor_id”: “10de”,
“device_type”: “type-PCI”
}

重启nova-compute服务

三 验证

  1. 创建设置flavor:

openstack flavor create --public --ram 2048 --disk 20 --vcpus 2 m1.large

openstack flavor set m1.large --property pci_passthrough:alias=‘nvidia1080:2’

nvidia1080 即为alias中的那么, 2为GPU的数量。

  1. 创建instance:

openstack server create --flavor m1.large --image cirros-0.3.5-x86_64-uec --wait test-pci

  1. 在cirros下查看GPU信息如下:

$ lspci -k

00:05.0 Class 0300: 10de:1b06
00:06.0 Class 0300: 10de:1b06

四 NVIDIA显卡的问题

因为NIVIDIA显卡的驱动会检测是否跑在虚拟机里,如果在虚拟机里驱动就会出错,所以我们需要对显卡驱动隐藏hypervisor id。在OpenStack的Pile版本中的Glance 镜像引入了img_hide_hypervisor_id=true的property,所以可以对镜像执行如下的命令隐藏hupervisor id:

$ openstack image set IMG-UUID --property img_hide_hypervisor_id=true

通过此镜像安装的instance就会隐藏hypervisor id。

如果是Pike之前的版本, 可以参考Consumer-grade GPUs in an OpenStack system (NVIDIA GPUs)这篇文章的做法。

可以通过下边的命令查看hypervisor id是否隐藏:

$ cpuid | grep hypervisor_id
hypervisor_id = "KVMKVMKVM "
hypervisor_id = "KVMKVMKVM "

上边的显示结果说明没有隐藏,下边的显示结果说明已经隐藏:

$ cpuid | grep hypervisor_id
hypervisor_id = " @ @ "
hypervisor_id = " @ @ "

作者:hhzzk
来源:CSDN
原文:https://blog.csdn.net/wangjinruifly/article/details/79620075
版权声明:本文为博主原创文章,转载请附上博文链接!

你可能感兴趣的:(虚拟化)