OpenStack配置PCI直通(PCI passthrough)

*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设备为例。
):

  1. 配置nova-scheduler (Controller)
  2. 配置nova-api (Controller)**
  3. 配置flavor (Controller)
  4. 使能PCI直通 (Compute)
  5. 在nova.conf配置PCI设备 (Compute)

1. Configure nova-scheduler (Controller)

  1. 参考 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
  1. 重启nova-scheduler服务。

2. 配置nova-api (Controller)**

  1. 指定设备的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”。
  1. 重启nova-api服务

3. 配置flavor (Controller)

通过flavor为guest虚拟机配置两个PCI设备,每个PCI设备的vendor_id0x8086product_id0x154d

# openstack flavor set m1.large --property "pci_passthrough:alias"="a1:2"

具体参考flavor

$ openstack flavor set FLAVOR-NAME \
    --property pci_passthrough:alias=ALIAS:COUNT
  • 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)

  1. 配置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配置项

  1. 指定PCI设备的alias。

从Newton版本开始,为了resize带有PCI设备的虚拟机,需要在计算节点上同时配置PCI设备alias。

配置请求alias为a1的PCI设备,其中vendor_id0x8086product_id0x154d,对应地址为 0000:41:00.0的PCI设备。

编辑/etc/nova/nova.conf文件:

[pci]
alias = { "vendor_id":"8086", "product_id":"154d", "device_type":"type-PF", "name":"a1" }
  1. 重启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

推荐阅读更多精彩内容