Bagaimana bermigrasi dari jaringan ke systemd-networkd dengan failover dinamis

14

Systemd's systemd-networkddapat digunakan untuk menggantikan sistem jaringan yang ada di Raspbian.

Bagaimana cara kerjanya dengan Raspbian pada Raspberry Pi dengan dua antarmuka untuk ethernet dan wlan? Bisakah saya menyadari kegagalan dinamis untuk mereka?

Ingo
sumber

Jawaban:

28

Diuji pada Raspberry Pi 4B dengan
Raspbian Buster Lite 2020-02-05 diperbarui pada 2020-02-13.
Raspbian Buster Lite 2019-07-10 diperbarui pada 2019-08-15.
Pembaruan dilakukan dengan sudo apt update && sudo apt full-upgrade && sudo reboot.

Ini tidak akan bekerja dengan Peregangan Raspbian !
Di sini Anda akan menemukan revisi teruji terakhir untuk Raspbian Stretch Lite .


Menggunakan systemd-networkdbukannya default dhcpcdtentu saja mungkin. Tapi itu tidak berarti dalam semua kasus.

networkd adalah layanan kecil dan ramping untuk mengkonfigurasi antarmuka jaringan, yang dirancang sebagian besar untuk kasus penggunaan server di dunia dengan jaringan hotplugged dan virtual. Konfigurasi ini serupa dalam tingkat semangat dan abstraksi dengan ifupdown, tetapi Anda tidak memerlukan paket tambahan untuk mengkonfigurasi bridge, bond, vlan dll. Ini belum cocok untuk mengelola WLAN; NetworkManager masih jauh lebih tepat untuk kasus penggunaan Desktop semacam itu. [1]

Tetapi untuk raspi yang berbaring dekat TV atau amplifier dan melakukan tugasnya 24/7 untuk streaming audio atau video atau untuk kamera dll, systemd-networkdadalah pilihan yang baik. Tetapi Anda harus melakukan pergantian lengkap. Tidak ada cara untuk berbaur dengan networkingdan / atau dhcpcd.


♦ Langkah 1: Persiapan

Untuk referensi saya menggunakan SD Card flash baru dari Raspbian Buster Lite 2019-07-10 .

Saya akan memperhatikan instalasi tanpa kepala hanya dengan ssh. Jika Anda menggunakan ini, periksa ulang salah ketik atau Anda akan kehilangan koneksi yang terputus. Jika Anda menginginkan instalasi tanpa kepala, lihat SSH (Secure Shell) dan ikuti bagian 3. Aktifkan SSH pada Raspberry Pi tanpa kepala (tambahkan file ke kartu SD pada mesin lain) .

Untuk pemecahan masalah saat shutdown atau untuk memeriksa pesan dari boot sebelumnya, Anda dapat mengaktifkan pencatatan jurnal journald untuk pesan dari systemd [1]. Karena menghasilkan file log besar dan tempat penyimpanan mungkin menjadi masalah, saya sarankan untuk mengaktifkannya hanya jika diperlukan. systemd-networkd tidak membutuhkannya dan pencatatan sesi saat ini selalu tersedia.

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

Nonaktifkan barang lama. Jangan hentikan layanan apa pun, cukup nonaktifkan saja! Jadi itu akan berlaku hanya pada boot berikutnya.

pi@raspberrypi: ~$ sudo -Es

Dalam /etc/resolvconf.confinsert garis-garis ini.

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

Kemudian nonaktifkan jaringan Debian klasik yang dikelola dengan file /etc/network/interfacesdan nonaktifkan dhcpcdmanajemen jaringan Raspbian default . Kami menutupinya sehingga dinonaktifkan sepenuhnya dan tidak dapat dimulai oleh layanan lain.

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

Dan aktifkan 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

♦ Langkah 2: Atur antarmuka ethernet kabel (eth0)

Buat file ini dengan pengaturan Anda. Anda bisa menyalin dan menempel ini dalam satu blok ke baris perintah Anda yang dimulai dengan catdan termasuk kedua EOF (pembatas EOF tidak akan mendapatkan bagian dari file):

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: ~$

Nyalakan kembali, tetapi hanya jika Anda memiliki kabel ethernet yang terpasang ;-)

Ada kemungkinan bahwa RasPi mendapatkan alamat ip baru sehingga Anda mungkin harus melihatnya untuk koneksi berikutnya dengan ssh .


♦ Langkah 3: Atur antarmuka wlan (wlan0)

Buat file ini dengan pengaturan Anda:

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:~ #

