目录

  1. 前言
  2. 流程
  3. 参考

前言

OpenStack支持将物理设备挂载到虚拟机内部,术语叫做PCI passthrough

传送门

PCI passthrough有几个基本要求。

  1. BIOS中打开VT-d(Intel® Virtualization Technology for Directed I/O的缩写)。
  2. 计算节点内核打开intel_iommu=on或者amd_iommu=on
  3. 计算节点上有可用的PCI设备。

最后,再通过修改计算节点的nova-compute的配置文件,就能将配置文件中给定的设备分配给创建好的虚拟机,上面的传送门是官方文档说明,接下来将不再赘述。

但是OpenStack只支持在创建时分配PCI设备,如果已有虚拟机想要添加PCI设备,就需要一点非常规操作,说是非常规操作其实是libvirt的一些基础操作。

流程

  1. 查看虚拟机的信息,确保虚拟机处在运行状态。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    openstack server show <server_id> -c
    eg:
    openstack server show f7906515-727e-4c0d-8047-29d45425d563 -c OS-EXT-SRV-ATTR:host -c OS-EXT-SRV-ATTR:instance_name
    +-------------------------------+-------------------+
    | Field | Value |
    +-------------------------------+-------------------+
    | OS-EXT-SRV-ATTR:host | compute3 |
    | OS-EXT-SRV-ATTR:instance_name | instance-0000027a |
    +-------------------------------+-------------------+
  2. 连接到compute3节点,查看pci设备列表。

    1
    2
    3
    4
    5
    lspci -D | grep -i net
    0000:01:00.0 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01)
    0000:01:00.1 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01)
    0000:21:00.0 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01)
    0000:21:00.1 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01)
  3. 选择要挂载的网卡,确保网卡已连接网线(这里是enp1s0f0)。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    ethtool -i enp1s0f0
    driver: igb
    version: 5.10.0-46.uelc20.x86_64
    firmware-version: 1.63, 0x800009fa
    expansion-rom-version:
    # pic总线地址
    bus-info: 0000:01:00.0
    supports-statistics: yes
    supports-test: yes
    supports-eeprom-access: yes
    supports-register-dump: yes
    supports-priv-flags: yes

    ethtool enp1s0f0 | grep Link
    # 已连接网线
    Link detected: yes

  4. 进入计算节点的nova_libvirt容器(环境基于kolla-ansible部署的),编写device.xml文件。

    1
    2
    3
    4
    5
    <hostdev mode='subsystem' type='pci' managed='yes'>
    <source>
    <address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
    </source>
    </hostdev>
  5. 当透传的设备是SR-IOV时。

    1
    2
    3
    4
    5
    <interface type='hostdev' managed='yes'>
    <source>
    <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
    </source>
    </interface>
  6. 执行挂载命令。

    1
    virsh attach-device --domain instance-0000027a device.xml
  7. 宿主机或者虚拟机重启可能会导致透传网卡的卸载,可以再进入nova_libvirt容器执行挂载操作。

参考

libvirt文档-pci设备挂载
libvirt文档-网卡设备挂载