VYOS-VPP: различия между версиями

Материал из EWiki
Перейти к навигации Перейти к поиску
Нет описания правки
 
(не показаны 4 промежуточные версии этого же участника)
Строка 25: Строка 25:
После перезагрузки нужно убедиться, что режим IOMMU включен, для этого выполнить команду:<syntaxhighlight lang="sh">
После перезагрузки нужно убедиться, что режим IOMMU включен, для этого выполнить команду:<syntaxhighlight lang="sh">
dmesg | grep IOMMU
dmesg | grep IOMMU
</syntaxhighlight>Вывод должен быть примерно таким:
</syntaxhighlight>Вывод должен быть примерно таким:<blockquote>'''[    0.046990] DMAR: IOMMU enabled'''
 
'''[    0.046990] DMAR: IOMMU enabled'''


[    0.109294] DMAR-IR: IOAPIC id 1 under DRHD base  0xfbffc000 IOMMU 1
[    0.109294] DMAR-IR: IOAPIC id 1 under DRHD base  0xfbffc000 IOMMU 1
Строка 37: Строка 35:
[    0.372779] DMAR: IOMMU feature dev_iotlb_support inconsistent
[    0.372779] DMAR: IOMMU feature dev_iotlb_support inconsistent


[    0.386236] AMD-Vi: AMD IOMMUv2 functionality not available on this system - This is not a bug.
[    0.386236] AMD-Vi: AMD IOMMUv2 functionality not available on this system - This is not a bug.</blockquote>


=== 3. Настройка работы сетевых карт в режиме VFIO ===
=== 3. Настройка работы сетевых карт в режиме VFIO ===
Строка 73: Строка 71:
lspci -k -v -s 0000:03:00.0
lspci -k -v -s 0000:03:00.0
lspci -k -v -s 0000:03:00.1
lspci -k -v -s 0000:03:00.1
</syntaxhighlight><blockquote>03:00.0 Ethernet controller: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ (rev 02)
</syntaxhighlight>Вывод должен быть примерно таким (обращаем внимание на текущий Kernel driver in use):<blockquote>03:00.0 Ethernet controller: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ (rev 02)


        Subsystem: Intel Corporation Ethernet Converged Network Adapter X710-2
        Subsystem: Intel Corporation Ethernet Converged Network Adapter X710-2
Строка 89: Строка 87:
        Capabilities: <access denied>
        Capabilities: <access denied>


        Kernel driver in use: i40e
        '''Kernel driver in use: i40e'''


        Kernel modules: i40e</blockquote><syntaxhighlight lang="sh">
        Kernel modules: i40e</blockquote>Для обеих сетевух отвязываем их от текущего драйвера и привязываем к VFIO:<syntaxhighlight lang="sh">
echo 0000:03:00.1 | sudo tee /sys/bus/pci/devices/0000:03:00.1/driver/unbind
echo 0000:03:00.0 | sudo tee /sys/bus/pci/devices/0000:03:00.0/driver/unbind


# 2. Привязываем к vfio-pci
# 2. Привязываем к vfio-pci
echo vfio-pci | sudo tee /sys/bus/pci/devices/0000:03:00.1/driver_override
echo vfio-pci | sudo tee /sys/bus/pci/devices/0000:03:00.0/driver_override
echo 0000:03:00.1 | sudo tee /sys/bus/pci/drivers/vfio-pci/bind
echo 0000:03:00.0 | sudo tee /sys/bus/pci/drivers/vfio-pci/bind


# 3. Проверяем
# 3. Проверяем
lspci -k -s 03:00.1
lspci -k -s 03:00.0
</syntaxhighlight>
</syntaxhighlight>


Те же манипуляции делаем для 0000:03:00.1 (не забываем в путях к файлам настроек корректно прописать каталог устройства '''0000:03:00.1''').


Убеждаемся, что для обеих сетевух теперь используется драйвер VFIO:<blockquote>03:00.0 Ethernet controller: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ (rev 02)


<nowiki>#########################################################################################</nowiki>
        Subsystem: Intel Corporation Ethernet Converged Network Adapter X710-2


=== test web server (для проверки работы vyos) ===
        Physical Slot: 4
