Як перейти від мережевої роботи до системної мережі з динамічним відмовою


14

Systemd systemd-networkdможна використовувати для заміни існуючої системи мереж на Raspbian.

Як це працює з Raspbian на Raspberry Pi з двома інтерфейсами для Ethernet та Wlan? Чи можу я також реалізувати для них динамічну відмову?

Відповіді:


28

Тестовано на Raspberry Pi 4B з
Raspbian Buster Lite 2020-02-13 оновлено 2020-04-11.
Оновлення, зроблені за допомогою sudo apt update && sudo apt full-upgrade && sudo reboot.

Це не буде працювати з Raspbian Stretch !
Тут ви знайдете останню перевірену версію для Raspbian Stretch Lite .


♦ Анотація

Використання systemd-networkdзамість замовчуванням dhcpcdце звичайно можливо. Але це не має сенсу у всіх випадках.

networkd - це невелика і художня послуга для налаштування мережевих інтерфейсів, розроблена здебільшого для випадків використання серверів у світі із гарячими підключеннями та віртуалізованими мережами. Його конфігурація схожа за духом та рівнем абстракції, як ifupdown, але вам не потрібні додаткові пакети для налаштування мостів, облігацій, vlan тощо. Це ще не дуже підходить для управління мережами WLAN; NetworkManager все ще набагато підходить для таких випадків використання настільних ПК. [1]

Але для рашипі, що лежить поруч із телевізором або підсилювачем, і він працює цілодобово для передачі аудіо чи відео чи для камери тощо systemd-networkd. Але вам доведеться зробити повний перемикач. Немає способу змішатись із networkingта / або dhcpcd. Зауважте також, що NetworkManager не підтримується програмою Raspbian.


♦ Крок 1: Підготовка

Для довідки я використовую свіжу флеш-карту SD від Raspbian Buster Lite .

Я зверну увагу на безголову установку лише з ssh. Якщо ви користуєтесь цим, подвійно перевірте помилки друку або в іншому випадку ви втратите з розривом зв'язку. Якщо ви хочете встановити без голови, перегляньте SSH (Secure Shell) та дотримуйтесь розділу 3. Увімкніть SSH на безголовому Raspberry Pi (додайте файл на SD-карту на іншій машині) .

Вимкніть старий матеріал. Не зупиняйте жодної послуги, лише відключіть їх! Тож воно набере чинності лише при наступному завантаженні. Як це зробити, просто дотримуйтесь


♦ Крок 2: Налаштування дротового інтерфейсу Ethernet (eth0)

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

pi@raspberrypi: ~$ sudo -Es   # if not already done
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

♦ Крок 3: Налаштування інтерфейсу wlan (wlan0)

Створіть цей файл із налаштуваннями:

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

Налаштування wpa_supplicant з цим файлом і настройками для country=, 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:~ $

Перезавантажтесь і удачі ;-)

Можливо, що RasPi отримує нові ip адреси, тому вам, можливо, доведеться подивитися на нього для наступного з'єднання з ssh .


♦ Крок 4: З'єднання провідного та Wi-Fi інтерфейсу для відмови

У вас повинні бути налаштовані і запущені інтерфейси, як описано вище. Немає проблем, коли обидва інтерфейсу налаштовані. Ядро спочатку використовуватиме інтерфейс із найнижчою метрикою . Тут спочатку буде використаний інтерфейс Ethernet. Але це має великий недолік. Як ви бачите, у ip -4 -brief addrкожного інтерфейсу є своя ip-адреса. Якщо ядро ​​перемикає інтерфейс через відсутність його, воно також використовує його нову вихідну ip-адресу. Це порушить будь-який встановлений стан TCP-зв’язку, наприклад, ssh, потокове передавання, сеанси входу тощо. Ви можете використовувати нове з'єднання зі зміненої ip-адреси джерела, але старі з'єднання застрягли. Це насправді не те, що ми хочемо.

Рішення цієї проблеми - зв’язування . Ми створюємо проміжний інтерфейс bond0, який не змінює його налаштування. Провідний та Wi-Fi інтерфейс переключиться на bond0.

Спочатку відключіть єдині мережеві файли Ethernet та Wifi:

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=bond
Kind=bond
[Bond]
Mode=active-backup
# primary slave is defined in *eth.network
MIIMonitorSec=500ms
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

Але це ще не вся історія. systemd-networkd перевіряє, чи всі інтерфейси готові, перш ніж приступити до послуг, що залежать від запуску. Зв'язавши, у нас є ведені інтерфейси (eth0, wlan0), які ніколи не сигналізують про те, що вони працюють. Єдиний інтерфейс зв'язку, який з'являється, якщо підключений хоча б один з його рабів. Тож перевірка провалиться з помилками та тривалим очікуванням на завантаження. Для управління цим вам потрібно змінити systemd-networkd-wait-online.service. Як це зробити, будь ласка, дотримуйтесь інструкцій за адресою

Якщо це закінчилося, саме час перезавантажити.

Можливо, що 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): 0
Down Delay (ms): 0

Slave Interface: eth0
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: dc:a6:32:4c:08:1b
Slave queue ID: 0

Slave Interface: wlan0
MII Status: up
Speed: Unknown
Duplex: Unknown
Link Failure Count: 1
Permanent HW addr: dc:a6:32:4c:08:1c
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 .


посилання:
[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 проектом).
goldilocks

Також застосовно до інших систем на базі Debian, які не обов'язково працюють на ARM :) Дякую за стисле пояснення.
TCB13

Це спрацьовувало на моїх напруженнях, але на межі я зіткнувся з проблемою, що мій пристрій не може вирішити будь-який домен. Будь-які ідеї, що може бути причиною?
user5950

@ user5950 Можливо, щось змінилося з Buster? Я на це погляну. Хвилину, будь ласка.
Інго

@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 непублічні записи.


Дуже цікаво, дякую за відгуки. Чи є документація та / або джерела цього? Якщо це так, відредагуйте свою відповідь (використовуючи посилання під нею) та додайте її туди.
Інго
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.