Как перейти с сети на systemd-networkd с динамическим переключением при сбое

14

Systemd systemd-networkdможно использовать для замены существующей сетевой системы на Raspbian.

Как это работает с Raspbian на Raspberry Pi с двумя интерфейсами для Ethernet и WLAN? Могу ли я реализовать динамическое аварийное переключение для них?

Инго
источник

Ответы:

28

Протестировано на Raspberry Pi 4B с
Raspbian Buster Lite 2020-02-05, обновлено 2020-02-13.
Raspbian Buster Lite 2019-07-10 обновлен 2019-08-15.
Обновления сделаны с sudo apt update && sudo apt full-upgrade && sudo reboot.

Это не будет работать с Raspbian Stretch !
Здесь вы найдете последнюю протестированную версию Raspbian Stretch Lite .


Использование systemd-networkdвместо значения по умолчанию, dhcpcdконечно, возможно. Но это не имеет смысла во всех случаях.

networkd - это небольшая и компактная служба для настройки сетевых интерфейсов, разработанная главным образом для случаев использования серверов в мире с горячим подключением и виртуализированной сетью. Его конфигурация похожа по духу и уровню абстракции на ifupdown, но вам не нужны дополнительные пакеты для настройки мостов, соединений, vlan и т. Д. Он пока не очень подходит для управления WLAN; NetworkManager все еще более подходит для таких случаев использования Desktop. [1]

Но для распи, лежащего рядом с телевизором или усилителем и выполняющего свою работу 24/7 для потокового аудио или видео или для камеры и т. Д., systemd-networkdЭто хороший выбор. Но вы должны сделать полный переход. Нет способа смешаться с networkingи / или dhcpcd.


♦ Шаг 1: подготовка

Для справки я использую обновленную SD-карту Raspbian Buster Lite 2019-07-10 .

Я буду обращать внимание на безголовую установку только с помощью ssh. Если вы используете это, дважды проверьте опечатки или около того, иначе вы потерялись с разорванным соединением. Если вы хотите установить устройство без монитора, посмотрите на SSH (Secure Shell) и следуйте разделу 3. Включите SSH на автономном Raspberry Pi (добавьте файл на SD-карту на другом компьютере) .

Для устранения неполадок при завершении работы или для проверки сообщений от предыдущих загрузок вы можете включить постоянную регистрацию в journald для сообщений от systemd [1]. Поскольку он создает большие файлы журналов и место для хранения может быть проблемой, я предлагаю включить его только при необходимости. systemd-networkd не нуждается в этом, и регистрация текущего сеанса всегда доступна.

pi@raspberrypi: ~$ sudo mkdir -p /var/log/journal
pi@raspberrypi: ~$ sudo systemd-tmpfiles --create --prefix /var/log/journal

Отключить старые вещи. Не останавливайте никакую услугу, только отключите их! Так что это вступит в силу только при следующей загрузке.

pi@raspberrypi: ~$ sudo -Es

В /etc/resolvconf.confвставки этих строк.

# Set to NO to disable resolvconf from running any subscribers. Defaults to YES.
resolvconf=NO

Затем отключите классическую сеть Debian, которая управляется с помощью файла, /etc/network/interfacesи отключите dhcpcdуправление сетью Raspbian по умолчанию . Мы маскируем его, чтобы они были полностью отключены и не могли быть запущены другими службами.

root@raspberrypi: ~# systemctl mask networking.service
root@raspberrypi: ~# mv /etc/network/interfaces /etc/network/interfaces~
root@raspberrypi: ~# systemctl mask dhcpcd.service

И включите systemd-networkd:

root@raspberrypi: ~# systemctl enable systemd-networkd.service
root@raspberrypi: ~# systemctl enable systemd-resolved.service
root@raspberrypi: ~# ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

♦ Шаг 2. Настройка проводного интерфейса Ethernet (eth0).

Создайте этот файл с вашими настройками. Вы можете просто скопировать и вставить это в одном блоке в вашу командную строку, начиная с catEOF и включая оба (разделитель EOF не получит часть файла):

root@raspberrypi: ~# cat >/etc/systemd/network/04-eth.network <<EOF
[Match]
Name=e*
[Network]
# to use static IP (with your settings) toggle commenting the next 8 lines.
#Address=192.168.50.60/24
#DNS=84.200.69.80 1.1.1.1
#[Route]
#Gateway=192.168.50.1
#Metric=10
DHCP=yes
[DHCP]
RouteMetric=10
EOF