while true; do { echo -e 'HTTP/1.1 200 OK\r\nContent-Length: 13\r\n\r\nHello, World!'; } | nc -l 8081; done


=== надо будет еще ядро перенастраивать (но пока рано) ===
        Flags: fast devsel, IRQ 27, NUMA node 0, IOMMU group 28
sudo grub-probe --device /dev/sda3


=== это мое ! ===
        Memory at 383ffe800000 (64-bit, prefetchable) [size=8M]
podman cp /home/vyos/vpp.conf vpp:/config/vpp.conf


конфигурирование podman
        Memory at 383fff808000 (64-bit, prefetchable) [size=32K]


sudo nano /etc/containers/containers.conf
        Expansion ROM at fbd80000 [disabled] [size=512K]


dns_bind_port=54
        Capabilities: <access denied>


sudo chattr +i /etc/containers/containers.conf
        '''Kernel driver in use: vfio-pci'''


<nowiki>#########################################################################################</nowiki>
        Kernel modules: i40e</blockquote>


=== порядок биндинья карт ===
'''Примечание:''' Также в выводе команды ip link интерфейсов eth0 и eth1 теперь не будет, так как они перешли под управление VFIO.
1) серевые карты VPP долюжы быть переведены в down (ip l set state eth1 down)


2) вклчаем драйвер
=== 4. Запуск контейнера для VPP ===
Создаем сетевое пространство имен NGFW (нужно для корректного запуска контейнера):


sudo modprobe vfio-pci
<syntaxhighlight lang="sh">
sudo ip netns add ngfw
</syntaxhighlight>Выполняем запуск контейнера с VPP:<syntaxhighlight lang="sh">
sudo podman run -d --name vpp --network host --privileged --restart always --ulimit core=0:0 --shm-size 4g --volume /var/run/netns:/var/run/netns --volume /var/vpp/netplan:/etc/vpp/netplan --volume /var/log:/var/log --volume /var:/config/shared --env-file /config/vpp/env docker-archive:/home/vyos/vpp-image.tar
</syntaxhighlight>'''Примечания:'''


3) потом делаем бинд
# Необходимо убедиться, что все монтируемые каталоги, а также образ и файл env, указанные в команде, лежат на своих местах.
# В случае ошибки запуска (может ругаться на то, что контейнер VPP уже существует) следует добавить в команду параметр '''--replace'''


так можно но не получилось т.к. с iommq проблемы


sudo echo "0000:00:12.0" > /sys/bus/pci/drivers/virtio-pci/bind
Проверяем состояние контейнера:<syntaxhighlight lang="sh">
sudo podman ps
</syntaxhighlight>


делал так:
Настраиваем контейнер:<syntaxhighlight lang="sh">
 
sudo podman cp /home/vyos/vpp.conf vpp:/config/vpp.conf
качал dpdk c github
sudo podman restart vpp
 
</syntaxhighlight>
cd /home/vyos/dpdk-24.11/usertools
 
python3 dpdk-devbind.py -b vfio-pci 0000:03:00.0 --noiommu-mode
 
перечень карт можно увидеть
 
lspci | grep Eth
 
<nowiki>#########################################################################################</nowiki>
 
=== запуск vpp (далее сделаем через podman-compose) тут порядок в куче ===
ip l set dev eth1 down
 
ip l set dev eth2 down
 
modprobe vfio-pci
 
python3 dpdk-devbind.py -b vfio-pci 0000:03:00.0 --noiommu-mode
 
python3 dpdk-devbind.py -b vfio-pci 0000:03:00.1 --noiommu-mode
 
=== создание ngfw пространства имен ===
ip netns add ngfw
 
podman rm vpp -f
 
=== создание host interface ===
ip netns exec ngfw bash
 
ip link add name http1out type veth peer name http1host
 
ip link set dev http1out up
 
ip link set dev http1host up
 
ip addr add 10.10.10.10/24 dev http1host
 
ip addr show http1host
 
