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

Материал из EWiki
Перейти к навигации Перейти к поиску
Нет описания правки
 
(не показано 8 промежуточных версий 2 участников)
Строка 1: Строка 1:
<nowiki>#########################################################################################</nowiki>
== Подготовка сервера с VYOS для работы с VPP ==


=== test web server (для проверки работы vyos) ===
=== 1. Настройки BIOS ===
while true; do { echo -e 'HTTP/1.1 200 OK\r\nContent-Length: 13\r\n\r\nHello, World!'; } | nc -l 8081; done
В BIOS включить настройку Intel VT-d (или как там она называется)


=== надо будет еще ядро перенастраивать (но пока рано) ===
'''Примечание:''' на всякий случай можно еще включить X2APIC = Enable (непонятно, влияет или нет - но лучше включить)
sudo grub-probe --device /dev/sda3


=== это мое ! ===
=== 2. Настройки ядра VYOS ===
podman cp /home/vyos/vpp.conf vpp:/config/vpp.conf
В файле '''/boot/grub/grub.cfg.d/vyos-versions''' найти следующую строчку:


конфигурирование podman
set boot_opts="boot=live rootdelay=5 noautologin net.ifnames=0 biosdevname=0 vyos-union=/boot/VYOS-1.5-Rolling"


sudo nano /etc/containers/containers.conf
и добавить в конец: " intel_iommu=on iommu=pt"


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


sudo chattr +i /etc/containers/containers.conf
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"


<nowiki>#########################################################################################</nowiki>
Далее выполнить перезагрузку.


=== порядок биндинья карт ===
'''Примечание:''' после перезагрузки файл '''/boot/grub/grub.cfg.d/vyos-versions''' перезаписывается, так что придется потом снова строку
1) серевые карты VPP долюжы быть переведены в down (ip l set state eth1 down)


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


sudo modprobe vfio-pci
После перезагрузки нужно убедиться, что режим IOMMU включен, для этого выполнить команду:<syntaxhighlight lang="sh">
dmesg | grep IOMMU
</syntaxhighlight>Вывод должен быть примерно таким:<blockquote>'''[    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.</blockquote>
 
=== 3. Настройка работы сетевых карт в режиме VFIO ===
Проверка сетевых карт через ip link (обращаем внимание на eth0 и eth1):<blockquote>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


3) потом делаем бинд
    link/ether 22:41:4d:03:1d:70 brd ff:ff:ff:ff:ff:ff


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


sudo echo "0000:00:12.0" > /sys/bus/pci/drivers/virtio-pci/bind
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


качал dpdk c github
    altname enp3s0f0


cd /home/vyos/dpdk-24.11/usertools
    altname ens4f0


python3 dpdk-devbind.py -b vfio-pci 0000:03:00.0 --noiommu-mode
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


lspci | grep Eth
    altname enp3s0f1


<nowiki>#########################################################################################</nowiki>
    altname ens4f1


=== запуск vpp (далее сделаем через podman-compose) тут порядок в куче ===
5: pim6reg@NONE: <NOARP,UP,LOWER_UP> mtu 1452 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000</blockquote>Убеждаемся, что загружены модули ядра для VFIO:<syntaxhighlight lang="sh">
ip l set dev eth1 down
sudo modprobe vfio
sudo modprobe vfio-pci
sudo modprobe vfio_iommu_type1
</syntaxhighlight>Проверяем, что PCI-код соответствует устройству (eth0 = 0000:03:00.0, eth1 = 0000:03:00.1):<syntaxhighlight lang="sh">
lspci -k -v -s 0000:03:00.0
lspci -k -v -s 0000:03:00.1
</syntaxhighlight>Вывод должен быть примерно таким (обращаем внимание на текущий Kernel driver in use):<blockquote>03:00.0 Ethernet controller: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ (rev 02)


ip l set dev eth2 down
        Subsystem: Intel Corporation Ethernet Converged Network Adapter X710-2


modprobe vfio-pci
        Physical Slot: 4


python3 dpdk-devbind.py -b vfio-pci 0000:03:00.0 --noiommu-mode
        Flags: bus master, fast devsel, latency 0, IRQ 27, NUMA node 0, IOMMU group 28


python3 dpdk-devbind.py -b vfio-pci 0000:03:00.1 --noiommu-mode
        Memory at 383ffe800000 (64-bit, prefetchable) [size=8M]


=== создание ngfw пространства имен ===
        Memory at 383fff808000 (64-bit, prefetchable) [size=32K]
ip netns add ngfw


podman rm vpp -f
        Expansion ROM at fbd80000 [disabled] [size=512K]


=== создание host interface ===
        Capabilities: <access denied>
ip netns exec ngfw bash


ip link add name http1out type veth peer name http1host
        '''Kernel driver in use: i40e'''


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


ip link set dev http1host up
# 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


ip addr add 10.10.10.10/24 dev http1host
# 3. Проверяем
lspci -k -s 03:00.0
</syntaxhighlight>


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


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


=== vpp: ===
        Subsystem: Intel Corporation Ethernet Converged Network Adapter X710-2
create host-interface name http1out


set interface state host-http1out up
        Physical Slot: 4


podman cp /home/vyos/vpp.conf vpp:/config/vpp.conf
        Flags: fast devsel, IRQ 27, NUMA node 0, IOMMU group 28


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


=== назначаем адрес для теста (data2 в бридже loop10) ===
        Memory at 383fff808000 (64-bit, prefetchable) [size=32K]
podman exec -it vpp vppctl


set interface ip address loop10 10.1.100.125/24
        Expansion ROM at fbd80000 [disabled] [size=512K]


show int addr
        Capabilities: <access denied>


<nowiki>#########################################################################################</nowiki>
        '''Kernel driver in use: vfio-pci'''


<nowiki>##########</nowiki> enode on podman -----------------------------
        Kernel modules: i40e</blockquote>


=== включение разрешений для podman ===
'''Примечание:''' Также в выводе команды ip link интерфейсов eth0 и eth1 теперь не будет, так как они перешли под управление VFIO.
set nat source rule 100 source address '10.88.0.0/16'


set nat source rule 100 translation address 'masquerade'
=== 4. Запуск контейнера для VPP ===
Создаем сетевое пространство имен NGFW (нужно для корректного запуска контейнера):


commit
<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>'''Примечания:'''


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


=== для traefik нуже сервис podman api ===
podman system service -t 0 unix:///run/user/1000/podman/podman.sock &


Проверяем состояние контейнера:<syntaxhighlight lang="sh">
sudo podman ps
</syntaxhighlight>


vyos|vyos
Настраиваем контейнер:<syntaxhighlight lang="sh">
sudo podman cp /home/vyos/vpp.conf vpp:/config/vpp.conf
sudo podman restart vpp
</syntaxhighlight>


=== 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
              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</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
show interface address
</syntaxhighlight>Выполняем пинг до сетевухи на сервере Proxmox #20 и убеждаемся, что все работает:<blockquote>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


show acl-plugin acl
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