Создание виртуальных машин с сетевыми портами SR-IOV

Создание виртуальных машин с сетевыми портами SR-IOV#

Ограничения

  • Для виртуальных машин, к которым присоединены PCI-устройства, живая миграция не поддерживается.

Предварительные требования

Создание виртуальной машины с сетевым портом SR-IOV

  1. Создайте физическую вычислительную сеть, указав псевдоним сетевого адаптера из файла pci-passthrough.yaml. Например, чтобы создать сеть sriov-net, выполните следующую команду:

    # openstack --insecure network create --provider-physical-network sriovnet --provider-network-type flat sriov-net
    
  2. Создайте подсеть для сети sriov-net, отключив встроенный DHCP-сервер и указав желаемый диапазон IP-адресов. Например, чтобы создать подсеть sriov-subnet с диапазоном IP-адресов 10.10.10.0/24, выполните следующую команду:

    # openstack --insecure subnet create --no-dhcp --subnet-range 10.10.10.0/24 --network sriov-net sriov-subnet
    
  3. Создайте сетевой порт в сети sriov-net с прямой сквозной передачей PCI. Например, чтобы создать порт sriov-port с IP-адресом 10.10.10.10 из подсети sriov-subnet, выполните следующую команду:

    # openstack --insecure port create --network sriov-net --vnic-type=direct --fixed-ip subnet=sriov-subnet,ip-address=10.10.10.10 sriov-port
    
  4. Создайте виртуальную машину, указав порт sriov-port. Включите параметр --config-drive, чтобы автоматически назначить IP-адрес внутри гостевой операционной системы. Например, чтобы создать ВМ sriov-vm из тома vol1 с типом ВМ large, выполните следующую команду:

    # openstack --insecure server create --port sriov-port --volume vol1 --flavor large sriov-vm --config-drive True
    

Если создание ВМ завершается с ошибкой

Если создание ВМ завершается следующей ошибкой в файле /var/log/hci/nova/nova-compute.log:

2021-08-27 17:56:21.349 6 ERROR nova.compute.manager [instance: 9fb738bf-afe5-40ef-943c-
22e43696bfd9] libvirtError: internal error: qemu unexpectedly closed the monitor:
2021-08-27T14:56:20.294985Z qemu-kvm: -device vfio-pci,host=01:00.3,id=hostdev0,
bus=pci.0,addr=0x6: vfio error: 0000:01:00.3: group 1 is not viable
2021-08-27 17:56:21.349 6 ERROR nova.compute.manager [instance: 9fb738bf-afe5-40ef-943c-
22e43696bfd9] Please ensure all devices within the iommu_group are bound to their vfio
bus driver.

В этом случае физические и виртуальные функции сетевого адаптера должны принадлежать к одной группе IOMMU. Это можно проверить с помощью команды virsh nodedev-dumpxml, указав имена устройств физических и виртуальных функций, например:

# virsh nodedev-dumpxml pci_0000_00_03_0 | grep iommuGroup
    <iommuGroup number='1'>
    </iommuGroup>
# virsh nodedev-dumpxml pci_0000_00_03_1 | grep iommuGroup
    <iommuGroup number='1'>
    </iommuGroup>

Имена устройств имеют формат pci_0000_<номер_шины>_<номер_устройства>_<номер_функции>. Эти номера можно получить с помощью команды lspci:

# lspci -nn | grep Ethernet
00:03.0 Ethernet controller [0200]: Mellanox Technologies MT27800 Family [ConnectX-5] [15b3:1017]
...

В этих выходных данных 00 — номер шины, 03 — номер устройства и 0 — номер функции.

Если физическая и виртуальные функции принадлежат к одной группе IOMMU, необходимо отключить физическую функцию от сервера, выполнив сценарий pci-helper.py с указанием VID и PID, например:

# /usr/libexec/vstorage-ui-agent/bin/pci-helper.py detach 15b3:1017