podman run -d --name vpp --network host --privileged --restart always --ulimit core=0:0 --shm-size 4g --volume /var/run/netns:/var/run/netns --volume /var/vpp/netplan:/etc/vpp/netplan --volume /var/log:/var/log --volume /var:/config/shared --env-file /config/vpp/env docker-archive:/home/vyos/vpp-image.tar
 
=== vpp: ===
create host-interface name http1out
 
set interface state host-http1out up
 
podman cp /home/vyos/vpp.conf vpp:/config/vpp.conf
 
podman restart vpp
 
=== назначаем адрес для теста (data2 в бридже loop10) ===
podman exec -it vpp vppctl
 
set interface ip address loop10 10.1.100.125/24
 
show int addr
 
<nowiki>#########################################################################################</nowiki>
 
<nowiki>##########</nowiki> enode on podman -----------------------------
 
=== включение разрешений для podman ===
set nat source rule 100 source address '10.88.0.0/16'
 
set nat source rule 100 translation address 'masquerade'
 
commit
 
save
 
=== для traefik нуже сервис podman api ===
podman system service -t 0 unix:///run/user/1000/podman/podman.sock &
 
 
vyos|vyos


=== 5. Настройка интерфейсов внутри контейнера VPP: ===
Заходим внутрь запущенного контейнера:<syntaxhighlight lang="sh">
sudo podman exec -it vpp vppctl
sudo podman exec -it vpp vppctl
</syntaxhighlight>Проверяем состояние интерфейсов:<syntaxhighlight lang="sh">
show interface
</syntaxhighlight>Вывод должен быть примерно таким:<blockquote>vpp# show interface


show acl-plugin acl
              Name               Idx    State  MTU (L3/IP4/IP6/MPLS)     Counter          Count
 
 
<nowiki>#########################################################################################</nowiki>
 
<nowiki>###</nowiki> пример лога vpp контейнера
 
[INFO    ] root.main: Loading configfile /etc/vpp/netplan/netplan.yaml
 
[INFO    ] vppcfg.config.valid_config: Configuration validated successfully
 
[INFO    ] root.main: Configuration is valid
 
[INFO    ] vppcfg.vppapi.connect: VPP version is 24.02-release
 
[INFO    ] vppcfg.reconciler.write: Wrote 46 lines to /etc/vpp/applynetplan.yaml
 
[INFO    ] root.main: Planning succeeded
 
api_response => lcp_itf_pair_get []
 
111111111111111111 create sub data1 109 dot1q 109 exact-match
 
111111111111111111 create sub data1 110 dot1q 110 exact-match
 
111111111111111111 create sub data1 10 dot1q 10 exact-match
 
create loopback interface instance 110
 
linux-cp/itf         [debug ]: mtu_change: sw loop110 0
 
linux-cp/itf         [debug ]: mtu_change: si loop110 hi loop110, syncing children
 
linux-cp/itf         [debug ]: sync_state_hw: hi loop110
 
loop110
 
linux-cp/itf         [debug ]: interface_add: sw data1.109 parent data1
 
data1.109
 
linux-cp/itf         [debug ]: interface_add: sw data1.110 parent data1
 
data1.110
 
linux-cp/itf         [debug ]: interface_add: sw data1.10 parent data1
 
data1.10
 
bridge-domain 10
 
bridge-domain 109
 
bridge-domain 110
 
linux-cp/itf         [debug ]: mtu_change: sw tap4 0
 
linux-cp/itf         [debug ]: mtu_change: si tap4 hi tap4, syncing children
 
linux-cp/itf         [debug ]: sync_state_hw: hi data1.109
 
linux-cp/itf         [info  ]: pair create: {loop10, tap4, vlaneth0}
 
linux-cp/itf         [info  ]: add: host:tap4 phy:loop10, host_if:vlaneth0 vif:7 ns:ngfw
 
linux-cp/mpls-sync   [debug ]: pair_add_cb: mpls enabled 0, parent itf-pair: [0] loop10 tap4 vlaneth0 7 type tap netns ngfw
 
linux-cp/itf         [info  ]: pair create: itf-pair: [0] loop10 tap4 vlaneth0 7 type tap netns ngfw sw-flags 0 hw-flags 1
 
linux-cp/itf         [debug ]: admin_state_change: sw tap4 1
 
