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
。
したがって、質問は次のようになります。
systemd-networkd-wait-online
SocketCANインターフェースで使用することもできますか?- これが本当なら、私が何を間違っているのでしょうか?
- そうでない場合、
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
てから、実行してキャンリンクの状態を確認するのが当然ですnetworkctl
。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 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.