Using SR-IOV

Nov 13, 2020 11:07

В раздумьях, публиковать ли это на Хабре.

[Черновик для Хабра] SR-IOV для начинающих

Виртуализация,
Компьютерное железо

Черновик

Иногда требуется, не вдаваясь глубоко в теоретические в дебри, выяснить работают ли, как заявлено, Термальные зоны в ACPI(пример не мой). Пробрасывается ли RAMDISK, и в каком обьеме, из UEFI в OS. И насколько успешно с него можно инсталлировать OS. Как это все прощупывается и на коленке тестируется.

В этой статье будем пробовать, на PCI зуб, наличие в железе поддержки SR-IOV.

История написана по мотивам FedoraDocumentations и попытки повторения оного под Ubuntu Server 18.04.5. Не то что бы я сильный любитель Линукса, но под виндовс "оно не взлетело" как я ни старался, а тратить годы на эту тему, не было запланировано.

Потребовалось, как то, показать что Виртуальные функции(SR-IOV) поддерживаются на моем железе(Naples/Rome), потому как были у клиента большие и обоснованные сомнения в этом. Виртуальные устройства в итоге нашлись, но время прошло и все опять забылось. При очередном случае, снова пришлось все восстанавливать в памяти, вот тут и пригодились сохраненные ссылки на иноземной мове. Что бы в последующем не бегать по интернету, запишем как все было.

В основном все совпадает с вышеупомянутой ссылкой, но дьявол как обычно в деталях.

И так, была найдена сетевая карта поддерживающая то самое SR-IOV, ей оказалась 82576

Для ее успешной работы, в оном режиме, рекомендовалось включить поддержку Intel VT-d в БИОСе и Линукс ядре, для Интела. Но у меня АМД, а ему требовались AMD-Vi и IOMMU. Для этого в параметрах старта ядра дописывает необходимые параметры.

[Но у вас все это уже может быть, например я этого не делал)))]
для AMD CPU
amd_iommu=on iommu=pt

для Интел
intel_iommu=on iommu=pt

Можно это дописать и в файл конфигурации
/etc/default/grub, в параметре GRUB_CMDLINE_LINUX_DEFAULT, добавить после quiet

После этого прийдется проапгрейдить grub
# update-grub

и добавить vfio модули в /etc/modules

vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd

В конце обновить initramfs

update-initramfs -u -k all

И перезагрузить хост.

Проверка IOMMU
После перезагрузки нужно проверить активен ли IOMMU.

dmesg | grep -e DMAR -e IOMMU -e AMD-Vi


Наличие устройства с поддержкой SR-IOV.
Воспользуемся командой lspci для проверки оного.

# sudo lspci -s 82:0.0 -v
82:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
Subsystem: Intel Corporation Gigabit ET Dual Port Server Adapter
Flags: bus master, fast devsel, latency 0, IRQ 96, NUMA node 0
Memory at f7420000 (32-bit, non-prefetchable) [size=128K]
Memory at f7000000 (32-bit, non-prefetchable) [size=4M]
I/O ports at b020 [disabled] [size=32]
Memory at f74c4000 (32-bit, non-prefetchable) [size=16K]
Expansion ROM at f6c00000 [disabled] [size=4M]
Capabilities: [40] Power Management version 3
Capabilities: [50] MSI: Enable- Count=1/1 Maskable+ 64bit+
Capabilities: [70] MSI-X: Enable+ Count=10 Masked-
Capabilities: [a0] Express Endpoint, MSI 00
Capabilities: [100] Advanced Error Reporting
Capabilities: [140] Device Serial Number 00-1b-21-ff-ff-4f-bb-e0
Capabilities: [150] Alternative Routing-ID Interpretation (ARI)
Capabilities: [160] Single Root I/O Virtualization (SR-IOV)
Kernel driver in use: igb
Kernel modules: igb