linux-cp/itf         [debug ]: mtu_change: sw tap5 0
 
linux-cp/itf         [debug ]: mtu_change: si tap5 hi tap5, syncing children
 
linux-cp/itf         [debug ]: sync_state_hw: hi data1.110
 
linux-cp/itf         [info  ]: pair create: {loop109, tap5, vlaneth99}
 
linux-cp/itf         [info  ]: add: host:tap5 phy:loop109, host_if:vlaneth99 vif:8 ns:ngfw
 
linux-cp/mpls-sync   [debug ]: pair_add_cb: mpls enabled 0, parent itf-pair: [1] loop109 tap5 vlaneth99 8 type tap netns ngfw
 
linux-cp/itf         [info  ]: pair create: itf-pair: [1] loop109 tap5 vlaneth99 8 type tap netns ngfw sw-flags 0 hw-flags 1
 
linux-cp/itf         [debug ]: admin_state_change: sw tap5 1
 
linux-cp/itf         [debug ]: mtu_change: sw tap6 0
 
linux-cp/itf         [debug ]: mtu_change: si tap6 hi tap6, syncing children
 
linux-cp/itf         [debug ]: sync_state_hw: hi data1.10
 
linux-cp/itf         [info  ]: pair create: {loop110, tap6, vlaneth100}
 
linux-cp/itf         [info  ]: add: host:tap6 phy:loop110, host_if:vlaneth100 vif:9 ns:ngfw
 
linux-cp/mpls-sync   [debug ]: pair_add_cb: mpls enabled 0, parent itf-pair: [2] loop110 tap6 vlaneth100 9 type tap netns ngfw
 
linux-cp/itf         [info  ]: pair create: itf-pair: [2] loop110 tap6 vlaneth100 9 type tap netns ngfw sw-flags 0 hw-flags 1
 
linux-cp/itf         [debug ]: admin_state_change: sw tap6 1
 
linux-cp/itf         [debug ]: mtu_change: sw data1 0
 
linux-cp/itf         [debug ]: mtu_change: si data1 hi data1, syncing children
 
linux-cp/itf         [debug ]: sync_state_hw: hi data1
 
linux-cp/itf         [debug ]: mtu_change: sw data1.10 0
 
linux-cp/itf         [debug ]: mtu_change: sw data1.110 0
 
linux-cp/itf         [debug ]: mtu_change: sw data1.109 0
 
linux-cp/itf         [debug ]: mtu_change: sw data2 0
 
linux-cp/itf         [debug ]: mtu_change: si data2 hi data2, syncing children
 
linux-cp/itf         [debug ]: sync_state_hw: hi data2
 
linux-cp/itf         [debug ]: mtu_change: sw host-http1out 0
 
linux-cp/itf         [debug ]: mtu_change: si host-http1out hi host-http1out, syncing children
 
linux-cp/itf         [debug ]: sync_state_hw: hi host-http1out
 
linux-cp/itf         [debug ]: mtu_change: sw loop10 0
 
linux-cp/itf         [debug ]: mtu_change: si loop10 hi loop10, syncing children
 
linux-cp/itf         [debug ]: sync_state_hw: hi loop10
 
linux-cp/itf         [info  ]: sync_state: itf-pair: [0] loop10 tap4 vlaneth0 7 type tap netns ngfw flags 0 sup-flags 0 mtu 1500 sup-mtu 1500
 
linux-cp/itf         [debug ]: mtu_change: sw tap4 0
 
linux-cp/itf         [debug ]: mtu_change: si tap4 hi tap4, syncing children
 
linux-cp/itf         [debug ]: sync_state_hw: hi data1.109
 
linux-cp/itf         [debug ]: mtu_change: sw loop109 0
 
linux-cp/itf         [debug ]: mtu_change: si loop109 hi loop109, syncing children
 
linux-cp/itf         [debug ]: sync_state_hw: hi loop109
 
linux-cp/itf         [info  ]: sync_state: itf-pair: [1] loop109 tap5 vlaneth99 8 type tap netns ngfw flags 0 sup-flags 0 mtu 1500 sup-mtu 1500
 
linux-cp/itf         [debug ]: mtu_change: sw tap5 0
 
