久々にCentOS7をいじりましたが盛大にハマりました。
原因はしょーもないことだったんですが、かなり苦労したので備忘までに書いておきます。systemctlやnmcliに少し詳しくなれたのが怪我の功名。。
Contents
事象概要
ネットワークの起動に失敗する。
具体的には
①systemctl restart network.service
②/etc/init.d/network restart
の両方で失敗します。
環境
OS : CentOS Linux release 7.1.1503 (Core)
HW : HP DL360G7
詳細
centos7をインストールしてネットワークの設定を行いました。一通りしたところで設定反映のためrestartしたんですが、そこで失敗してしまいました。
# systemctl restart network.service Restarting network (via systemctl): Job for network.service failed. See 'systemctl status network.service' and 'journalctl -xn' for details.
なんか詳細を確認しろと言っているので、コマンド実行
(ちなみに cinder というのがホスト名)
# systemctl status network.service network.service - LSB: Bring up/down networking Loaded: loaded (/etc/rc.d/init.d/network) Active: failed (Result: exit-code) since 金 2015-10-09 18:55:59 JST; 2s ago Process: 22402 ExecStop=/etc/rc.d/init.d/network stop (code=exited, status=0/SUCCESS) Process: 23109 ExecStart=/etc/rc.d/init.d/network start (code=exited, status=1/FAILURE) 10月 09 18:55:59 cinder network[23109]: RTNETLINK answers: File exists 10月 09 18:55:59 cinder network[23109]: RTNETLINK answers: File exists 10月 09 18:55:59 cinder network[23109]: RTNETLINK answers: File exists 10月 09 18:55:59 cinder network[23109]: RTNETLINK answers: File exists 10月 09 18:55:59 cinder network[23109]: RTNETLINK answers: File exists 10月 09 18:55:59 cinder network[23109]: RTNETLINK answers: File exists 10月 09 18:55:59 cinder network[23109]: RTNETLINK answers: File exists 10月 09 18:55:59 cinder systemd[1]: network.service: control process exited, code=exited status=1 10月 09 18:55:59 cinder systemd[1]: Failed to start LSB: Bring up/down networking. 10月 09 18:55:59 cinder systemd[1]: Unit network.service entered failed state. # journalctl -xn -- Logs begin at 金 2015-10-09 03:47:45 JST, end at 金 2015-10-09 18:55:59 JST. -- 10月 09 18:55:59 cinder network[23109]: RTNETLINK answers: File exists 10月 09 18:55:59 cinder network[23109]: RTNETLINK answers: File exists 10月 09 18:55:59 cinder network[23109]: RTNETLINK answers: File exists 10月 09 18:55:59 cinder network[23109]: RTNETLINK answers: File exists 10月 09 18:55:59 cinder network[23109]: RTNETLINK answers: File exists 10月 09 18:55:59 cinder network[23109]: RTNETLINK answers: File exists 10月 09 18:55:59 cinder network[23109]: RTNETLINK answers: File exists 10月 09 18:55:59 cinder systemd[1]: network.service: control process exited, code=exited status=1 10月 09 18:55:59 cinder systemd[1]: Failed to start LSB: Bring up/down networking. -- Subject: Unit network.service has failed -- Defined-By: systemd -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel -- -- Unit network.service has failed. -- -- The result is failed. 10月 09 18:55:59 cinder systemd[1]: Unit network.service entered failed state.
どっちも同じで、RTNETLINK answers: File exists と言っている模様。ただ、このエラーは今までも見たことがあって、直接原因を表すようなものでは無かった気がした。(実際ググっても問題に直結しなかった)
もう少しデバッグしよう。わけのわからないsystemctlは使わずに
ということで、慣れ親しんだ /etc/init.d/network restart を試してみることに。
# /etc/init.d/network restart Restarting network (via systemctl): Job for network.service failed. See 'systemctl status network.service' and 'journalctl -xn' for details. [失敗]
あれ?こいつもsystemctl使ってない?
そんなことは無いでしょう。ということで -x オプションを使ってより詳細なデバッグ
# bash -x /etc/init.d/network restart + . /etc/init.d/functions ++ TEXTDOMAIN=initscripts ++ umask 022 ++ PATH=/sbin:/usr/sbin:/bin:/usr/bin ++ export PATH ++ '[' 17528 -ne 1 -a -z '' ']' ++ /bin/mountpoint -q /cgroup/systemd ++ /bin/mountpoint -q /sys/fs/cgroup/systemd ++ case "$0" in ++ _use_systemctl=1 ~~~~中略~~~~ ++ /bin/systemctl restart network.service Job for network.service failed. See 'systemctl status network.service' and 'journalctl -xn' for details. ++ failure 'Restarting network (via systemctl): ' ~~~~中略~~~~
やっぱりsystemctl使ってる。どういうこと??
でログを見ると、_use_systemctl=1という怪しい記述が。その前の部分を見ると、/etc/init.d/functionsというファイルをsourceしているようなので、そいつの中身を見てみることに。
/etc/init.d/XXX を実行してもsystemctlにリダイレクトするらしい
ということで、中身を見ると
# vim /etc/init.d/functions if [ $PPID -ne 1 -a -z "$SYSTEMCTL_SKIP_REDIRECT" ] && \ ( /bin/mountpoint -q /cgroup/systemd || /bin/mountpoint -q /sys/fs/cgroup/systemd ) ; then case "$0" in /etc/init.d/*|/etc/rc.d/init.d/*) _use_systemctl=1 ;; esac fi
2行目の$SYSTEMCTL_SKIP_REDIRECTが空文字の場合、systemctlを使うよ、というように読める。ちなみに$SYSTEMCTL_SKIP_REDIRECTという変数はファイル中にどこにも無い。ということは、環境変数に設定して実行すればsystemctlを使わないのか??
SYSTEMCTL_SKIP_REDIRECTを設定してみた
実際に以下のコマンドを実行してみた
# SYSTEMCTL_SKIP_REDIRECT="enable" bash -x /etc/init.d/network restart + . /etc/init.d/functions ++ TEXTDOMAIN=initscripts ++ umask 022 ++ PATH=/sbin:/usr/sbin:/bin:/usr/bin ++ export PATH ++ '[' 17528 -ne 1 -a -z enable ']' ++ '[' -z '' ']' ++ COLUMNS=80 ++ '[' -z '' ']' ++ '[' -c /dev/stderr -a -r /dev/stderr ']' +++ /sbin/consoletype ++ CONSOLETYPE=pty ++ '[' -z '' ']' ++ '[' -z '' ']' ++ '[' -f /etc/sysconfig/i18n -o -f /etc/locale.conf ']' ++ . /etc/profile.d/lang.sh ++ unset LANGSH_SOURCED ++ '[' -z '' ']' ++ '[' -f /etc/sysconfig/init ']' ++ . /etc/sysconfig/init +++ BOOTUP=color +++ RES_COL=60 +++ MOVE_TO_COL='echo -en \033[60G' +++ SETCOLOR_SUCCESS='echo -en \033[0;32m' +++ SETCOLOR_FAILURE='echo -en \033[0;31m' +++ SETCOLOR_WARNING='echo -en \033[0;33m' +++ SETCOLOR_NORMAL='echo -en \033[0;39m' ++ '[' pty = serial ']' ++ __sed_discard_ignored_files='/\(~\|\.bak\|\.orig\|\.rpmnew\|\.rpmorig\|\.rpmsave\)$/d' ++ '[' '' = 1 ']' + '[' '!' -f /etc/sysconfig/network ']' + . /etc/sysconfig/network ~~~~省略~~~~ + /etc/init.d/network stop インターフェース enp3s0f0 を終了中: [ OK ] インターフェース enp3s0f1 を終了中: [ OK ] インターフェース enp4s0f0 を終了中: Device 'enp4s0f0' successfully disconnected. [ OK ] インターフェース enp4s0f1 を終了中: [ OK ] インターフェース ens1f0 を終了中: Device 'ens1f0' successfully disconnected. [ OK ] インターフェース ens1f1 を終了中: [ OK ] ループバックインターフェースを終了中 '/etc/sysconfig/network-scripts/ifcfg-lo' ファイルを読み込めませんでした。 '/etc/sysconfig/network-scripts/ifcfg-lo' ファイルを読み込めませんでした。 '/etc/sysconfig/network-scripts/ifcfg-lo' ファイルを読み込めませんでした。 '/etc/sysconfig/network-scripts/ifcfg-lo' ファイルを読み込めませんでした。 [ OK ] + /etc/init.d/network start ループバックインターフェイスを呼び込み中 '/etc/sysconfig/network-scripts/ifcfg-lo' ファイルを読み込めませんでした。 '/etc/sysconfig/network-scripts/ifcfg-lo' ファイルを読み込めませんでした。 '/etc/sysconfig/network-scripts/ifcfg-lo' ファイルを読み込めませんでした。 '/etc/sysconfig/network-scripts/ifcfg-lo' ファイルを読み込めませんでした。 [ OK ] インターフェース enp4s0f0 を活性化中: 接続が正常にアクティベートされました (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/17) [ OK ] インターフェース ens1f0 を活性化中: 接続が正常にアクティベートされました (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/18) [ OK ] インターフェース ens1f1 を活性化中: エラー: 接続のアクティベーションに失敗: Connection 'ens1f1' is not available on the device ens1f1 at this time. [失敗] + rc=1 + exit 1
お、なんかさっきと違う。エラーの詳細がもうちょっと出たっぽい。
とりあえず、このやり方であれば /etc/init.d/network のスクリプトを実行(=systemctlを使わない)することがわかりました。
で、エラー内容を見てみると
インターフェース ens1f1 を活性化中: エラー: 接続のアクティベーションに失敗: Connection ‘ens1f1’ is not
available on the device ens1f1 at this time.
[失敗]
とのこと。さっきよりだいぶわかってきたぞ。
とりあえず現状のインターフェイス状態を見てみると
# nmcli connection 名前 UUID タイプ デバイス enp4s0f1 47d00982-9f99-4989-9b08-021950ca01a9 802-3-ethernet -- enp4s0f0 d2ffc1b4-150d-448f-93f6-a24e093d8463 802-3-ethernet enp4s0f0 ens1f0 e580f09f-416c-45e9-95fd-d6d4a23c6ecc 802-3-ethernet ens1f0 ens1f1 51efc6bc-f365-46f5-a7dd-0d1327666bf8 802-3-ethernet -- ens1f1 bb762c2f-43d2-45c1-b162-2440daf058fa 802-3-ethernet -- enp3s0f0 8bdd02cc-c35f-4681-b2c9-cde9761cd9a8 802-3-ethernet -- enp3s0f1 19614cc6-b56f-4e04-b85a-5f7c33cc9e31 802-3-ethernet -- # nmcli device デバイス タイプ 状態 接続 enp4s0f0 ethernet 接続済み enp4s0f0 ens1f0 ethernet 接続済み ens1f0 enp3s0f0 ethernet 利用不可 -- enp3s0f1 ethernet 利用不可 -- enp4s0f1 ethernet 利用不可 -- ens1f1 ethernet 利用不可 -- lo loopback 管理無し --
確かにens1f1はupもしていないしアクティブではない模様。
とりあえずconnectionを使える状態にしてみる
# nmcli connection add type ethernet ifname ens1f1 con-name ens1f1 接続 'ens1f1' (bb762c2f-43d2-45c1-b162-2440daf058fa) が正常に追加されました。
正常に追加されたらしいのでもう1回実行。
問題の箇所がわかったのでifupだけを試してみることに。
# bash -x /etc/sysconfig/network-scripts/ifup ens1f1 ~~~~~ + nmcli con up uuid 51efc6bc-f365-46f5-a7dd-0d1327666bf8 エラー: 接続のアクティベーションに失敗: Connection 'ens1f1' is not available on the device ens1f1 at this time. + exit 4 ~~~~~
やっぱりダメ。。。なんでだろう?
ここでいろいろ試してみること2時間、全く改善せず。
そして、この時ふと気が付く。
そもそもens1f1にケーブルつながってなくね?
ケーブルがつながってないんだからそりゃアクティベーションできないよね。そりゃ。だってアクティブじゃないもの。
結論:Centos7は使っていないインターフェイスはautoconnect offにしよう!
ここで、「ケーブルがつながってないインターフェイスをUPしようとするとエラーになるのでは?」という仮説にようやくたどり着く。ということで、自動起動しないように設定変更。
# nmcli connection modify ens1f1 connection.autoconnect no #
続いてネットワークの起動
# systemctl restart network.service # # ↑(何もメッセージが出ない=成功)
やっと解決した。。。
自分の記憶が正しければ、centos5,6ではケーブルがつながってなくてもUP自体はできた(network restartが失敗しない)はずだったのに、centos7からは変わったのかな。
何はともあれめでたく起動成功しました。
まとめ
ということで、非常にしょーもないことで時間を浪費しましたが、少しcentos7に詳しくなれて良かったです。(systemctlを経由せずに/etc/init.d/スクリプトを使う方法がなかなか見つからなかった)
まぁこうやって慣れていくしかないんかな。。。