Резервирование сети (bonding, ifensklave)

Есть необходимость организовать резервирование сети, но при этом оставить один ip адрес на 2 порта. Настраивал такое на обычных компьютерах с 2 портами Ethernet (Bonding). А на контроллере будто это нельзя сделать, хотя в репозитории доступен пакет для этого метода:

ifenslave/stable 2.9 all
  configure network interfaces for parallel routing (bonding)

Как на Wirenboard настроить резервирование сетевых портов методом паралельной маршрутизации (bonding)? Может нужно что-то ещё докачать не через репозитории?

Здравствуйте!
Как я понимаю, для этого нужен модуль ядра bonding: Linux bonding — объединение сетевых интерфейсов в Linux | Админия
То есть нужно пересобрать ядро с этим модулем: Сборка ядра Linux — Wiren Board. Ну и также потребуется утилита ifenslave.

Утилиту в стандартных репозиториях я видел, а вот модуля в стандартной прошивке нету. Но вы сейчас дали мне большую подсказку. Я в сборку ядер очень плохо понимаю, но попробую разобраться как сделать это.

Собрал согласно инструкции новое ядро, преждевременно настроил в menuconfig опцию "[] Bonding driver support". Собрался deb образ linux-image на основе кастомных настроек. Поместил в контроллер WB6. Установил командой dpkg -i linux-image.deb. Перезапустил. НО! При вводе команда lsmod модуль bonding всё равно отсутствует. Что я сделал не так?

lsmod выводт загруженные модули. Для того чтобы загрузить еще один нужно использовать modprobe <имя>
Ну или он “сам” загрузится при необходимости, то есть если будет использоваться его функционал.

Ввёл команду modprobe bonding, команда выполнилась без вывода какой либо информации, сделал перезапуск и всё равно модуль не виден командами lsmod и modinfo bonding. Есть способ проверить содержание собранного ядра, что бы убедиться если там вообще bonding. Я уже содержимое imx6_wirenboard_defconfig подменил , что бы и там и в .config была опция “CONFIG_BONDING=y” и пересобирал ядро, но безрезультатно.

То есть без ошибок.

Перезапуск чего?
Чем (где) модуль должен подгружаться? Он сконфигурирован в /etc/modprobe.d/ или /etc/modules?
Установлен ли ifenslave или аналог?

Как правило файлы модулей лежат в /lib/modules/`uname -r`/
И запущено именно на собранное ядро, не на штатном?
Вообще - вопрос именно общий OS, прямого отношения именно к контроллеру не имеющий.

Интересное замечание. Вскрыл deb пакет и поискал по нужному пути модуль, но там даже папки не оказалось с именем bonding. При сборке ядра ещё ввёл команды
“make KBUILD_OUTPUT=.build-wb6 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage dtbs modules -j4” и “find . -name ‘bonding.ko’”. Поиск не дал результатов, что наводит на мысль, что модуль даже не добавляется при сборке. Поэтому на контроллере его нету.

Дело вроде продвинулось, я понял в чём проблема. При конфигурации CONFIG_BONDING=y модуль интегрируется в ядро без файла bonding.ko. Поставил в конфиге CONFIG_BONDING=m, в таком случае уже видел модуль bonding.ko и информация отображается о модуле при команде modinfo bonding. Продолжу инструкцию и отпишу результат.

Инструкция настройки Bonding

Объединение сетевых карт в Linux можно осуществить с помощью драйвера bonding, он предоставляет методы для агрегирования нескольких сетевых интерфейсов в один логический. Поведение связанных интерфейсов зависит от режима. В общем случае, объединенные интерфейсы могут работать в режиме горячего резерва (отказоустойчивости) или в режиме балансировки нагрузки.

1 Сборка ядра Linux
Я собирал на облачной машине oracle ubuntu архитекруры aarch64

1.1 Подготовка сборочной машины
Для сборки ядра понадобится установить пакеты с необходимым для сборки ПО:
$sudo apt update && sudo apt install build-essential libncurses5-dev fakeroot lzop bc git
Если вы собираете ядро для Wiren Board 6 и новее, нужно установить компилятор для arm-linux-gnueabihf:
$sudo apt install gcc-arm-linux-gnueabihf