root@raspberrypi: ~# exit
pi@raspberrypi: ~$

Перезагрузите компьютер, но только если у вас есть сетевой шнур ;-)

Вполне возможно, что RasPi получит новый IP-адрес, поэтому вам, возможно, придется посмотреть его для следующего соединения с ssh .


♦ Шаг 3. Настройка интерфейса WLAN (wlan0).

Создайте этот файл с вашими настройками:

pi@raspberrypi:~ $ sudo -Es
root@raspberrypi:~ # cat >/etc/systemd/network/08-wifi.network <<EOF
[Match]
Name=wl*
[Network]
# to use static IP (with your settings) toggle commenting the next 8 lines.
#Address=192.168.50.61/24
#DNS=84.200.69.80 1.1.1.1
#[Route]
#Gateway=192.168.50.1
#Metric=20
DHCP=yes
[DHCP]
RouteMetric=20
EOF

root@raspberrypi:~ #

Настройка wpa_supplicant с этим файлом и ваши настройки ssid=и psk=и включить его:

root@raspberrypi:~ # cat >/etc/wpa_supplicant/wpa_supplicant-wlan0.conf <<EOF
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=DE

network={
    ssid="TestNet"
    psk="realyNotMyPassword"
    key_mgmt=WPA-PSK
    proto=RSN WPA
}
EOF

root@raspberrypi:~ # chmod 600 /etc/wpa_supplicant/wpa_supplicant-wlan0.conf
root@raspberrypi:~ # systemctl disable wpa_supplicant.service
root@raspberrypi:~ # systemctl enable wpa_supplicant@wlan0.service
root@raspberrypi:~ # rfkill unblock 0
root@raspberrypi:~ # exit
root@raspberrypi:~ $

Перезагрузитесь, если у вас есть подключение к Wi-Fi. Большинство из вас будет иметь. Удачи ...

Вполне возможно, что RasPi получит новый IP-адрес, поэтому вам, возможно, придется посмотреть его для следующего соединения с ssh .


♦ Шаг 4. Соединение проводного и Wi-Fi интерфейса для аварийного переключения.

Вы должны настроить и запустить оба интерфейса, как описано выше. Это не проблема, когда оба интерфейса работают. Сначала ядро будет использовать интерфейс с самой низкой метрикой . Здесь интерфейс Ethernet будет использоваться в первую очередь. Но это имеет большой недостаток. Как видите, у ~$ ip addrкаждого интерфейса есть свой IP-адрес. Если ядро ​​переключает интерфейс из-за отказа, оно также использует свой новый IP-адрес источника. Это нарушит любую установленную TCP-связь с состоянием, например, ssh, потоковую передачу, сеансы входа в систему и так далее. Вы можете использовать новое соединение с измененного исходного IP-адреса, но старые соединения застряли. Это не совсем то, что мы хотим.

Решением этой проблемы является склеивание . Мы создаем временный интерфейс bond0, который не меняет своих настроек. Проводной и Wi-Fi интерфейс переключится на bond0.

Сначала отключите отдельные файлы сети Ethernet и Wi-Fi:

pi@raspberrypi:~ $ sudo -Es
root@raspberrypi:~ # cd /etc/systemd/network/
root@raspberrypi:~ # mv 04-eth.network 04-eth.network~
root@raspberrypi:~ # mv 08-wifi.network 08-wifi.network~

Затем настройте связь с этими четырьмя файлами:

root@raspberrypi:~ # cat >/etc/systemd/network/02-bond0.netdev <<EOF
[NetDev]
# status: cat /proc/net/bonding/bond0
Name=bond0
Kind=bond
[Bond]
Mode=active-backup
# primary slave is defined in *eth.network
MIIMonitorSec=500ms
UpDelaySec=1000ms
DownDelaySec=1000ms
MinLinks=1
EOF

root@raspberrypi:~ # cat >/etc/systemd/network/12-bond0-add-eth.network <<EOF
[Match]
Name=e*
[Network]
Bond=bond0
PrimarySlave=yes
EOF

root@raspberrypi:~ # cat >/etc/systemd/network/16-bond0-add-wifi.network <<EOF
[Match]
Name=wl*
[Network]
Bond=bond0
EOF