linux-cp/itf         [debug ]: mtu_change: si tap5 hi tap5, syncing children
 
linux-cp/itf         [debug ]: sync_state_hw: hi data1.110
 
linux-cp/itf         [debug ]: mtu_change: sw loop110 0
 
linux-cp/itf         [debug ]: mtu_change: si loop110 hi loop110, syncing children
 
linux-cp/itf         [debug ]: sync_state_hw: hi loop110
 
linux-cp/itf         [info  ]: sync_state: itf-pair: [2] loop110 tap6 vlaneth100 9 type tap netns ngfw flags 0 sup-flags 0 mtu 1500 sup-mtu 1500
 
linux-cp/itf         [debug ]: mtu_change: sw tap6 0
 
linux-cp/itf         [debug ]: mtu_change: si tap6 hi tap6, syncing children
 
linux-cp/itf         [debug ]: sync_state_hw: hi data1.10
 
linux-cp/itf         [debug ]: ip4_addr_add: si:loop109 172.16.99.1/24
 
linux-cp/itf         [debug ]: ip4_addr_add: itf-pair: [1] loop109 tap5 vlaneth99 8 type tap netns ngfw ip4 172.16.99.1/24
 
linux-cp/itf         [debug ]: ip4_addr_add: si:loop110 172.16.100.1/24
 
linux-cp/itf         [debug ]: ip4_addr_add: itf-pair: [2] loop110 tap6 vlaneth100 9 type tap netns ngfw ip4 172.16.100.1/24
 
linux-cp/itf         [debug ]: admin_state_change: sw data1 1
 
 
 
 
 
 
<nowiki>###</nowiki> пример конфигурации vpp
 
<nowiki>##</nowiki> sudo podman exec vpp vppctl show int
 
 
 
 
              Name               Idx    State  MTU (L3/IP4/IP6/MPLS)     Counter          Count     
 
data1                             1      up          1500/0/0/0     tx-error                      40
 
data1.109                         7      up          1500/0/0/0     
 
data1.110                         8      up          1500/0/0/0     
 
data1.10                          9      up          1500/0/0/0     
 
data2                             2      up          1500/0/0/0     tx packets                    13
 
                                                                    tx bytes                    1086
 
host-http1out                     3      up          1500/0/0/0     rx packets                     4
 
                                                                    rx bytes                     280
 
                                                                    drops                          4
 
                                                                    ip6                            4
 
local0                            0     down          0/0/0/0       
 
loop109                           5      up          1500/0/0/0     tx packets                    26
 
                                                                    tx bytes                    2172
 
                                                                    drops                         13
 
                                                                    tx-error                       1
 
loop10                            4      up          1500/0/0/0     tx packets                    26
 
                                                                    tx bytes                    2172
 
                                                                    drops                         13
 
                                                                    tx-error                       1
 
loop110                           6      up          1500/0/0/0     tx packets                    28
 
                                                                    tx bytes                    2352
 
                                                                    drops                         14
 
tap4                              10     up          1500/0/0/0     rx packets                    13


                                                                    rx bytes                    1046
data1                             1     down         2026/0/0/0


                                                                    drops                          1
data2                             2     down         2026/0/0/0


                                                                    ip6                           13
