VYOS-VPP

Материал из EWiki
Перейти к навигации Перейти к поиску

Подготовка сервера с 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