自宅鯖にCentOS7を入れたんだけど起動時にネットワークデバイスの初期化(link up?)が終わる前に、systemctl network.service start
が行われてしまって、network.service が failed になってしまう問題が起きて困っていた。
症状
1. 現象としてはまず以下の様なログが出てる。
Mar 30 05:39:22 r16 NetworkManager[829]: Failed to activate 'enp3s0': Connection 'enp3s0' is not available on the device enp3s0 at this time.
Mar 30 05:39:22 r16 network: インターフェース enp3s0 を活性化中: エラー: 接続のアクティベーションに失敗: Connection 'enp3s0' is not available on the device enp3s0 at this time.
Mar 30 05:39:22 r16 NetworkManager[829]: NetworkManager state is now DISCONNECTING
Mar 30 05:39:22 r16 NetworkManager[829]: NetworkManager state is now DISCONNECTED
Mar 30 05:39:22 r16 network: [失敗]
Mar 30 05:39:22 r16 systemd: network.service: control process exited, code=exited status=1
Mar 30 05:39:22 r16 systemd: Failed to start LSB: Bring up/down networking.
Mar 30 05:39:22 r16 systemd: Unit network.service entered failed state.
2. でもこの後すぐに sshd とか firewalld とかが起動し始めちゃってる。でも firewalld が起動した時にはネットワークインターフェースがまだ無いので sshd の TCP22番ポートのルールが iptables に上手く追加できなくて有効になってくれくれない。
3. しかしその数秒送れで更に以下の様なログが出ていてNICの link up は果たされる。そしてこの時点で ping は通るようになっているのだ。
Mar 30 05:39:24 r16 kernel: r8169 0000:03:00.0 enp3s0: link up
Mar 30 05:39:24 r16 kernel: IPv6: ADDRCONF(NETDEV_CHANGE): enp3s0: link becomes ready
Mar 30 05:39:24 r16 NetworkManager[829]: (enp3s0): link connected
Mar 30 05:39:24 r16 NetworkManager[829]: (enp3s0): device state change: unavailable -> disconnected (reason 'carrier-changed') [20 30 40]
Mar 30 05:39:24 r16 NetworkManager[829]: Auto-activating connection 'enp3s0'.
Mar 30 05:39:24 r16 NetworkManager[829]: Activation (enp3s0) starting connection 'enp3s0'
Mar 30 05:39:24 r16 NetworkManager[829]: Activation (enp3s0) Stage 1 of 5 (Device Prepare) scheduled...
Mar 30 05:39:24 r16 NetworkManager[829]: Activation (enp3s0) Stage 1 of 5 (Device Prepare) started...
4. だがfirewalldは既に起動を終えており、肝心のsshポートは開かないまま。起動シーケンスは最後まで実行されて終了…。
5. 仕方ないのでコンソールからログインして systemctl restart firewalld.service
を手で実行してやることでsshは一応出来るようになると言う状態だ。
解決策
ダメな奴(一応解決はするんだけどね…)
とりあえず、/etc/rc.local に
sleep 5; systemctl restart network.service; systemctl restart firewalld.service
とか書いとけば一応繋げれるようになる。だが如何にもダメな奴だw
本解決
色々試しつつ、ふと systemctl list-unit-files
を見てたら NetworkManager-wait-online.service なんて名前のサービスがあるじゃない!?デフォルトではdisabledらしいが、いかにも僕の問題を解決してくれそうなサービス名である。おもむろに有効化。
systemctl enable NetworkManager-wait-online.service
再起動してみる。…やったー、無事SSH入れたよ!network.service のステータス見ても failed しなくなってる!