Не удается установить соединение горячезаменяемого интерфейса после отключения и повторного подключения последнего устройства.

Вопрос или проблема

Я хочу объединить сетевые интерфейсы двух телефонов на Android, подключенных через USB к Raspberry Pi 4. Таким образом, когда один человек уходит и забирает свой телефон, происходит автоматический переход на второй телефон без короткого прерывания, которое обычно возникает без объединения. Проблема в том, что объединенный сетевой интерфейс исчезает, когда я отключаю и снова подключаю последний телефон (и активирую USB-тетеринг снова).

Вот как я настроил объединенный интерфейс. Я использую systemd-networkd:

/etc/systemd/network/bond1.netdev

[NetDev]
Name=bond1
Description=Объединяет usb сетевые интерфейсы
Kind=bond

[Bond]
Mode=active-backup
MIIMonitorSec=100

/etc/systemd/network/bond1.network

[Match]
Name=usb*

[Network]
Bond=bond1

/etc/systemd/network/bond1-net.network

[Match]
Name=bond1

[Network]
DHCP=yes

Эта конфигурация, похоже, работает, пока хотя бы один usb сетевой интерфейс присутствует и не отключен/не переподключен. Как только я отключаю и снова подключаю (т.е. не при удалении) последний телефон и активирую USB-тетеринг, сетевой интерфейс usb0 снова появляется, и bond1 сразу же исчезает, и мне нужно перезапустить systemd-networkd, чтобы он снова появился.

После отключения всех объединенных usb сетевых интерфейсов ip link все еще показывает bond1:

5: bond1: <NO-CARRIER,BROADCAST,MULTICAST,MASTER,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000
    link/ether 4e:db:45:d2:25:c0 brd ff:ff:ff:ff:ff:ff

После переподключения и активации usb тетеринга bond1 исчезает, и dmesg сообщает:

[ 1345.285781] bond1: (slave usb0): делает интерфейс новым активным
[ 1345.286004] bond1: (slave usb0): Подключение в качестве активного интерфейса с работающей связью
[ 1346.647947] bond1: (slave usb0): Освобождение резервного интерфейса
[ 1346.682264] bond1 (отмена регистрации): Освобождены все дочерние интерфейсы

Сначала он снова добавляет usb интерфейс, но затем освобождает все интерфейсы и отменяет регистрацию bond1.

Затем я попытался найти решение и нашел следующие подсказки:

Добавьте эти строки в /etc/systemd/network/bond1.netdev

[NetDev]
Name=bond1
Kind=bond
Removable=no # Добавлено

[Bond]
Mode=active-backup
MiimonSec=100
PrimaryReselectPolicy=better # Добавлено
IgnoreCarrierLoss=1 # Добавлено

И добавьте правила udev для ручного повторного добавления usb интерфейсов:

SUBSYSTEM=="net", ACTION=="add", KERNEL=="usb0", RUN+="/usr/bin/ip link set usb0 master bond1"
SUBSYSTEM=="net", ACTION=="add", KERNEL=="usb1", RUN+="/usr/bin/ip link set usb1 master bond1"

Но это не помогает и не изменяет поведение. Кто-нибудь знает, что может помочь исправить эту проблему?

Ответ или решение

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

1. Измените параметры конфигурации для bond1.netdev

Попробуйте использовать следующие параметры:

[NetDev]
Name=bond1
Kind=bond
Removable=no
# Разрешаем работу с интерфейсами независимо от состояния канала
[Bond]
Mode=active-backup
MiimonSec=100
PrimaryReselectPolicy=better
IgnoreCarrierLoss=1

2. Установите скрипт для повторного добавления интерфейсов

Если usb0 и usb1 после переподключения не добавляются обратно в bond1, вы можете использовать udev для автоматизации этого процесса. Напишите udev правило, которое будет запрашивать добавление интерфейсов обратно в bond1.

Создайте файл /etc/udev/rules.d/99-bonding.rules со следующим содержимым:

SUBSYSTEM=="net", ACTION=="add", KERNEL=="usb[0-9]", RUN+="/usr/bin/ip link set $name master bond1"

Это правило будет автоматически добавлять вновь созданные интерфейсы usb0, usb1, и т.д., к bond1 при их появлении.

3. Перезагрузите systemd-networkd и udev

Убедитесь, что применены все новые правила:

sudo systemctl restart systemd-networkd
sudo udevadm control --reload-rules

4. Диагностика

После внесения изменений, выполните следующие команды для диагностики:

  • Отслеживайте dmesg на предмет сообщений об ошибках:

    dmesg | grep bond
  • Проверьте статус интерфейсов и наличие bond1:

    ip link show

5. Тестирование

Теперь проведите тестирование, отключите и снова подключите последнее USB-устройство, и проверьте, создается ли bond1 автоматически и встает ли он в состояние “up”.

Заключение

С вышеописанными изменениями интерфейс bond1 должен правильно восстанавливаться после переподключения USB-устройств. Если проблема все еще сохраняется, вы можете рассмотреть использование других методов управления объединением интерфейсов, таких как ifenslave, но, как правило, правильная настройка параметров systemd-networkd должна решить вашу проблему.

Оцените материал
Добавить комментарий

Капча загружается...