Случается, что виртуальной машине необходимо предоставить доступ к RAW сетевой карте с тегированным трафиком, не разделяя его на VLAN на уровне гипервизора. Например, такое требование есть у OPNsense(firewall и routing) и у контроллеров для отечественной виртуализации Basis Dynamix.

Расскажу, как сделать такой доступ.

Чтобы включить функции SR‑IOV (Single Root Input/Output Virtualization), конечно, в первую очередь необходима их поддержка на уровне сетевого оборудования сервера. Обычно об этом пишут в документации по сетевой карте.

Начать настройку можно с перезагрузки в консоли вашего сервера.

Входим в BIOS/UEFI настройки во время инициализации. Обычно это кнопки F2 или Del во время загрузки (зависит от производителя оборудования).

Далее в «System Settings», настройках «Processor Settings» или «Integrated Devices» необходимо найти «Intel VT‑d» или «AMD‑Vi» и включить их.

Затем поискать настройку «SR‑IOV» и тоже включить ее. Эта настройка может быть глобальной, а может быть привязанной к конкретному устройству.

Пример пути настройки «SR‑IOV» в Dell:
«iDRAC → Configuration → BIOS Settings → Integrated Devices → SR‑IOV Global Enable = ENABLED»

Пример пути настройки «SR‑IOV» в Lenovo:
«System Configuration → System Settings → Network → Network Device List → Intel® Ethernet Connection X722 for 10Gba backplane — 38:68:DD:11:12:22 (настройка есть только на первом порту сетевой карты) → Device Level Configuration → Virtualization Mode = SR‑IOV»

Сохраним изменения и сделаем перезагрузку.

Обычно эти настройки уже включены поэтому можно сначала «наудачу» пропустить этот первый шаг, так как он требует перезагрузки, и вернуться к нему, если не найдете нужного устройства ниже.

Поищем устройства на гипервизоре, который поддерживает SR‑IOV, управляющий файл sriov_numvfs в интерфейсе ядра /sys.

# find /sys -name sriov_numvfs
/sys/devices/pci0000:17/0000:17:00.0/0000:18:00.0/0000:19:03.0/0000:1a:00.1/sriov_numvfs
/sys/devices/pci0000:17/0000:17:00.0/0000:18:00.0/0000:19:03.0/0000:1a:00.2/sriov_numvfs
/sys/devices/pci0000:17/0000:17:00.0/0000:18:00.0/0000:19:03.0/0000:1a:00.0/sriov_numvfs
/sys/devices/pci0000:17/0000:17:00.0/0000:18:00.0/0000:19:03.0/0000:1a:00.3/sriov_numvfs
/sys/devices/pci0000:3a/0000:3a:00.0/0000:3b:00.0/sriov_numvfs
/sys/devices/pci0000:3a/0000:3a:00.0/0000:3b:00.1/sriov_numvfs

Отлично, нашлось 6 устройств. Альтернативно можно использовать и более короткие имена на шине pci (/sys/bus/pci/devices). Какое вы будете использовать имя не очень важно.

# find /sys/bus/pci/devices/0000\:18\:00.0/ -name sriov_numvfs
/sys/bus/pci/devices/0000:18:00.0/0000:19:03.0/0000:1a:00.1/sriov_numvfs
/sys/bus/pci/devices/0000:18:00.0/0000:19:03.0/0000:1a:00.2/sriov_numvfs
/sys/bus/pci/devices/0000:18:00.0/0000:19:03.0/0000:1a:00.0/sriov_numvfs
/sys/bus/pci/devices/0000:18:00.0/0000:19:03.0/0000:1a:00.3/sriov_numvfs

Если вы ничего не нашли, то вам придется сходить в BIOS/UEFI сервера и поискать заветные настройки. Если и это не помогло, то значит ваше оборудование SR‑IOV не поддерживает.

Продолжим.

Посмотрим, какую сетевую карту вы сейчас используете.

# ip a| grep state| egrep -v 'tap|vmbr|fwbr'
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
2: eno1np0:  mtu 9000 qdisc mq master bond0 state UP group default qlen 1000
3: eno2np1:  mtu 9000 qdisc mq master bond0 state UP group default qlen 1000
4: eno3np2:  mtu 1500 qdisc noop state DOWN group default qlen 1000
5: eno4np3:  mtu 1500 qdisc noop state DOWN group default qlen 1000
73: bond0:  mtu 9000 qdisc noqueue state UP group default qlen 1000

В нашем случае это сетевые карты eno1np0 и eno2np1.

