OpenStack PCI passthrough 环境配置
作者:张航东
OpenStack版本:Kilo
OpenStack PCI passthrough 环境配置
作者:张航东
OpenStack版本:Kilo
虚拟机使用透传设备可以获得设备近乎原生的性能。Intel 和 AMD 都在它们的新一代处理器架构中提供对设备透传的支持(以及辅助管理程序的新指令)。Intel 将这种支持称为 Virtualization Technology for Directed I/O (VT-d),而 AMD 称之为 I/O Memory Management Unit (IOMMU)。不管是哪种情况,最新的 CPU 都提供将 PCI 物理地址映射到客户虚拟系统的方法。当这种映射发生时,硬件将负责访问(和保护),客户操作系统在使用该设备时,就仿佛它不是一个虚拟系统一样。除了将客 户机映射到物理内存外,新的架构还提供隔离机制,以便预先阻止其他客户机(或管理程序)访问该内存。
1. 确认Host是否支持pci-passthrough
由于需要硬件支持,所以要预先确认cpu及主板是否支持Intel或AMD的硬件辅助虚拟化功能,请查阅官方的硬件支持列表或者查看BIOS中的相关选项。
另外,所谓巧妇难为无米之炊,CPU支持只是pci-passthrough技术的必要条件,当然还
需要支持pci-passthrough的网卡。
以下以Intel E5-2690 + Intel X540 10G NIC + RHEL7.0为例。
2.查看Host是否开启硬件辅助虚拟化功能
[root@nova2 ~]# cat /proc/cmdline
BOOT_IMAGE=/vmlinuz-3.10.0-229.el7.x86_64
root=/dev/mapper/rhel-root
ro
rd.lvm.lv=rhel/root
crashkernel=auto
rd.lvm.lv=rhel/swap
vconsole.font=latarcyrheb-sun16
vconsole.keymap=us
rhgb
quiet
LANG=en_US.UTF-8
intel_iommu=on #有这个字段说明Intel硬件辅助虚拟化功能已开启
default_hugepagesz=1G hugepagesz=1G hugepages=20
如果确认硬件支持硬件辅助虚拟化功能但没有开启,可以进行如配置:
[root@nova2 ~]# vi /boot/grub2/grub.cfg #不同的OS或版本可能文件不同
#向其中的启动参数中添加以下
intel_iommu=on
然后reboot使配置生效
3. 确认NIC信息
[root@nova2 ~]# lspci -nn | grep Ethernet
01:00.0 Ethernet controller [0200]: Intel Corporation I350 Gigabit Network Connection [8086:1521] (rev 01)
01:00.1 Ethernet controller [0200]: Intel Corporation I350 Gigabit Network Connection [8086:1521] (rev 01)
82:00.0 Ethernet controller [0200]: Intel Corporation Ethernet Controller 10-Gigabit X540-AT2 [8086:1528] (rev 01)
82:00.1 Ethernet controller [0200]: Intel Corporation Ethernet Controller 10-Gigabit X540-AT2 [8086:1528] (rev 01)
84:00.0 Ethernet controller [0200]: Intel Corporation Ethernet Controller 10-Gigabit X540-AT2 [8086:1528] (rev 01)
84:00.1 Ethernet controller [0200]: Intel Corporation Ethernet Controller 10-Gigabit X540-AT2 [8086:1528] (rev 01)
此处以Intel X540 10G NIC为例:
1.84:00.1 pci bus address
2.[8086 vendor id
3.1528] product id
(记住这三个信息,后面会用到)
4. 确认pci设备驱动信息并从host默认驱动程序中解绑,以备虚拟机透传使用
[root@nova2 ~]# virsh nodedev-list | grep pci | grep 84 #84是从上面的①来的
pci_0000_84_00_0
pci_0000_84_00_1
#因为这块网卡有两个物理port所以grep出来两条结果,下面我们只用pci_0000_84_00_1来演示
#然后确认pci_0000_84_00_1的相关信息
[root@nova2 ~]# virsh nodedev-dumpxml pci_0000_84_00_1
<device>
<name>pci_0000_84_00_1</name>
<path>/sys/devices/pci0000:80/0000:80:03.0/0000:84:00.1</path>
<parent>pci_0000_80_03_0</parent>
<driver>
<name>ixgbe</name> #host默认驱动
</driver>
<capability type='pci'>
<domain>0</domain>
<bus>132</bus>
<slot>0</slot>
<function>1</function>
<product id='0x1528'>Ethernet Controller 10-Gigabit X540-AT2</product>
<vendor id='0x8086'>Intel Corporation</vendor>
<iommuGroup number='34'>
<address domain='0x0000' bus='0x84' slot='0x00' function='0x1'/>
</iommuGroup>
</capability>
</device>
#从host的默认驱动ixgbe中解绑pci_0000_84_00_1
[root@nova2 ~]# virsh nodedev-detach pci_0000_84_00_1
Device pci_0000_84_00_1 detached
#再次确认解绑后的pci_0000_84_00_1信息
[root@nova2 ~]# virsh nodedev-dumpxml pci_0000_84_00_1
<device>
<name>pci_0000_84_00_1</name>
<path>/sys/devices/pci0000:80/0000:80:03.0/0000:84:00.1</path>
<parent>pci_0000_80_03_0</parent>
<driver>
<name>vfio-pci</name> #驱动程序变为vfio(目前默认的虚拟化驱动)
</driver>
<capability type='pci'>
<domain>0</domain>
<bus>132</bus>
<slot>0</slot>
<function>1</function>
<product id='0x1528'>Ethernet Controller 10-Gigabit X540-AT2</product>
<vendor id='0x8086'>Intel Corporation</vendor>
<iommuGroup number='34'>
<address domain='0x0000' bus='0x84' slot='0x00' function='0x1'/>
</iommuGroup>
</capability>
</device>
5. 配置openstack,以启用pci-passthrough:
#Nova controller
[root@osc ~]# vi /etc/nova/nova.conf
#
# Options defined in nova.pci.pci_request
#
# An alias for a PCI passthrough device requirement. This
# allows users to specify the alias in the extra_spec for a
# flavor, without needing to repeat all the PCI property
# requirements. For example: pci_alias = { "name":
# "QuicAssist", "product_id": "0443", "vendor_id": "8086",
# "device_type": "ACCEL" } defines an alias for the Intel
# QuickAssist card. (multi valued) (multi valued)
#pci_alias=
pci_alias={ "name":"X540NIC", "slabel":"dpdk-int"}
① ② ③ ④
①name字段,固定
②name值,可以自己随便起
③不知道什么意思,好像也是自己起的
④不知道什么意思,好像也是自己起的
#Nova compute
[root@osc ~]# vi /etc/nova/nova.conf
#
# Options defined in nova.pci.pci_whitelist
#
# White list of PCI devices available to VMs. For example:
# pci_passthrough_whitelist = [{"vendor_id": "8086",
# "product_id": "0443"}] (multi valued)
#pci_passthrough_whitelist=
pci_passthrough_whitelist={"vendor_id":"8086", "product_id":"1528", "slabel":"dpdk-int"}
⑤ ⑥ ⑦ ⑧ ⑨ ⑩
⑤vendor_id字段,固定
⑥vendor_id的值,对应于表3中的②
⑦product_id字段,固定
⑧product_id的值,对应于表3中的③
⑨不知道什么意思,但要和controller的配置保持一致
⑩不知道什么意思,但要和controller的配置保持一致
改完重启OpenStack controller和compute服务。
6. 创建带有pci-passthrough的flavor:
在flavor中添加metadata,字段名为”pci_passthrough:alias”,值分为两部分,第一部分为别名,和表5中的②保持一致,第二部分为数量,根据实际情况填写即可。