1.2 Получение исходного кода
Исходный код ядра Linux с правками от команды Wiren Board хранится в репозитории на Github. Чтобы получить его на свой компьютер, выполните команды:
$sudo git clone https://github.com/wirenboard/linux
$cd linux
$sudo git submodule update --init --recursive

1.3 Настройка ядра
Конфигурация по-умолчанюи при этом берётся из файлов в arch/arm/configs/, например imx6_wirenboard_defconfig.
Чтобы поменять конфигурацию, запустите make с необходимыми параметрами:
$sudo make KBUILD_OUTPUT=.build-wb6 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

В секци «Devices Drivers»/«Network device support» выбрать «Bonding driver support» (В скобочкаж должна появиться буква [M]).
Сохраните файл настроек как .config, выйдите из меню конфигураций.

1.4 Сборка
$sudo make mrproper
$sudo KERNEL_FLAVOUR=wb6 ./scripts/package/wb/do_build_deb.sh
При сборке программа задаст вопрос:
#Use wirenboard7_defconfig instead? (y/N)
Ответье клавишей “N”, чтобы использовать новую конфигурацию, вместо конфигурации по-умолчанию.
После сборки в корне появятся файлы пакетов (пример для Wiren Board 6):

linux-image-wb6*.deb - образ ядра, модули и dtbs;
linux-headers-wb6*.deb - нужен для разработки
linux-libc-dev*.deb - нужен для разработки
На контроллер достаточно скопировать файл пакета linux-image-wb6, в нём уже содержится всё необходимое.

1.5 Скопируйте Linux-image*.deb на WB6
Любым способом скопируйте linux-image-wb6*.deb в /root и введите команды
$dpkg -i linux-image-wb6*.deb
$reboot
Установка нового ядра завершена.
Можно убедиться в наличии модуля командой
$ modinfo bonding
filename: /lib/modules/5.13.0-1036-oracle/kernel/drivers/net/bonding/bonding.ko
author: Thomas Davis, tadavis@lbl.gov and many others
description: Ethernet Channel Bonding Driver
license: GPL
alias: rtnl-link-bond
srcversion: 3295908B5F7C79DD4B98336
depends: tls
intree: Y
name: bonding
vermagic: 5.13.0-1036-oracle SMP mod_unload modversions aarch64
sig_id: PKCS#7
signer: Build time autogenerated kernel key
sig_key: 70:EB:8F:07:FC:E5:2E:6D:98:5E:C0:76:6A:5E:9E:ED:E5:E5:97:13
sig_hashalgo: sha512

2 Настройка Bonding на WB6
Чтобы использовать объединение каналов для повышения надежности сделайте следующее. Для настройки понадобится доступ в интернет.
2.1. Установите пакет ifenslave
$apt install ifenslave

2.2. Создайте файл /etc/modprobe.d/bonding.conf командой:
$nano /etc/modprobe.d/bonding.conf
Запишите следующее содержимое:
alias bond0 bonding
options bonding mode=0 miimon=100 downdelay=200 updelay=200
Сохраните файл клавишами Сtrl+X

2.3. Запустите драйвер командами:

$modprobe -v bonding mode=5 miimon=100 downdelay=200 updelay=200
$tail -f /var/log/messages
$ifconfig bond0

2.4. Откройте файл /etc/network/interfaces
$nano /etc/network/interfaces
Запишите следующее содержимое в место старых конфигураций eth0 и eth1:
auto bond0
iface bond0 inet static
address 192.168.0.18
netmask 255.255.255.0
bond-mode balance-rr
bond-miimon 100
bond-downdelay 200
bond-updelay 200
slaves eth0 eth1
Сохраните файл.
2.5 перезапустите службу сети:
$/etc/init.d/networking restart

2.6 Чтобы проверить статус соединения, выполните команду:
$cat /proc/net/bonding/bond0
Готово!

1 лайк

Благодарю, отличное описание. Можно статью в Вики делать…

Эта тема была автоматически закрыта через 7 дней после последнего ответа. В ней больше нельзя отвечать.