С помощью ethtool можно узнать информацию о драйвере и адресе bus‑info:

# ethtool -i eno1np0
driver: i40e
version: 6.8.4-2-pve
firmware-version: 4.00 0x80001839 1.2007.0
expansion-rom-version: 
bus-info: 0000:1a:00.0
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: yes

# ethtool -i eno2np1
driver: i40e
version: 6.8.4-2-pve
firmware-version: 4.00 0x80001839 1.2007.0
expansion-rom-version: 
bus-info: 0000:1a:00.1
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: yes

bus‑info говорит, что обе сетевые карты сидят на адресе, начинающемся с '1a' (0000:1a:00.0 и 0000:1a:00.1 в выводе выше).

Эти сетевые карты можно посмотреть в выводе команды lspci. Видим, что их адрес на шине также начинается с '1a'.

# lspci | grep -i ethernet
1a:00.0 Ethernet controller: Intel Corporation Ethernet Connection X722 for 10GbE SFP+ (rev 09)
1a:00.1 Ethernet controller: Intel Corporation Ethernet Connection X722 for 10GbE SFP+ (rev 09)
1a:00.2 Ethernet controller: Intel Corporation Ethernet Connection X722 for 1GbE (rev 09)
1a:00.3 Ethernet controller: Intel Corporation Ethernet Connection X722 for 1GbE (rev 09)

Можно налету добавить еще по 3 виртуальных сетевых карты примерно такой RunTime командой:

echo 3 > /sys/devices/pci0000:17/0000:17:00.0/0000:18:00.0/0000:19:03.0/0000:1a:00.0/sriov_numvfs
echo 3 > /sys/devices/pci0000:17/0000:17:00.0/0000:18:00.0/0000:19:03.0/0000:1a:00.1/sriov_numvfs

Но мы хотим, чтобы три виртуальных сетевых карты добавлялись теперь всегда и сразу при старте сервера. Поэтому эту команду давать не будем, а применим эту настройку по-другому, с помощью пакета 'sysfsutils', который нужно предварительно установить на систему c PVE.

apt-get install sysfsutils
dpkg -L sysfsutils
# документация по утилите:
man systool
man sysfs.conf

Создадим конфигурационный файл для sysfsutils. В конфигурационный файл впишем пути до командных устройств, найденных выше командой find. Из путей уберем '/sys'. Получится так:

# vim /etc/sysfs.d/sr-iov.i40e.conf
devices/pci0000:17/0000:17:00.0/0000:18:00.0/0000:19:03.0/0000:1a:00.0/sriov_numvfs = 3
devices/pci0000:17/0000:17:00.0/0000:18:00.0/0000:19:03.0/0000:1a:00.1/sriov_numvfs = 3

С помощью таких команд можно узнать текущее значение параметра sriov_numvfs у сетевой карты.

# systool -b 'pci' -A sriov_numvfs '0000:1a:00.0' 
Bus = "pci"

  0000:1a:00.0 Intel Corporation Ethernet Connection X722 for 10GbE SFP+
    sriov_numvfs        = "0"

То же самое можно было бы посмотреть и через интерфейс /sys.

# cat /sys/devices/pci0000:17/0000:17:00.0/0000:18:00.0/0000:19:03.0/0000:1a:00.0/sriov_numvfs
0	

Применим новые параметры из нашего конфигурационного файла /etc/sysfs.d/sr-iov.i40e

# systemctl enable --now sysfsutils
# systemctl restart sysfsutils

Проверим, что система применила настройки:

# systool -b 'pci' -A sriov_numvfs '0000:1a:00.0' 
Bus = "pci"

  0000:1a:00.0 Intel Corporation Ethernet Connection X722 for 10GbE SFP+
    sriov_numvfs        = "3"

Альтернативный способ инициализации виртуальных сетевых карт — указать параметр с количеством виртуальных сетевых карт при инициализации модуля ядра сетевой карты в modprobe или в cmdline ядра.

Теперь мы видим 6 новых виртуальных сетевых карт на гипервизоре «Ethernet Virtual Function» помимо физических сетевых карт:

# lspci | grep -i ethernet
1a:00.0 Ethernet controller: Intel Corporation Ethernet Connection X722 for 10GbE SFP+ (rev 09)
1a:00.1 Ethernet controller: Intel Corporation Ethernet Connection X722 for 10GbE SFP+ (rev 09)
1a:00.2 Ethernet controller: Intel Corporation Ethernet Connection X722 for 1GbE (rev 09)
1a:00.3 Ethernet controller: Intel Corporation Ethernet Connection X722 for 1GbE (rev 09)
1a:02.0 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 09)
1a:02.1 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 09)
1a:02.2 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 09)
1a:06.0 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 09)
1a:06.1 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 09)
1a:06.2 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 09)

