У меня есть устройства NIC на хосте:
# перечислить устройства Ethernet PCI, чтобы узнать имена
lspci-nn | grep Ethernet
# 04:00.0 Контроллер Ethernet [0200]: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 Контроллер PCI Express Gigabit Ethernet [10ec:8168] (версия 06)
# 05:00.0 Ethernet-контроллер [0200]: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (версия 15)
# чтобы получить <домен>.<шина>.<слот>.<функция>
lspci -n -s 0000:04:00.0
# 04:00.0 0200:10ec:8168 (версия 06)
И я хочу пройти через устройство 0000:04:00.0 к КВМ
виртуальная машина Ubuntu 20.04. Хост может не видеть это устройство, когда виртуальная машина работает. Чтобы привязать PCI NIC к гостю, я успешно выполнил инструкцию VFIO — «виртуальный функциональный ввод-вывод». А вот отвязаться от гостя к хозяину оказалось сложнее.
Я привязываю NIC-устройство от хоста к гостю вручную следующим образом:
# найти контроллер Ethernet
ls -l /sys/класс/сеть/ | grep pci
# enp3s0 -> ../../devices/pci0000:00/0000:00:1c.5/0000:03:00.0/net/enp3s0
# enp4s0 -> ../../devices/pci0000:00/0000:00:1c.7/0000:04:00.0/net/enp4s0
lspci-nn | grep Ethernet
# 04:00.0 Контроллер Ethernet [0200]: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 Контроллер PCI Express Gigabit Ethernet [10ec:8168] (версия 06)
# 05:00.0 Ethernet-контроллер [0200]: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (версия 15)
# проверить группировку IOMMU
для в /sys/kernel/iommu_groups/*; найти $a -типа l; сделано | сортировка --версия-сортировка | grep '04:00\|05:00'
# /sys/kernel/iommu_groups/12/devices/0000:04:00.0
# /sys/kernel/iommu_groups/13/devices/0000:05:00.0
# найти MAC-адреса
для eth в enp4s0 enp5s0; сделать ifconfig $eth | эфир | echo "MAC" "$eth:" $(awk '{print $2}'); сделано
# MAC enp4s0:50:...
# MAC enp5s0:18:...
# загружаем драйвер устройства vfio-pci
modprobe vfio_pci
# отвязаться от хоста
эхо 0000:04:00.0 | sudo tee /sys/bus/pci/devices/0000:04:00.0/драйвер/развязать
# сделать доступным для гостей
эхо 10ec 8168 | sudo tee /sys/bus/pci/drivers/vfio-pci/new_id
# Группа IOMMU для устройства 0000:04:00.0 равна 12
# добавляем libvirt-qemu в sudoers
sudo usermod -aG sudo libvirt-qemu
sudo chown libvirt-qemu:libvirt-qemu /dev/vfio/12
# посмотреть, какие еще устройства есть в группе, чтобы освободить ее для использования VFIO
ls -l /sys/bus/pci/devices/0000:04:00.0/iommu_group/devices | awk '{напечатать $9 $10 $11}'
# 0000:04:00.0->../../../../устройства/pci0000:00/0000:00:1c.5/0000:04:00.0
# также добавляем другие устройства, если они принадлежат к той же группе (в данном случае не нужны)
# убедитесь, что устройство не видно с хоста
ls -l /sys/класс/сеть/ | grep enp4s0
Затем я создал новую виртуальную машину Ubuntu 20.04, используя Диспетчер виртуальных машин (virt-manager) бежать дальше КВМ.
Я добавил новое устройство в виртуальную машину, отредактировав его конфигурацию xml в вирт-менеджер
во время создания. В частности, <devices>
раздел содержит следующий тег
<hostdev mode="subsystem" type="pci" managed="yes">
<driver name="vfio"/>
<source>
<address domain="0x0000" bus="0x04" slot="0x00" function="0x0"/>
</source>
<mac address='50:...'/>
<address type="pci">
<zpci uid="0x0001" fid="0x00000000"/>
</address>
</hostdev>
Затем я установил Ubuntu 20.04 обычным способом. Система перезагружается корректно, без зависаний (черный экран).
Когда я выключаю виртуальную машину, я хочу вернуть сетевой адаптер PCI на хост. Я провел исследование на форумах, но нет четких инструкций, как это сделать.
Если я перезагружаю хост, все устройства возвращаются на хост, поэтому привязка vfio освобождается. Но как я могу это сделать без перезагрузки хоста.