先ほどは上記のような記事を書いたのですが、更に確認してみると確実にネットワークインターフェースが起動してから、サービス自体も起動してくるとは言えないものでした。お詫びいたします。
というのも相変わらずinterface のアドレスにbindできないというエラーが発生していることを確認しました。
で、さらに調査を続けてみたところ、これかなぁという部分を見つけたのでメモしておきます。
ここに依存関係の項目があるのですが、最初は[Unit]セクションのAfterに以下の様な記述をしていました。
After=syslog.target network.target sys-subsystem-net-devices-eth0.device
このサービスの場合、起動前に、syslog.target
network.target
sys-subsystem-net-devices-eth0.device
を必要としているという記述なのですが、まず問題になったのは、CentOS7ではsyslog.target
が存在しないという問題です。
これについては調査してみたのですが、明確な記事が見当たらずRHEL7やFedora20ではどうなっているのか疑問です。
逆にこのtargetファイルがあれば正常に起動するのでしょうが、残念ながらCentOS7にはありません。また含んでいるようなパッケージも見当たりませんでした。
次にnetwork.target
ですが、これは以下の記事が詳しいのですが、ネットワーク関連の機能を一括して管理しているファイルで、これは起動時にUnboundやNSD4が起動要求するので無いと困ると思っていました。
NetworkTarget /
http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/
次にsys-subsystem-net-devices-eth0.device
ですが、これは下記からの情報です。
直接必要としているネットワークインターフェースデバイスを指定するものです。これを指定することでInterfaceが起動していることをサービスに知らせることが出来るかと思ったのですが、結果から言うとうまくいきませんでした。
で、最初に戻ってsystemdのドキュメントを読むとRequiresという必ず必要、と読めるオプション句があったので、そちらを使って以下のように記述してみました。
Requires=NetworkManager-wait-online.service
何故これを選んだかというと、サービスの起動順を調べてみたところ、以下の様な感じで最後の方に呼ばれるサービスだったためです。
systemd-analyze blame
8.068s mackerel-agent.service
5.175s NetworkManager-wait-online.service
1.207s network.service
<snip>
で実践してみたのですが、やはり起動時にInterfaceにbindしてくれずに途方にくれていました。
で、最後の手段として以下の様な記述に変更してみました。
After=NetworkManager-wait-online.service
こちらで起動時にサービスがネットワークインターフェースの起動後に起動してくるか確認したところ、正常に起動してくることを確認しました。
またインターフェースをbindする必要があるNSD4やdibblerなどでも同様に、問題が解決することを確認しました。
結果からすると正常に起動するようになったのですが、systemdの[Unit]セクションについては、まだ良くわからないところが多いです。
今回も何故network.target
を指定していないのに、ネットワークインターフェースの起動後にサービスが正常に起動してくる因果関係が良く分かりません。
この辺りは引き続き調査していこうと思います。