Эти сетевые карты уже появились в выводе ip address

# ip a| grep state| egrep -v 'tap|vmbr'
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
2: eno1np0:  mtu 9000 qdisc mq master bond0 state UP group default qlen 1000
3: eno2np1:  mtu 9000 qdisc mq master bond0 state UP group default qlen 1000
4: eno3np2:  mtu 1500 qdisc noop state DOWN group default qlen 1000
5: eno4np3:  mtu 1500 qdisc noop state DOWN group default qlen 1000
73: bond0:  mtu 9000 qdisc noqueue state UP group default qlen 1000
109: fwbr181i0:  mtu 1500 qdisc noqueue state UP group default qlen 1000
111: fwln181i0@fwpr181p0:  mtu 1500 qdisc noqueue master fwbr181i0 state UP group default qlen 1000
118: eno1v1:  mtu 1500 qdisc noop state DOWN group default qlen 1000
119: eno1v0:  mtu 1500 qdisc noop state DOWN group default qlen 1000
120: eno1v2:  mtu 1500 qdisc noop state DOWN group default qlen 1000
121: eno2v1:  mtu 1500 qdisc noop state DOWN group default qlen 1000
122: eno2v2:  mtu 1500 qdisc noop state DOWN group default qlen 1000
123: eno2v0:  mtu 1500 qdisc noop state DOWN group default qlen 1000

Эти сетевые карты есть в ip link

# ip l show dev eno1np0
2: eno1np0:  mtu 1500 qdisc mq master bond0 state UP mode DEFAULT group default qlen 1000
    link/ether 38:68:dd:00:26:d0 brd ff:ff:ff:ff:ff:ff
    vf 0     link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff, spoof checking on, link-state auto, trust off
    vf 1     link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff, spoof checking on, link-state auto, trust off
    vf 2     link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff, spoof checking on, link-state auto, trust off
    vf 3     link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff, spoof checking on, link-state auto, trust off
    altname enp9s0f0np0

# ip l show dev eno2np1
3: eno2np1:  mtu 1500 qdisc mq master bond0 state UP mode DEFAULT group default qlen 1000
    link/ether 38:68:dd:00:26:d0 brd ff:ff:ff:ff:ff:ff permaddr 38:68:dd:00:26:d1
    vf 0     link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff, spoof checking on, link-state auto, trust off
    vf 1     link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff, spoof checking on, link-state auto, trust off
    vf 2     link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff, spoof checking on, link-state auto, trust off
    vf 3     link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff, spoof checking on, link-state auto, trust off
    altname enp9s0f1np1

Мы видим, что гипервизор начал использовать новые сетевые карты:

# ip l show dev eno1v0
27: eno1v0:  mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether fe:49:7e:77:46:3d brd ff:ff:ff:ff:ff:ff
    altname enp9s0f0v0
	
# ip l show dev eno1v1
25: eno1v1:  mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 9e:ef:96:c5:03:7f brd ff:ff:ff:ff:ff:ff
    altname enp9s0f0v1

# ip l show dev eno1v2
28: eno1v2:  mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 8e:e9:38:d0:83:b7 brd ff:ff:ff:ff:ff:ff
    altname enp9s0f0v2

# ip l show dev eno2v0
29: eno2v0:  mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether f6:d6:bc:1f:7f:05 brd ff:ff:ff:ff:ff:ff
    altname enp9s0f1v0

# ip l show dev eno2v1
31: eno2v1:  mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 2e:b9:a6:bf:88:e3 brd ff:ff:ff:ff:ff:ff
    altname enp9s0f1v1

# ip l show dev eno2v3
30: eno2v3:  mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 76:1d:f5:1a:de:bc brd ff:ff:ff:ff:ff:ff
    altname enp9s0f1v3	

Воспользуемся тем, что гипервизор их видит.

Определим адреса на шине у виртуальных сетевых карт, которые будем позже пробрасывать в нужные виртуальные машины ProxMox VE.

Сделаем это через ethtool для физических сетевых карт eno1 и eno2:

# ethtool -i eno1v0
driver: iavf
version: 6.8.4-2-pve
firmware-version: N/A
expansion-rom-version: 
bus-info: 0000:09:02.0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: no
supports-priv-flags: yes