Нас интересуют Capabilities: [50] [70] и [160]. Без них говорят бяда и случается. Здесь по ссылке разьясняется насколько важны MSI-X.
Но, как выяснилось, без ARI Forwarding тоже ничего хорошего не случается, а именно он и был у меня на железе по умолчанию не активен. Мало того, он в БИОСе на Rome, вообще спрятан и недеступен для установки.((((

Запуск SR-IOV в модуле ядра.
Для того чтобы устройство работало в нужной конфигурации его как минимум требуется запустить в оной. Для начала попробуем запусить в ручном режиме командой modprobe . В последующем эта функциональность будет прописана в сценарии запуска драйвера при старте системы. Сетевая карта Intel 82576 использует igb драйвер в режиме ядра.

формат запуска драйвера с опциями

# modprobe igb [option=VAL1,VAL2,]

проверим, что там с текущим состоянием
# lsmod |grep igb
igb 87592 0
dca 6708 1 igb
ptp 20480 1 igb
i2c_algp_bit 16384 2 igb, ast

Активация виртуальных функций
Параметр max_vfs модуля igb указывает максимальное количество запускаемых Виртуальных учтройств. Моя карта поддерживает в частности от 0 до 7.
Выгрузим уже загруженный модуль.

# modprobe -r igb

Перезапустим с параметром max_vfs установленным в 1 или любым, не превосходящим максимальное величину, для этого устройства.

# modprobe igb max_vfs=1

Проверим наличие Виртуальных Функций.
Командой lspci поверим список добавленных Виртуальных Функций активированных у подопытной сетевой карты Intel 82576.

# lspci | grep 82576
03:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
03:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
03:10.0 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
03:10.1 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)

Проверим DevID у появившихся PCI устройств, запустив с опцией -n команды lspci.

# lspci -n | grep 03:00.0
03:00.0 0200: 8086:10c9 (rev 01)
# lspci -n | grep 03:10.0
03:10.0 0200: 8086:10ca (rev 01)

У физического устройства он останется как и раньше 8086:10c9, а вот у нового Виртуального он станет уже 8086:10ca.

Отыщем эти устройства в virsh
Сервис libvirt должен видеть все интересующие нас устройства и в гостевой сессии. Команда virsh nodedev-list покажет нам устройства на хосте.

# virsh nodedev-list | grep 8086
pci_8086_10c9
pci_8086_10c9_0
pci_8086_10ca
pci_8086_10ca_0
...

Тут, у меня, случился первый облом. libvirt был у меня не установлен. Устанавливаем.

# sudo apt-get install libvirt-clients

Не сразу,
E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)
E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?
… но в итоге он установился. Были предложены решения этой проблемы, но у меня она рассосалась сама, по прошествии 5-10 минут.

Но и после установки libvirt ругался на отсутствие чегото…

$ virsh nodedev-list | grep 8086
error: failed to connect to the hypervisor
error: Failed to connect socket to '/var/run/libvirt/libvirt-sock':
No such file or directory

Решением оказалось установка qemu, qemu-kvm и virt-manager.
# sudo aptßget install qemu qemu-kvm virt-manager

В итоге искомые устройства нашлись, но, у меня, они были обозначены без VenID_DevID, а с упрминанием адреса на PCI шине. Это не принципиально, главное что нашлись.

# virsh nodedev-list | grep 8086
pci_0000_82_00_0
pci_0000_82_00_1
pci_0000_82_10_0
pci_0000_82_10_1
...

Проверим состояние устройств в virsh
Это pci_0000_82_00_0 как понимаю PF, а and pci_0000_82_10_0 первая из Виртуальных(VF) ассоциированных с PF. Проверим с помощью команды virsh nodedev-dumpxml, что там присутствует и доступно.

# virsh nodedev-dumpxml pci_0000_82_10_0
# virsh nodedev-dumpxml pci_0000_82_10_1

< name>pci_0000_82_10_1
< parent>pci_0000_80_03_2
< driver>
< name>igbvf< /name>
< /driver>
< capability type='pci'>
< domain>0< /domain>
< bus>130< /bus>
< slot>16< /slot>
< function>1< /function>
< product id='0x10ca'>82576 Virtual Function< /product>
< vendor id='0x8086'>Intel Corporation
< /capability>
< /device>

В этом примере добавлена Виртуальное функция на устройство pci_0000_82_10_1 . Запомним параметры bus, slot и function , они потребуются нам для добавления в гостевой сессии, если нам с ней прийдется работать.

Деактивировать виртуальные устройства/функции в virsh
Устройства подсоедененные к хосту не могут быть присоеденены к гостевой сессии. Linux автоматически присоединяет новые устройства к хосту. Отсоединение виртуальных устройств/функций от хоста, позволяет коннектить их к гостевой сессии.

# virsh nodedev-dettach pci_0000_82_10_0
Device pci_0000_82_10_0 dettached
# virsh nodedev-dettach pci_0000_82_10_1
Device pci_0000_82_10_1 dettached

К тем кто не загрузил своевременно модули vfio, vfio_iommu_type1, vfio_pci, vfio_virqfd обязательно на этом этапе прийдет ошибка

error: internal error: Failed to load PCI stub module vfio-pci

она лечится запуском тех самых модулей

# sudo modprobe vfio
# sudo modprobe vfio_pci

Дальнейшая часть уже не входила в мою сферу тестирования. Главное что виртуальные устройства найдены, активированы и видны, везде где могут быть в дальнейшем использованы.

Теги:

sr-iov
ubuntu

Хабы:

Виртуализация
Компьютерное железо

компьютеры

Previous post Next post
Up