local0                               down          0/0/0/0</blockquote>Включаем интерфейс data1 (ранее в ip link отображался как eth0, подключен к серверу Proxmox #20) и настраиваем IP:<syntaxhighlight lang="sh">
vpp# set interface state data1 up
vpp# set interface ip address data1 10.1.100.130/24


tap5                              11     up          1500/0/0/0     rx packets                    13
show interface address
</syntaxhighlight>Выполняем пинг до сетевухи на сервере Proxmox #20 и убеждаемся, что все работает:<blockquote>vpp# ping 10.1.100.25


                                                                    rx bytes                    1046
116 bytes from 10.1.100.25: icmp_seq=1 ttl=64 time=4.1699 ms


                                                                    drops                          1
116 bytes from 10.1.100.25: icmp_seq=2 ttl=64 time=7.1989 ms


                                                                    ip6                           13
116 bytes from 10.1.100.25: icmp_seq=3 ttl=64 time=1.2026 ms


tap6                              12     up          1500/0/0/0     rx packets                    13
116 bytes from 10.1.100.25: icmp_seq=4 ttl=64 time=4.1920 ms


                                                                    rx bytes                    1046
116 bytes from 10.1.100.25: icmp_seq=5 ttl=64 time=8.2405 ms


                                                                    ip6                           13
Statistics: 5 sent, 5 received, 0% packet loss</blockquote>

Текущая версия от 01:49, 17 июня 2025

Подготовка сервера с VYOS для работы с VPP

[править | править код]

1. Настройки BIOS

[править | править код]

В BIOS включить настройку Intel VT-d (или как там она называется)

Примечание: на всякий случай можно еще включить X2APIC = Enable (непонятно, влияет или нет - но лучше включить)

2. Настройки ядра VYOS

[править | править код]

В файле /boot/grub/grub.cfg.d/vyos-versions найти следующую строчку:

set boot_opts="boot=live rootdelay=5 noautologin net.ifnames=0 biosdevname=0 vyos-union=/boot/VYOS-1.5-Rolling"

и добавить в конец: " intel_iommu=on iommu=pt"

т.е. полная строка должна быть:

set boot_opts="boot=live rootdelay=5 noautologin net.ifnames=0 biosdevname=0 vyos-union=/boot/VYOS-1.5-Rolling intel_iommu=on iommu=pt"

Далее выполнить перезагрузку.

Примечание: после перезагрузки файл /boot/grub/grub.cfg.d/vyos-versions перезаписывается, так что придется потом снова строку

"set boot_opts = ..." перезаписывать, пока не придумается как ее там зафиксировать. В противном случае после следующей перезагрузки поддержка IOMMU опять слетит.

После перезагрузки нужно убедиться, что режим IOMMU включен, для этого выполнить команду:

dmesg | grep IOMMU

Вывод должен быть примерно таким:

[    0.046990] DMAR: IOMMU enabled

[    0.109294] DMAR-IR: IOAPIC id 1 under DRHD base  0xfbffc000 IOMMU 1

[    0.109297] DMAR-IR: IOAPIC id 2 under DRHD base  0xfbffc000 IOMMU 1

[    0.372778] DMAR: IOMMU feature sc_support inconsistent

[    0.372779] DMAR: IOMMU feature dev_iotlb_support inconsistent

[    0.386236] AMD-Vi: AMD IOMMUv2 functionality not available on this system - This is not a bug.

3. Настройка работы сетевых карт в режиме VFIO

[править | править код]

Проверка сетевых карт через ip link (обращаем внимание на eth0 и eth1):

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

2: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000

    link/ether 22:41:4d:03:1d:70 brd ff:ff:ff:ff:ff:ff

    altname enp6s0

3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000

    link/ether 40:a6:b7:93:42:44 brd ff:ff:ff:ff:ff:ff

    altname enp3s0f0

    altname ens4f0

4: eth1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN mode DEFAULT group default qlen 1000

    link/ether 40:a6:b7:93:42:45 brd ff:ff:ff:ff:ff:ff

    altname enp3s0f1

    altname ens4f1

5: pim6reg@NONE: <NOARP,UP,LOWER_UP> mtu 1452 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000

Убеждаемся, что загружены модули ядра для VFIO:

sudo modprobe vfio
sudo modprobe vfio-pci
sudo modprobe vfio_iommu_type1

Проверяем, что PCI-код соответствует устройству (eth0 = 0000:03:00.0, eth1 = 0000:03:00.1):

lspci -k -v -s 0000:03:00.0
lspci -k -v -s 0000:03:00.1

Вывод должен быть примерно таким (обращаем внимание на текущий Kernel driver in use):

03:00.0 Ethernet controller: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ (rev 02)

        Subsystem: Intel Corporation Ethernet Converged Network Adapter X710-2

        Physical Slot: 4

        Flags: bus master, fast devsel, latency 0, IRQ 27, NUMA node 0, IOMMU group 28

        Memory at 383ffe800000 (64-bit, prefetchable) [size=8M]

        Memory at 383fff808000 (64-bit, prefetchable) [size=32K]

        Expansion ROM at fbd80000 [disabled] [size=512K]

        Capabilities: <access denied>

        Kernel driver in use: i40e

        Kernel modules: i40e

Для обеих сетевух отвязываем их от текущего драйвера и привязываем к VFIO:

echo 0000:03:00.0 | sudo tee /sys/bus/pci/devices/0000:03:00.0/driver/unbind

# 2. Привязываем к vfio-pci
echo vfio-pci | sudo tee /sys/bus/pci/devices/0000:03:00.0/driver_override
echo 0000:03:00.0 | sudo tee /sys/bus/pci/drivers/vfio-pci/bind

# 3. Проверяем
lspci -k -s 03:00.0

Те же манипуляции делаем для 0000:03:00.1 (не забываем в путях к файлам настроек корректно прописать каталог устройства 0000:03:00.1).

Убеждаемся, что для обеих сетевух теперь используется драйвер VFIO:

03:00.0 Ethernet controller: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ (rev 02)

        Subsystem: Intel Corporation Ethernet Converged Network Adapter X710-2

        Physical Slot: 4

        Flags: fast devsel, IRQ 27, NUMA node 0, IOMMU group 28

        Memory at 383ffe800000 (64-bit, prefetchable) [size=8M]

        Memory at 383fff808000 (64-bit, prefetchable) [size=32K]

        Expansion ROM at fbd80000 [disabled] [size=512K]

        Capabilities: <access denied>

        Kernel driver in use: vfio-pci

        Kernel modules: i40e

Примечание: Также в выводе команды ip link интерфейсов eth0 и eth1 теперь не будет, так как они перешли под управление VFIO.

4. Запуск контейнера для VPP

[править | править код]

Создаем сетевое пространство имен NGFW (нужно для корректного запуска контейнера):

sudo ip netns add ngfw

Выполняем запуск контейнера с VPP:

sudo podman run -d --name vpp --network host --privileged --restart always --ulimit core=0:0 --shm-size 4g --volume /var/run/netns:/var/run/netns --volume /var/vpp/netplan:/etc/vpp/netplan --volume /var/log:/var/log --volume /var:/config/shared --env-file /config/vpp/env docker-archive:/home/vyos/vpp-image.tar

Примечания:

  1. Необходимо убедиться, что все монтируемые каталоги, а также образ и файл env, указанные в команде, лежат на своих местах.
  2. В случае ошибки запуска (может ругаться на то, что контейнер VPP уже существует) следует добавить в команду параметр --replace


Проверяем состояние контейнера:

sudo podman ps

Настраиваем контейнер:

sudo podman cp /home/vyos/vpp.conf vpp:/config/vpp.conf
sudo podman restart vpp

5. Настройка интерфейсов внутри контейнера VPP:

[править | править код]

Заходим внутрь запущенного контейнера:

sudo podman exec -it vpp vppctl

Проверяем состояние интерфейсов:

show interface

Вывод должен быть примерно таким:

vpp# show interface

              Name               Idx    State  MTU (L3/IP4/IP6/MPLS)     Counter          Count

data1                             1     down         2026/0/0/0

data2                             2     down         2026/0/0/0

local0                            0     down          0/0/0/0

Включаем интерфейс data1 (ранее в ip link отображался как eth0, подключен к серверу Proxmox #20) и настраиваем IP:

vpp# set interface state data1 up
vpp# set interface ip address data1 10.1.100.130/24

show interface address

Выполняем пинг до сетевухи на сервере Proxmox #20 и убеждаемся, что все работает:

vpp# ping 10.1.100.25

116 bytes from 10.1.100.25: icmp_seq=1 ttl=64 time=4.1699 ms

116 bytes from 10.1.100.25: icmp_seq=2 ttl=64 time=7.1989 ms

116 bytes from 10.1.100.25: icmp_seq=3 ttl=64 time=1.2026 ms

116 bytes from 10.1.100.25: icmp_seq=4 ttl=64 time=4.1920 ms

116 bytes from 10.1.100.25: icmp_seq=5 ttl=64 time=8.2405 ms

Statistics: 5 sent, 5 received, 0% packet loss