# ethtool -i eno2v0
driver: iavf
version: 6.8.4-2-pve
firmware-version: N/A
expansion-rom-version: 
bus-info: 0000:09:06.0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: no
supports-priv-flags: yes

Bus info говорит, что в виртуальную машину нужно пробросить PCI устройства с адресами «0000:09:02.0» и «0000:09:06.0». Запомните эти адреса, они понадобятся позже при настройке конфигурации виртуальной машины.

Это не нужно, но вдруг вам интересно

Чтобы гипервизор не имел доступа к виртуальным сетевым картам, хочется отключить их драйвер. Из лога dmesg видим, что имя драйвера в моём случае "iavf". Бывает еще "ixgbevf"

# dmesg | grep -i eth
[89675.738996] iavf 0000:09:02.0 eno1v0: renamed from eth0
[89675.761988] iavf 0000:09:02.1 eno1v1: renamed from eth1
[89675.792010] iavf 0000:09:02.2 eno1v2: renamed from eth2
[89675.819705] Modules linked in: iavf cdc_ether usbnet mii ebtable_filter ebtables ip_set ip6table_raw iptable_raw ip6table_filter ip6_tables iptable_filter sctp ip6_udp_tunnel udp_tunnel nf_tables 8021q garp mrp bonding tls softdog sunrpc nfnetlink_log nfnetlink binfmt_misc intel_rapl_msr intel_rapl_common intel_uncore_frequency intel_uncore_frequency_common isst_if_common skx_edac nfit x86_pkg_temp_thermal coretemp kvm_intel kvm irqbypass crct10dif_pclmul polyval_clmulni polyval_generic ghash_clmulni_intel sha256_ssse3 sha1_ssse3 aesni_intel irdma crypto_simd ice mgag200 cryptd rapl mei_me gnss cmdlinepart ipmi_ssif spi_nor mei ib_uverbs i2c_algo_bit intel_cstate acpi_power_meter intel_pch_thermal joydev ioatdma input_leds ib_core dca pcspkr mac_hid mtd acpi_ipmi ipmi_si ipmi_devintf ipmi_msghandler zfs(PO) spl(O) vhost_net vhost vhost_iotlb tap efi_pstore dmi_sysfs ip_tables x_tables autofs4 btrfs blake2b_generic xor raid6_pq dm_service_time scsi_dh_rdac scsi_dh_alua lpfc nvmet_fc nvmet nvme_keyring dm_round_robin
[89675.825011] iavf 0000:09:02.3 eno1v3: renamed from eth0
[89676.282993] iavf 0000:09:06.3 eno2v3: renamed from eth0
[89676.300986] iavf 0000:09:06.0 eno2v0: renamed from eth1
[89676.328986] iavf 0000:09:06.2 eno2v2: renamed from eth2
[89676.360981] iavf 0000:09:06.1 eno2v1: renamed from eth3

Можно было бы добавить этот неугодный драйвер в blacklist, исправить blacklist в initramfs и перезагрузить гипервизор, однако вот тут пишут, что этого делать не стоит.

# vim /etc/modprobe.d/pve-blacklist.conf
blacklist iavf
# update-initramfs -u -k all
# reboot

Я пробовал отключать — действительно иногда сетевая карта на гипервизоре идет вразнос, если выгрузить драйвер для VF, поэтому включил его обратно.

На некоторых linux документация также советует добавить «intel_iommu=on iommu=pt» в параметры загрузки ядра в grub cmdline. Однако ProxMox VE 8 по умолчанию загружает нужные модули ядра и этого делать не требуется.

Cогласно документации по драйверу нужно включить trust режим и выключить spoof на виртуальных сетевых картах. Если этого не сделать, сработает защита от трафика со случайных MAC‑адресов и виртуальная машина не сможет отправлять пакеты в сеть.

# ip l show dev eno1np0
2: eno1np0:  mtu 1500 qdisc mq master bond0 state UP mode DEFAULT group default qlen 1000
    link/ether 38:68:dd:01:b7:18 brd ff:ff:ff:ff:ff:ff
    vf 0     link/ether a6:fc:77:4b:7b:94 brd ff:ff:ff:ff:ff:ff, spoof checking on, link-state auto, trust off
    vf 1     link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff, spoof checking on, link-state auto, trust off
    vf 2     link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff, spoof checking on, link-state auto, trust off
    altname enp9s0f0np0