root@raspberrypi:~ # cat >/etc/systemd/network/20-bond0-up.network <<EOF
[Match]
Name=bond0
[Network]
# to use static IP (with your settings) toggle commenting the next 4 lines.
DHCP=yes
#Address=192.168.50.60/24
#Gateway=192.168.50.1
#DNS=84.200.69.80 1.1.1.1
EOF

root@raspberrypi:~ # exit
pi@raspberrypi:~ $

Теперь пришло время перезагрузки.

Вполне возможно, что RasPi получит новый IP-адрес, поэтому вам, возможно, придется посмотреть его для следующего соединения с ssh.

Затем вы можете проверить статус склеивания:

pi@raspberrypi:~ $ cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: fault-tolerance (active-backup)
Primary Slave: eth0 (primary_reselect always)
Currently Active Slave: eth0
MII Status: up
MII Polling Interval (ms): 500
Up Delay (ms): 1000
Down Delay (ms): 1000

Slave Interface: eth0
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: b8:27:eb:53:bd:de
Slave queue ID: 0

Slave Interface: wlan0
MII Status: up
Speed: Unknown
Duplex: Unknown
Link Failure Count: 0
Permanent HW addr: b8:27:eb:06:e8:8b
Slave queue ID: 0

Тестовое соединение: со статусом соединения выше вы увидите, что Currently Active Slave:будет меняться, а MII Status:вниз -.

Если вы без головы, не используйте downоба интерфейса вместе ;-)

pi@raspberrypi:~ $ ip addr
pi@raspberrypi:~ $ sudo ip link set eth0 down
pi@raspberrypi:~ $ sudo ip link set eth0 up
pi@raspberrypi:~ $ sudo ip link set wlan0 down
pi@raspberrypi:~ $ sudo ip link set wlan0 up

Будьте терпеливы после установки wlan0. Мне может потребоваться некоторое время, чтобы повторно подключиться к маршрутизатору и управлять связыванием. На этот раз sshне сработает.

Для более глубокого обзора связывания вы можете взглянуть на динамическое переключение при сбое сети с приоритетом Wi-Fi через Ethernet .


♦ Шаг 5: очистить

Очистить старые вещи:

pi@raspberrypi:~ $ sudo apt --autoremove purge openresolv
pi@raspberrypi:~ $ sudo apt --autoremove purge ifupdown
pi@raspberrypi:~ $ sudo apt --autoremove purge dhcpcd5
pi@raspberrypi:~ $ sudo apt --autoremove purge isc-dhcp-client isc-dhcp-common


ссылки:
[1] /usr/share/doc/systemd/README.Debian.gz
[2] man systemd.netdev
[3] man systemd.network
[4] https://wiki.debian.org/Bonding
[5] https://www.kernel.org/doc/Documentation/networking/bonding.txt

Инго
источник
Обратите внимание на первую цитату вверху: Raspbian никогда не использовал NetworkManager. Это скорее артефакт Fedora и производных систем (это было первое место, где был развернут systemd, проект с поддержкой Redhat).
Златовласка
Также применимо к другим системам на основе Debian, не обязательно работающим на ARM :) Спасибо за краткое объяснение.
TCB13
Это работало для меня на растяжку, но на Buster я столкнулся с проблемой, что мое устройство не может разрешить любой домен. Есть идеи, что может быть причиной?
user5950
@ user5950 Может, что-то изменилось с Бастером? Я посмотрю на это. Минуту, пожалуйста.
Инго
@Ingo Спасибо за быстрое воспроизведение. Я мог бы решить проблему, добавив строку DNS=192.168.1.1в /etc/systemd/network/04-eth.network. (Я использую настройку со статическим IP) ...
user5950
4

Чтобы уточнить ответ от @Ingo: рассмотрите возможность использования ссылки.

ln -s /run/systemd/resolve/stub-resolv.conf resolv.conf

вместо ссылки на /run/systemd/resolve/resolv.conf. Это включает «интегрированную» заглушку DNS и включает такие вещи, как DNS-сервер для интерфейса, что может быть важно, если вы используете VPN, которые предоставляют свой DNS-сервер непубличными записями.

Роберт Джеймс
источник
Очень интересно, спасибо за отзыв. Есть ли какая-либо документация и / или источники этого? Если это так, пожалуйста, отредактируйте свой ответ (используя ссылку под ним) и добавьте его туда.
Инго