Вопрос или проблема
Я хочу объединить сетевые интерфейсы двух телефонов на 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
должна решить вашу проблему.