Runtime команды примерно такие (их сейчас набирать не нужно, мы их сразу в статику запишем):

# ip link set dev eno1np0 vf 0 trust on
# ip link set dev eno1np0 vf 1 trust on
# ip link set dev eno1np0 vf 2 trust on

# ip link set dev eno2np1 vf 0 trust on
# ip link set dev eno2np1 vf 1 trust on
# ip link set dev eno2np1 vf 2 trust on

# ip link set eno1np0 vf 0 spoofchk off
# ip link set eno1np0 vf 1 spoofchk off
# ip link set eno1np0 vf 2 spoofchk off

# ip link set eno2np1 vf 0 spoofchk off
# ip link set eno2np1 vf 1 spoofchk off
# ip link set eno2np1 vf 2 spoofchk off
# ip link show eno1np0

2: eno1np0:  mtu 1500 qdisc mq master bond0 state UP mode DEFAULT group default qlen 1000
    link/ether 38:68:dd:01:b7:18 brd ff:ff:ff:ff:ff:ff
    vf 0     link/ether a6:fc:77:4b:7b:94 brd ff:ff:ff:ff:ff:ff, spoof checking off, link-state auto, trust on
    vf 1     link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff, spoof checking off, link-state auto, trust on
    vf 2     link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff, spoof checking off, link-state auto, trust on
    altname enp9s0f0np0
# ip link show eno2np1
3: eno2np1:  mtu 1500 qdisc mq master bond0 state UP mode DEFAULT group default qlen 1000
    link/ether 38:68:dd:01:b7:18 brd ff:ff:ff:ff:ff:ff permaddr 38:68:dd:01:b7:19
    vf 0     link/ether 02:94:95:5a:a5:88 brd ff:ff:ff:ff:ff:ff, spoof checking off, link-state auto, trust on
    vf 1     link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff, spoof checking off, link-state auto, trust on
    vf 2     link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff, spoof checking off, link-state auto, trust on
    altname enp9s0f1np1	

Эти команды нужно добавить в pre-up при инициализации сетевых интерфейсов гипервизора.

# vim /etc/network/interfaces
...
auto eno1np0
iface eno1np0 inet manual
        pre-up ip link set dev eno1np0 vf 0 trust on
        pre-up ip link set dev eno1np0 vf 1 trust on
        pre-up ip link set dev eno1np0 vf 2 trust on
        pre-up ip link set dev eno1np0 vf 0 spoofchk off
        pre-up ip link set dev eno1np0 vf 1 spoofchk off
        pre-up ip link set dev eno1np0 vf 2 spoofchk off

auto eno2np1
iface eno2np1 inet manual
        pre-up ip link set dev eno2np1 vf 0 trust on
        pre-up ip link set dev eno2np1 vf 1 trust on
        pre-up ip link set dev eno2np1 vf 2 trust on
        pre-up ip link set dev eno2np1 vf 0 spoofchk off
        pre-up ip link set dev eno2np1 vf 1 spoofchk off
        pre-up ip link set dev eno2np1 vf 2 spoofchk off
...		

Чтобы это применить, запустим

systemctl restart networking

Теперь настроим проброс PCI устройства в ВМ PVE.


Обратите внимание на то, что к конфигурации виртуальной машины нужно добавлять именно "Устройство PCI", а не "Сетевое устройство".

Проверьте, что чекбокс "все функции" отключен, иначе виртуальная машина получит доступ ко всем виртуальным сетевым картам.

PCI устройство налету добавлять не получится, виртуальную машину для этого нужно погасить.

Далее — настройка сетевых интерфейсов внутри виртуальной машины.

В моем случае внутри виртуальной машины Ubuntu 24.04 для контроллера для отечественной виртуализации Basis Dynamix. Потребуется настройка OpenVSwitch.

Но это уже совсем другая история.

Комментарии (4)


  1. Pev4ov
    24.10.2025 05:09

    А с IB такое провернуть пробовали?


    1. n27051538 Автор
      24.10.2025 05:09

      Про IB слышал только в теории и давно. К сожалению приходится работать на том, что согласовывают к закупкам. Если есть что добавить про IB - с удовольствием попробую, если представится возможность.


  1. igrblkv
    24.10.2025 05:09

    В PVE 9 всё аналогично, не пробовали?


    1. n27051538 Автор
      24.10.2025 05:09

      На PVE9 мы не переходили, недавно перешли с 7 на 8. Предпочитаем работать на версиях хорошо проверенных временем.