Pengaturan wpa_supplicant dengan file ini dan pengaturan untuk ssid=dan psk=dan mengaktifkannya:

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 [email protected]
root@raspberrypi:~ # rfkill unblock 0
root@raspberrypi:~ # exit
root@raspberrypi:~ $

Nyalakan kembali jika Anda memiliki koneksi wifi. Sebagian besar dari Anda akan memilikinya. Semoga berhasil ...

Ada kemungkinan bahwa RasPi mendapatkan alamat ip baru sehingga Anda mungkin harus melihatnya untuk koneksi berikutnya dengan ssh .


♦ Langkah 4: Ikatan antarmuka kabel dan wifi untuk failover

Anda harus mengatur dan menjalankan antarmuka seperti dijelaskan di atas. Tidak ada masalah saat kedua antarmuka aktif. Kernel akan menggunakan antarmuka dengan metrik terendah terlebih dahulu. Di sini antarmuka ethernet akan digunakan terlebih dahulu. Tetapi ini memiliki kerugian besar. Seperti yang Anda lihat dengan ~$ ip addrmasing - masing antarmuka memiliki alamat ip sendiri Jika kernel mengganti antarmuka karena ada yang turun, kernel tersebut juga menggunakan sumber ip-address baru. Ini akan memutus komunikasi TCP statefull yang sudah mapan, misalnya ssh, streaming, sesi login dan sebagainya. Anda dapat menggunakan koneksi baru dari alamat ip sumber yang diubah tetapi koneksi lama macet. Bukan itu yang kita inginkan.

Solusi dari masalah ini adalah ikatan . Kami membuat antarmuka sementara bond0yang tidak mengubah pengaturannya. Antarmuka berkabel dan wifi akan beralih ke bond0.

Pertama-tama nonaktifkan file jaringan ethernet dan wifi tunggal:

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~

Kemudian siapkan ikatan dengan empat file ini:

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:~ $

Sekarang saatnya untuk reboot.

Ada kemungkinan bahwa RasPi mendapatkan alamat ip baru sehingga Anda mungkin harus melihatnya untuk koneksi berikutnya dengan ssh.

Kemudian Anda dapat memeriksa status ikatan:

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

Ikatan uji: dengan status ikatan di atas Anda akan melihat bahwa Currently Active Slave:akan berubah dan MII Status:turun.

Jika Anda tidak memiliki kepala, jangan downkedua antarmuka bersama ;-)

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

Bersabarlah setelah mengatur wlan0 ke atas. Saya mungkin membutuhkan waktu untuk menghubungkan kembali ke router dan mengelola ikatan. Waktu sshini tidak akan berfungsi.

Untuk ulasan yang lebih mendalam tentang ikatan Anda mungkin melihat kegagalan jaringan Dinamis memprioritaskan wifi melalui ethernet .


♦ Langkah 5: Bersihkan

Bersihkan barang lama:

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


referensi:
[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

Ingo
sumber
Catatan berkaitan dengan kutipan pertama di bagian atas: Raspbian tidak pernah menggunakan NetworkManager. Ini lebih merupakan artefak dari Fedora dan sistem turunan (yang merupakan tempat pertama di mana systemd, sebuah proyek yang didukung Redhat, dikerahkan).
goldilocks
Juga berlaku untuk sistem berbasis Debian lain yang tidak harus berjalan dengan ARM :) Terima kasih atas penjelasannya yang ringkas.
TCB13
Ini bekerja untuk saya pada peregangan tetapi pada buster saya menemukan masalah, bahwa perangkat saya tidak dapat menyelesaikan domain apa pun. Ada ide apa yang bisa menjadi penyebabnya?
user5950
@ user5950 Mungkin ada yang berubah dengan buster? Saya akan melihatnya. Silakan tunggu sebentar.
Ingo
@Ingo Terima kasih atas ulangan cepatnya. Saya bisa menyelesaikan masalah dengan menambahkan baris DNS=192.168.1.1ke /etc/systemd/network/04-eth.network. (Saya menggunakan pengaturan dengan IP statis) ...
user5950
4

Untuk menguraikan jawaban dari @Ingo: harap pertimbangkan untuk menggunakan tautan

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

alih-alih tautan ke /run/systemd/resolve/resolv.conf. Hal ini memungkinkan rintisan DNS "terintegrasi" dan memungkinkan hal-hal seperti server DNS per-antarmuka yang bisa menjadi penting jika Anda menggunakan VPN yang menyediakan entri non-publik kepada server DNS mereka sendiri.

Robert James
sumber
Sangat menarik, terima kasih atas umpan baliknya. Apakah ada dokumentasi dan / atau sumber ini? Jika demikian silakan edit jawaban Anda (menggunakan tautan di bawahnya) dan tambahkan di sana.
Ingo