В этой статье будем пробовать, на PCI зуб, наличие в железе поддержки SR-IOV.
История написана по мотивам FedoraDocumentations и попытки повторения оного под Ubuntu Server 18.04.5. Не то что бы я сильный любитель Линукса, но под виндовс "оно не взлетело" как я ни старался, а тратить годы на эту тему, не было запланировано.
Потребовалось, как то, показать что Виртуальные функции(SR-IOV) поддерживаются на моем железе(Naples/Rome), потому как были у клиента большие и обоснованные сомнения в этом. Виртуальные устройства в итоге нашлись, но время прошло и все опять забылось. При очередном случае, снова пришлось все восстанавливать в памяти, вот тут и пригодились сохраненные ссылки на иноземной мове. Что бы в последующем не бегать по интернету, запишем как все было.
В основном все совпадает с вышеупомянутой ссылкой, но дьявол как обычно в деталях.
Для ее успешной работы, в оном режиме, рекомендовалось включить поддержку Intel VT-d в БИОСе и Линукс ядре, для Интела. Но у меня АМД, а ему требовались AMD-Vi и IOMMU. Для этого в параметрах старта ядра дописывает необходимые параметры.
Можно это дописать и в файл конфигурации /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.
У физического устройства он останется как и раньше 8086:10c9, а вот у нового Виртуального он станет уже 8086:10ca.
Отыщем эти устройства в virsh Сервис libvirt должен видеть все интересующие нас устройства и в гостевой сессии. Команда virsh nodedev-list покажет нам устройства на хосте.
Тут, у меня, случился первый облом. 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 Это pci_0000_82_00_0 как понимаю PF, а and pci_0000_82_10_0 первая из Виртуальных(VF) ассоциированных с PF. Проверим с помощью команды virsh nodedev-dumpxml, что там присутствует и доступно.
В этом примере добавлена Виртуальное функция на устройство pci_0000_82_10_1 . Запомним параметры bus, slot и function , они потребуются нам для добавления в гостевой сессии, если нам с ней прийдется работать.
Деактивировать виртуальные устройства/функции в virsh Устройства подсоедененные к хосту не могут быть присоеденены к гостевой сессии. Linux автоматически присоединяет новые устройства к хосту. Отсоединение виртуальных устройств/функций от хоста, позволяет коннектить их к гостевой сессии.
К тем кто не загрузил своевременно модули 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
Дальнейшая часть уже не входила в мою сферу тестирования. Главное что виртуальные устройства найдены, активированы и видны, везде где могут быть в дальнейшем использованы.