VYOS-VPP: различия между версиями
Dima (обсуждение | вклад) Нет описания правки |
Dima (обсуждение | вклад) |
||
| (не показано 8 промежуточных версий 2 участников) | |||
| Строка 1: | Строка 1: | ||
== Подготовка сервера с 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 включен, для этого выполнить команду:<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 | |||
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</blockquote>Убеждаемся, что загружены модули ядра для VFIO:<syntaxhighlight lang="sh"> | ||
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) | |||
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</blockquote>Для обеих сетевух отвязываем их от текущего драйвера и привязываем к VFIO:<syntaxhighlight lang="sh"> | |||
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 | |||
</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) | |||
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</blockquote> | |||
'''Примечание:''' Также в выводе команды ip link интерфейсов eth0 и eth1 теперь не будет, так как они перешли под управление VFIO. | |||
=== 4. Запуск контейнера для VPP === | |||
Создаем сетевое пространство имен NGFW (нужно для корректного запуска контейнера): | |||
<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>'''Примечания:''' | |||
# Необходимо убедиться, что все монтируемые каталоги, а также образ и файл env, указанные в команде, лежат на своих местах. | |||
# В случае ошибки запуска (может ругаться на то, что контейнер VPP уже существует) следует добавить в команду параметр '''--replace''' | |||
Проверяем состояние контейнера:<syntaxhighlight lang="sh"> | |||
sudo podman ps | |||
</syntaxhighlight> | |||
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 | |||
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
Примечания:
- Необходимо убедиться, что все монтируемые каталоги, а также образ и файл env, указанные в команде, лежат на своих местах.
- В случае ошибки запуска (может ругаться на то, что контейнер 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