OpenStack PCI passthrough(PCI直通)环境配置

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中的②保持一致,第二部分为数量,根据实际情况填写即可。

 

7. 创建虚拟机,并确认pci-passthrough设备分配至虚拟机

版权声明:本文为博主原创文章,欢迎转载,但请务必注明作者及出处,感谢! http://blog.csdn.net/hangdongzhang/article/details/77745557

猜你喜欢

转载自blog.csdn.net/zhongbeida_xue/article/details/79467108
PCI