Відповіді:
Тестовано на 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.
Для довідки я використовую свіжу флеш-карту SD від Raspbian Buster Lite .
Я зверну увагу на безголову установку лише з ssh. Якщо ви користуєтесь цим, подвійно перевірте помилки друку або в іншому випадку ви втратите з розривом зв'язку. Якщо ви хочете встановити без голови, перегляньте SSH (Secure Shell) та дотримуйтесь розділу 3. Увімкніть SSH на безголовому Raspberry Pi (додайте файл на SD-карту на іншій машині) .
Вимкніть старий матеріал. Не зупиняйте жодної послуги, лише відключіть їх! Тож воно набере чинності лише при наступному завантаженні. Як це зробити, просто дотримуйтесь
Створіть цей файл із налаштуваннями. Ви можете просто скопіювати та вставити це в один блок у свій командний рядок, починаючи з 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
Створіть цей файл із налаштуваннями:
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 .
У вас повинні бути налаштовані і запущені інтерфейси, як описано вище. Немає проблем, коли обидва інтерфейсу налаштовані. Ядро спочатку використовуватиме інтерфейс із найнижчою метрикою . Тут спочатку буде використаний інтерфейс 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
DNS=192.168.1.1
до /etc/systemd/network/04-eth.network
. (Я використовую налаштування зі статичним IP-адресою)…
Щоб уточнити відповідь від @Ingo: будь ласка, подумайте про використання посилання
ln -s /run/systemd/resolve/stub-resolv.conf resolv.conf
замість посилання на /run/systemd/resolve/resolv.conf
. Це дозволяє "інтегрувати" заглушку DNS і дозволяє такі речі, як інтерфейс DNS-сервера, що може бути важливо, якщо ви використовуєте VPN, які надають власному серверу DNS непублічні записи.