*azeqjz OpenStack: *
除OVS与硬直通SR-IOV外,还有PCI直通,即物理网卡给一个虚拟机网口独占。
PCI直通特性允许虚拟机完全访问与直接控制物理PCI设备。此机制对任何类型的PCI设备都是通用的,并且可以与网络接口卡(NIC),图形处理单元(GPU)或可以连接到PCI总线的任何其他设备一起运行。
有的PCI设备提供SR-IOV能力,当使用SR-IOV时,物理设备被虚拟呈现为多个PCI设备。虚拟PCI设备被分配到同一个或多个虚拟机。在PCI直通的情况下,整个物理设备只能分配给一个虚拟机,并且不能共享。
执行以下步骤使能PCI直通(以地址为0000:41:00.0的PCI设备为例。
):
- 配置nova-scheduler (Controller)
- 配置nova-api (Controller)**
- 配置flavor (Controller)
- 使能PCI直通 (Compute)
- 在nova.conf配置PCI设备 (Compute)
1. Configure nova-scheduler (Controller)
- 参考 Configure nova-scheduler配置
nova-scheduler
。
在运行nova-scheduler的每个控制节点,把PciPassthroughFilter添加到scheduler_default_filters,以默认使能PciPassthroughFilter过滤器。同时,确保nova.conf [DEFAULT]下的scheduler_available_filters参数设置为all_filters,以使能compute服务提供的所有过滤器。
[DEFAULT]
scheduler_default_filters = RetryFilter, AvailabilityZoneFilter, RamFilter, ComputeFilter, ComputeCapabilitiesFilter, ImagePropertiesFilter, ServerGroupAntiAffinityFilter, ServerGroupAffinityFilter, PciPassthroughFilter
scheduler_available_filters = nova.scheduler.filters.all_filters
- 重启
nova-scheduler
服务。
2. 配置nova-api (Controller)**
- 指定设备的PCI别名。
配置PCI别名a1来请求一个vendor_id为0x8086和product_id为0x154d的PCI设备。vendor_id和product_id对应于地址为0000:41:00.0的PCI设备。
编辑/etc/nova/nova.conf:
[pci]
alias = { "vendor_id":"8086", "product_id":"154d", "device_type":"type-PF", "name":"a1" }
获取alias的更多信息,参考nova.conf中的alias配置项。
PCI直通配置项:
配置项 = 默认值 |
---|
alias = [] |
描述
要求填写PCI直通设备的别名。
这允许用户在flavor的extra_spec属性中指定PCI设备的别名,而不需给出指定PCI设备属性要求。
可能的值:
描述别名的JSON值列表,例如:
alias = { “name”: “QuickAssist”, “product_id”: “0443”, “vendor_id”: “8086”, “device_type”: “type-PCI” }
定义了Intel QuickAssist卡的别名。有效的值为:
- “name”: PCI设备的别名
- “product_id”: 设备的十六进制Product ID
- “vendor_id”: 设备的十六进制Vendor ID
- “device_type”: PCI设备的类型,有效的值为: “type-PCI”, “type-PF” and “type-VF”。
- 重启nova-api服务
3. 配置flavor (Controller)
通过flavor为guest虚拟机配置两个PCI设备,每个PCI设备的vendor_id
是0x8086
,product_id
是0x154d
。
# openstack flavor set m1.large --property "pci_passthrough:alias"="a1:2"
具体参考flavor。
$ openstack flavor set FLAVOR-NAME \
--property pci_passthrough:alias=ALIAS:COUNT
- ALIAS: (字符串) 对应特定的PCI设备类型,与nova配置文件中的一致,参考nova.conf中的alias配置项。
- COUNT: (整数) 分配给虚拟机的ALIAS中指定类型的PCI设备数量T。
4.使能PCI passthrough (Compute)
使能VT-d和IOMMU,参考Create Virtual Functions中的步骤一与二:
Step 1 BIOS开启SR-IOV与VT-d。
Step 2 在Linux中使能IOMMU,例如使用GRUB把intel_iommu=on添加到内核参数。
5.在nova.conf配置PCI设备 (Compute)
- 配置
nova-compute
,允许PCI设备直通到虚拟机,编辑/etc/nova/nova.conf
文件:
[pci]
passthrough_whitelist = { "address": "0000:41:00.0" }
或者指定多个PCI设备:
[pci]
passthrough_whitelist = { "vendor_id": "8086", "product_id": "10fb" }
所有vendor_id与product_id 匹配的PCI设备会被添加到可以直通分配给虚拟机的PCI设备池。
更多关于passthrough_whitelist
的用法,参考nova.conf中的passthrough_whitelist配置项。
- 指定PCI设备的alias。
从Newton版本开始,为了resize带有PCI设备的虚拟机,需要在计算节点上同时配置PCI设备alias。
配置请求alias为a1
的PCI设备,其中vendor_id
为0x8086
,product_id
为0x154d
,对应地址为 0000:41:00.0
的PCI设备。
编辑/etc/nova/nova.conf
文件:
[pci]
alias = { "vendor_id":"8086", "product_id":"154d", "device_type":"type-PF", "name":"a1" }
- 重启
nova-compute
服务。
6. 创建带PCI直通设备的虚拟机实例
nova-scheduler选择目标主机,这台主机的PCI设备的vendor_id和product_id可以和flavor中定义的alias设备匹配。
# openstack server create --flavor m1.large --image cirros-0.3.5-x86_64-uec --wait test-pci
可以通过lspci | grep -i eth
(型号与产品id等)查询环境已有硬件是否符合要求。
参考原文:Attaching physical PCI devices to guests