配置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/