openstack passthrough配置手册

2021-02-24 11:18:21 浏览数 (1)

配置BIOS

BIOS中enable vt-d

配置内核参数

grep IOMMU /boot/config_3.10.0-957.27.2.el7.x86_64

如果内核默认没有打开CONFIG_INTEL_IOMMU_DEFAULT_ON则需要配置内核的启动参数

intel_iommu=on。如果为了非pci passthrough device的性能则需要配置内核参数iommu=pt。

可以看intel_iommu默认没有打开,需要添加内核参数

sudo vim /boot/grub2/grub.cfg

在对应行添加两个参数intel_iommu=on iommu=pt

然后sudo reboot机器,等机器重启完全执行sudo dmesg | grep IOMMU

执行sudo dmesg | grep DMAR

如果能看到” DMAR: IOMMU enabled”和“DMAR: Intel(R) Virtualization Technology for Directed I/O”那就可以放心了,机器已经具备passthrough的基本条件了

确认要passthrough的网卡

这个机器上总共了4块网卡

分别看这几块网卡的名字

可以看到eth0和eth1已经被占用,eth2和eth3空闲,我们就拿eth2来passthrough吧

千万要小心,不要把正在使用的网卡passthrough掉,一定要规划好

看一下eth2的iommu_group,和group中的其它设备,一个group的设备必须同时passthrough,只passthrough其中一个会导致失败,这group中只有一个设备,所以没什么问题。

配置openstack

  • 配置controller上的nova-scheduler

controller上的nova-sheduler的配置文件中增加PciPassthroughFilter

[filter_scheduler]

enabled_filters = AvailabilityZoneFilter, ComputeFilter, ComputeCapabilitiesFilter, ImagePropertiesFilter, ServerGroupAntiAffinityFilter, ServerGroupAffinityFilter, PciPassthroughFilter

available_filters = nova.scheduler.filters.all_filters

重启,然后查看运行状态

  • 配置controller上的nova-api

在配置文件中增加一个alias

[pci]

alias = { "vendor_id":"15b3", "product_id":"1015", "device_type":"type-PF", "name":"mellanox-0" }

其中的vendor_id和product_id来自于compute节点要passthrough的网卡,如下图

重启,然后查看运行状态

  • 配置compute节点上的nova-compute

[pci]

passthrough_whitelist={"vendor_id":"15b3", "product_id":"1015","address":"0000:04:00.0","physical_network": "provider"}

alias={"vendor_id":"15b3","product_id":"1015","device_type":"type-PF","name":"mellanox-0"}

这儿的physical_network在创建 tenant network是要用到,就是--provider-physical-network 选项指定的值,创建VM时要指定此tenant network,每个passthrough的网卡要对应一个physical_network。neutron中physical_network是写到配置文件ml2_conf.ini中的,例如flat_networks = physnet1和vlan_ranges = physnet2:1:1000。

重启,然后查看运行状态

创建VM

  • 创建flavor

openstack flavor create --ram 1024 --disk 32 --vcpus 2 --property "pci_passthrough:alias"="mellanox-0:1" passthrough-flavor

其中的"pci_passthrough:alias"="mellanox-0:1"是必须传的参数,mellanox-0就是nova-api中配置的,1表示passthrough一个网卡

  • 启动VM

openstack --debug server create --flavor passthrough-flavor --image CentOS-7-x86_64-GenericCloud.raw --network provider --wait passthrough-server

在计算节点看一下qemu进程的参数,发现有vfio-pci绑定了pci 04:00.0

登录到VM发现有一个mellanox网卡,加载的驱动是mlx5_core

遗留问题

网卡没有使能SRIOV,刚开始"device_type"配置为"type-PCI",发现nova-scheduler的PciPassthroughFilter把所有compute都过滤掉了,导致VM怎么都创建不成功。compute节点上nova-compute resource_tracker上报时是type-PCI,调试了一下nova-scheduler的PciPassthroughFilter,它要求的类型是type-PF,然后把device_type修改成type-PF就行了,但总觉得不对劲,就应该是type-PCI,看一下代码

这是type-PCI 设备libvirt看到的信息

这是type-PF 设备libvirt看到的信息

这是type-VF 设备libvirt看到的信息

修改为如下代码:

把这代码提交给社区,看社区怎么说

https://review.opendev.org/#/c/695416/

0 人点赞