Systemd-networkd-wait-onlineがSocketCANインターフェイスで失敗する

Systemd-networkd-wait-onlineがSocketCANインターフェイスで失敗する

can0私は(Confirmed worksを使って)SocketCANインターフェースを設定しましたcan-utils。起動時にインターフェイスを表示する.networkための次の設定ファイルがあります。systemd-networkd

#/etc/systemd/network/80-can.network
[Match]
Name=can0

[CAN]
BitRate=250K
RestartSec=100ms

[Link]
Unmanaged=no
RequiredForOnline=yes

起動後にインターフェイスが動作することがわかります(UPフラグ設定を参照)。

$ ip link show can0
5: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UP mode DEFAULT group default qlen 65536
    link/can

または

$ ifconfig can0
can0: flags=193<UP,RUNNING,NOARP>  mtu 16
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 65536  (UNSPEC)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

systemd-networkdネットワークの起動後にワンタイムサービスを実行したいと思います。一部の検索では、systemd-networkd-wait-onlineフラグを渡すようにサービスを変更する必要があると提案していましたが-i [interface]、そうしました。

$ sudo systemctl edit systemd-networkd-wait-online
#/etc/systemd/system/systemd-networkd-wait-online.service.d/override.conf
[Service]
ExecStart=
ExecStart=/lib/systemd/systemd-networkd-wait-online -i can0 --timeout=5

私のカスタムサービスで私が使用する

[Unit]
...
After=systemd-networkd-wait-online.service
Requires=systemd-networkd-wait-online.service

ただし、systemd-networkd-wait-online起動時に失敗し、コマンドのみを実行すると、タイムアウト後に失敗します。

$ /lib/systemd/systemd-networkd-wait-online -i can0 --timeout=5
Event loop failed: Connection timed out

比較すると、pass時に「即時」成功します-i eth0

したがって、質問は次のようになります。

  1. systemd-networkd-wait-onlineSocketCANインターフェースで使用することもできますか?
  2. これが本当なら、私が何を間違っているのでしょうか?
  3. そうでない場合、systemd-networkdインターフェイスの起動後に特定の時点でサービスをトリガする機能的な方法は何ですか?

ベストアンサー1

警告する:以下のソリューションは、「-backports」パッケージを使用してsystemdをアップグレードします。これは重要なソフトウェアであり、これらの変更を直接適用した後は、デバイスを再フラッシュせずにデバイスを再起動することはできません。現在実行されている操作によって引き起こされる可能性のある結果を修正/修復する方法がわかっている場合にのみ、この手順を実行してください。

私はこの質問に対する答えを見つけたと思います。関連性があると思われるシステムソースコードを読んだ後(https://github.com/systemd/systemd/blob/v241/src/network/networkd-link.c)これは、Debianバスターファミリ(Debian 10)の最新の安定リリースであるsystemd v241のバグが原因であるようです。

systemd v241では、リンクが「保留中」状態から離れないことがあります。systemd-networkd-wait-onlineこれにより、マネージド缶インターフェイスが「設定済み」状態に達するのを待つと、一貫したタイムアウトが発生します。これが実際に同じ問題であることを確認するには、まずsystemdバージョンが241(systemd --version)であることを確認しSETUPてから、実行してキャンリンクの状態を確認するのが当然ですnetworkctlpending缶リンクが正しく設定され、正しく機能している場合にも表示されます。

$ networkctl
IDX LINK             TYPE               OPERATIONAL SETUP
  1 lo               loopback           carrier     unmanaged
  2 eth0             ether              routable    configured
  3 eth1             ether              no-carrier  unmanaged
  4 pileft           ether              no-carrier  unmanaged
  5 can0             n/a                carrier     pending

Debian 10を使用している場合、私が見つけた解決策は、Buster-backportsパッケージで利用可能なv247.3にsystemdをアップグレードすることです。次の行を追加してください/etc/apt/sources.list

deb http://deb.debian.org/debian buster-backports main

ここにいくつかのキーを追加する必要があります。

$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 0E98404D386FA1D9 6ED0E7B82643E131

次に、バスターバックポートからsystemdをアップグレードします。

$ sudo apt update
$ sudo apt install systemd/buster-backports

systemd --versionアップグレード後、systemd バージョンが 247( ) に変更されたことを確認し、networkctl再度実行してください。次に、canリンクをconfigured(ではないpending)として正しく認識する必要があります。

$ networkctl
IDX LINK   TYPE     OPERATIONAL SETUP
  1 lo     loopback carrier     unmanaged
  2 eth0   ether    routable    configured
  3 eth1   ether    no-carrier  unmanaged
  4 pileft ether    no-carrier  unmanaged
  5 can0   can      carrier     configured

これによりsystemd-networkd-wait-online、サービスを再起動してもタイムアウトエラーメッセージが表示されなくなります。

$ sudo systemctl restart systemd-networkd-wait-online
$ systemctl status systemd-networkd-wait-online
● systemd-networkd-wait-online.service - Wait for Network to be Configured
 Loaded: loaded (/lib/systemd/system/systemd-networkd-wait-online.service; enabled; vendor preset: disabled)
 Active: active (exited) since Thu 2023-09-07 00:17:41 CEST; 1s ago
   Docs: man:systemd-networkd-wait-online.service(8)
Process: 5824 ExecStart=/lib/systemd/systemd-networkd-wait-online (code=exited, status=0/SUCCESS)
Main PID: 5824 (code=exited, status=0/SUCCESS)

Sep 07 00:17:41 systemd[1]: Starting Wait for Network to be Configured...
Sep 07 00:17:41 systemd[1]: Finished Wait for Network to be Configured.

おすすめ記事