Создание виртуальных машин с сетевыми портами SR-IOV#
Ограничения
Для виртуальных машин, к которым присоединены PCI-устройства, живая миграция не поддерживается.
Предварительные требования
В вычислительном кластере включена поддержка сквозной передачи для PCI-устройств, как описано в разделе Включение поддержки сквозной передачи и виртуализации графических карт в вычислительном кластере.
Для авторизации команд OpenStack настроен клиент интерфейса командной строки OpenStack, как описано в разделе Подключение к интерфейсу командной строки OpenStack.
Создание виртуальной машины с сетевым портом SR-IOV
Создайте физическую вычислительную сеть, указав псевдоним сетевого адаптера из файла
pci-passthrough.yaml. Например, чтобы создать сетьsriov-net, выполните следующую команду:# openstack --insecure network create --provider-physical-network sriovnet --provider-network-type flat sriov-net
Создайте подсеть для сети
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
Создайте сетевой порт в сети
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
Создайте виртуальную машину, указав порт
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