動的フェイルオーバーでネットワークからsystemd-networkdに移行する方法


13

Systemdはsystemd-networkd、Raspbianの既存のネットワークシステムを置き換えるために使用できます。

イーサネットとwlanの2つのインターフェースを持つRaspberry Pi上のRaspbianでどのように機能しますか?それらの動的フェイルオーバーも実現できますか?

回答:


27


2020-02-13に更新されたRaspbian Buster Lite 2020-02-05を備えたRaspberry Pi 4Bでテストされています。
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は、このようなデスクトップの使用例にはさらに適切です。[1]

しかし、テレビやアンプの近くにあるraspiで、オーディオやビデオのストリーミング、カメラなどの作業を24時間年中無休で行うのsystemd-networkdは、良い選択です。ただし、完全な切り替えを行う必要があります。networkingおよび/またはと混同する方法はありませんdhcpcd


♦ステップ1:準備

参考までに、Raspbian Buster Lite 2019-07-10のフラッシュされたSDカードを使用します。

sshのみのヘッドレスインストールに注目します。これを使用している場合は、タイプミスを再確認してください。そうでない場合、接続が切断されて失われます。ヘッドレスインストールが必要な場合は、SSH(セキュアシェル)を参照し、セクション3.ヘッドレスRaspberry PiでSSHを有効にします(別のマシンのSDカードにファイルを追加します)

シャットダウン時のトラブルシューティング、または以前の起動からのメッセージを確認するには、systemd [1]からのメッセージについて、journaldで永続的なロギングを有効にすることができます。大きなログファイルと保存場所が生成されるため、必要な場合にのみ有効にすることをお勧めします。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

次に、ファイル/etc/network/interfacesで管理されている従来のDebianネットワークを無効にし、デフォルトのRaspbian dhcpcdネットワーク管理を無効にします。完全に無効になり、他のサービスから開始できないようにマスクします。

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:有線イーサネットインターフェイス(eth0)をセットアップする

このファイルを設定で作成します。これを1つのブロックにコピーしてコマンドラインに貼り付けるだけでcat、両方のEOFを含めて含めることができます(区切り文字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インターフェースの結合

上記のように、両方のインターフェースをセットアップして実行する必要があります。両方のインターフェイスがアップしている場合は問題ありません。カーネルは、メトリックが最も低いインターフェイスを最初に使用します。ここでは、イーサネットインターフェイスが最初に使用されます。しかし、これには大きな欠点があります。ご覧のとおり、~$ ip addr各インターフェースには独自のIPアドレスがあります。カーネルがダウンしたためにカーネルがインターフェースを切り替える場合、新しいソースIPアドレスも使用します。これにより、ssh、ストリーミング、ログインセッションなどの確立されたステートフルTCP通信が切断されます。変更されたソースIPアドレスから新しい接続を使用できますが、古い接続はスタックしています。それは私たちが本当に望んでいることではありません。

この問題の解決策は結合です。bond0設定を変更しない暫定インターフェースを作成します。有線とwifiのインターフェースがに切り替わりますbond0

最初に、単一のイーサネットと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~

次に、これらの4つのファイルを使用してボンディングをセットアップします。

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は動作しません。

ボンディングの詳細については、動的ネットワークフェイルオーバーでイーサネットよりもwifiを優先するをご覧ください。


♦ステップ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サポートプロジェクト)が最初にデプロイされた場所です)。
ゴルディロックス

必ずしもARMで実行されていない他のDebianベースのシステムにも適用できます:)簡潔な説明をありがとうございます。
TCB13

これは私のストレッチでうまくいきましたが、バスターで私のデバイスがドメインを解決できないという問題に遭遇しました。原因は何でしょうか?
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サーバーなどが有効になります。


非常に興味深いです。フィードバックをありがとうございます。これのドキュメントやソースはありますか?もしそうなら、あなたの答えを編集し(その下のリンクを使用して)、そこに追加してください。
Ingo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.