Debian systemd network-online.targetが機能していませんか?


24

Debian Jessieでsystemdサービスを作成しようとしています。network-online.target到達した後に開始する必要があります。

問題はnetwork-online.target、同時に起動されnetwork.target、その時点でインターフェイスがまだ構成されておらず、DHCPクエリを開始しただけです。

この問題はレガシーネットワーク設定を使用しているため、Debianに特有の問題のようです。

この問題を回避する方法、または機能させる方法はnetwork-online.target


の出力はsystemctl list-dependencies network-online.target何ですか?また、network-online.target必ずしも必要ではない可能性があるため、インターネットにアクセスできることに注意してください。詳細については、このページを参照しください。
saiarcot895

コマンドの出力は次のとおりnetwork-online.target ● └─systemd-networkd-wait-online.service です。そのページはすでに読んでおり、基本的な概念は理解していますが、ネットワーククリティカルサービスを開始できるポイントが定義されていないことは非常に奇妙です。少なくとも、適切なDHCP割り当てを待つことができます。
10robinho

これは、準備ができているということnetwork-online.targetだけに依存することを意味しsystemd-networkd-wait-online.serviceます。NetworkManagerが準備ができていると言ったり、ifupすべてのリンクが正常に起動したことを確認したりする必要はありません(その方法を使用してネットワークを構成する場合)。一方、UbuntuはifupNetworkManagerに依存していsystemd-networkd-wait-online.ますが、ではありません。
saiarcot895

ネットワークをどのように設定していますか:/etc/network/interfacessystemd .networkファイル、またはNetworkManager?
saiarcot895

あなたは正しいです、network-online.targetそしてnetwork.target直後にトリガーされifupます。私はデフォルトのdebianを使用しているため/etc/network/interfaces、dhcpアドレスを使用します。networkdの方がより良い解決策のように見えますが、実装するのは簡単ではありません。
10robinho

回答:


18

を使用/etc/network/interfacesしているため、各インターフェイスのステータスを監視するにはsystemdサービスが必要です。/lib/systemd/system/ifup-wait-all-auto.serviceifupdownUbuntu 15.04のパッケージによってインストールされている)かどうかを確認します。そうでない場合は、を作成/etc/systemd/system/ifup-wait-all-auto.serviceし、次の場所に貼り付けます。

[Unit]
Description=Wait for all "auto" /etc/network/interfaces to be up for network-online.target
Documentation=man:interfaces(5) man:ifup(8)
DefaultDependencies=no
After=local-fs.target
Before=network-online.target

[Service]
Type=oneshot
RemainAfterExit=yes
TimeoutStartSec=2min
ExecStart=/bin/sh -ec '\
  for i in $(ifquery --list --exclude lo --allow auto); do INTERFACES="$INTERFACES$i "; done; \
  [ -n "$INTERFACES" ] || exit 0; \
  while ! ifquery --state $INTERFACES >/dev/null; do sleep 1; done; \
  for i in $INTERFACES; do while [ -e /run/network/ifup-$i.pid ]; do sleep 0.2; done; done'

[Install]
WantedBy=network-online.target

これは、Ubuntu 15.04システムに存在するサービスファイルですが[Install]、少し簡単にするためにセクションが追加されています。ifupUbuntu 15.04の動作がifupDebian Jessieの動作と同じであることを期待しています。そうでない場合は、いくつかの変更が必要になります(特に最後の行で)。

次に、を実行しsudo systemctl enable ifup-wait-all-auto.serviceます。コンピューターを再起動したnetwork-online.target後、インターフェイスが(少なくとも)起動した後に到達することを確認する必要があります。


努力していただき、今すぐ試してみましょう。フィードバックをお送りします
10robinho

私はわずかに変更されたバージョンを実行することになりましたExecStart = /bin/bash -c 'while [ -z "$(hostname -I)" ]; do sleep 1; done;'hostnameIPアドレスが割り当てられているかどうかを確認することに依存します。
luka5z

スピンドクターそれをしようとしないでください。彼が/ etc / network / interfacesを使用しているからではありません。systemdは非常にずさんで、作成された問題を解決するのではなく、作業がすべてのユーザーにオフロードされるためです。
フロリアンハイグル

1
fwiw、バージョンでifup-wait-all-auto.service削除されました:”ドロップifup-wait-all-auto.service。これは、network-online.target Wants = networking.serviceを直接作成することにより、よりエレガントに実装されました。 " [changelog ] ifupdown0.8.5ubuntu1
-myrdd

0

注意!Raspbian Jessieでそれを理解しただけです。/etc/networkインターフェースのコメント行をすべて削除すれば動作します!それは構文解析のバグのようです=)私の特定のケースではコメントiface eth0 inet dhcpを残し、何年も前にそれを忘れましたが、Raspbian Jessieにアップグレードしてカーネルを再構築した後、非常に奇妙な動作をしました:DHCPを使用し、拒否しました/ etc / network / interfacesからチューニングを行います。だから私はコメントからそれを取り除いた-ちょうど作業行、再起動-そしてそれは動作します!スクリプトのパッチング/編集は不要です!


興味深いことに、私はこれを試してみる必要があります。それはあまり意味がありませんが:)
10robinho

2
これに関する参考資料はありますか?バグレポートを読み、バグのあるコードを確認したいと思います。
ʇsәɹoɈ

いいえ、バグチケットを開いていません。それを再現するには、/etc/network/interfacesファイルにコメントをいくつか追加するだけです。それがまだある場合は起動します。
アレクセイ・ヴェズニン

0

パーhttps://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/サービスを開始するために推奨される方法AFTERネットワーキングがレベルでは、「使用することですnetwork-online.targetに」.serviceのファイル:

 "After=network-online.target"
 "Wants=network-online.target"

しかし、「network-online.target」を使用し、ネットワーキングが完全にレベルではなかったためにサービスが失敗した後、バグ(https://github.com/coreos/bugs/issues/1966)があることがわかりました。 100%確実です。

実際、この場合のように「NetworkManager」などの動的なネットワーク構成ツールを使用する場合、ネットワークの状態が100%正確または予測可能になることはありません。バグを説明するリンクから、「network-online.target」は、それが使用されているさまざまなアプリケーションに応じて一貫性のない動作をするようです。

回避策
サービスの起動順序を分析し、「network-online.target」より後に起動するものを使用する必要があります。

 systemd-analyze plot > /home/pi/graph.svg

これは、ネットワークが水平で、エラーなしでサービスが開始されることを保証するものが見つかるまで、ターゲットを後のサービスに段階的に変更する反復プロセスです。私の場合sleep 10、SystemDサービスが呼び出すスクリプトにスクリプトを追加する必要さえありました。


0

Githubでサーバーをpingし続けて解決する答えを見つけことがあります。pingが送信された場合のみ、サービスが継続します。

[Service]
ExecStartPre=/bin/sh -c 'until ping -c1 google.com; do sleep 1; done;'
ExecStart=<your command>

google.comメインスクリプトがサーバーに接続する必要があるため、自分のサーバーに置き換えました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.