CentOS でネットワークのサービス起動に失敗する

CentOS で /etc/sysconfig/network-scripts/ifcfg-ethX に NIC 設定を入れて、設定を反映するために network サービスを再起動すると以下のようなエラーで失敗することがあります。

network サービス起動失敗
1
2
3
4
# service network restart
Shutting down loopback interface:    [OK]
Bringing up loopback interface:      [OK]
Bringing up interface eth0:  Device eth0 does not seem to be present, delaying initialization.  [FAILED]

ネットワーク永続化ルールに意図しない eth 情報が登録されている

この問題は MAC アドレスと eth 番号のずれから起こります。

CentOS 6 では、デフォルトで 70-persistent-net.rules (永続化ルール) で MAC アドレスと eth 番号を紐付けて管理するようになっています。

このネットワーク永続化ルールが有効になっている状態でサーバに NIC を追加すると上記のファイルに MAC アドレスと eth 番号が自動的に追加されるようになります。

特に、仮想環境においては、仮想 NIC を削除すると永続化ルールが自動的に削除されずそのまま残ってしまうため、NIC を削除した後、新しい NIC を追加した場合には、意図しない eth 番号が付与される可能性があります。

Device eth0 does not seem to be present

まずは、ifconfig -a コマンドでサーバの NIC 情報を確認してみます。

現在、サーバには eth0 が一つ存在していて、MAC アドレスは 00:50:56:95:24:07 が認識されていることが分かります。

現在の NIC 情報確認
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
# ifconfig -a
eth0      Link encap:Ethernet  HWaddr 00:50:56:95:24:07
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 MiB)  TX bytes:0 (0.0 MiB)
 
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

そして、ネットワーク永続化ルールを確認してみると eth0 には ありもしない NIC 情報が登録されていて、本来なら eth0 として認識されるはずだった NIC 情報がなぜか eth1 として登録されていることが分かります。

/etc/udev/rules.d/70-persistent-net.rules
1
2
3
4
5
# PCI device 0x15ad:0x07b0 (vmxnet3)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:50:56:95:46:45", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
 
# PCI device 0x15ad:0x07b0 (vmxnet3)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:50:56:95:24:07", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"

ネットワーク永続化ルール無効化

この問題を防ぐためには、ネットワーク永続化ルールを無効にする必要があります。

ネットワーク永続化ルールを無効にするために対策が必要なファイルは、以下の通りです。

ファイル名役割・機能
75-persistent-net-generator.rules70-persistent-net.rules ファイルを生成する
70-persistent-net.rules再起動時にサーバに割り当てられた NIC の MAC 情報を読み込み、新しいファイルが作成される

起動時に NIC の MAC アドレス情報が自動的に組み込まれないように上記ファイルの中身を削除し、空のファイルにします。

  • 70-persistent-net.rules の中身を削除し、空のファイルにする
  • 75-persistent-net-generator.rules の中身を削除し、空のファイルにする
ネットワーク永続化ルール無効化
1
2
# echo "" > /etc/udev/rules.d/70-persistent-net.rules
# echo "" > /lib/udev/rules.d/75-persistent-net-generator.rules

永続化ルールファイルは削除しない

ネットワーク永続化ルールファイルを削除すると、起動時に udev 関連のカーネル警告が出る恐れがあります。 そのため、これらのルールファイルを削除することはオススメしません。 中身だけ空の状態にしてください。

write_net_rules について

write_net_rules ファイルは、75-persistent-net-generator.rules 内でインポートされるファイルです。

結果的には、write_net_rules によって 70-persistent-net.rules ファイルが生成されるようになります。

また、75-persistent-net-generator.rules はシステムアップデートにより上書きされる可能性があるので、上記の対策に加え、予防策として以下を追加で実施しておくと確実にネットワーク永続化ルールを無効にすることができます。

write_net_rules によって 70-persistent-net.rules が生成されないように、RULES_FILE 変数に設定されている永続化ルールファイルの代わりに /dev/null をセットします。

/lib/udev/write_net_rules
1
2
3
4
・・・
#RULES_FILE='/etc/udev/rules.d/70-persistent-net.rules'
RULES_FILE='/dev/null'
・・・

設定が全て終わったらネットワークサービスを再起動してください。

ネットワーク再起動
1
# service network restart

永続化ルールを無効化せずに正しく直して使いたい場合

場合によっては、ネットワーク永続化ルールを無効化せずに、正しく直して使い場合もあるかと思います。

例えば、仮想環境の場合、以下の作業を実施すると上記のような永続化ルールによる問題が発生します。

  1. 仮想 NIC が 2つ (eth0 / eth1) 付いている仮想マシンのクローンを作成
  2. クローンに付いている仮想 NIC (eth0 / eth1) を削除後、仮想 NIC を再作成
  3. クローンを Power On する
  4. OS へログインし、「ifconfig -a」で確認すると「eth2 と eth3」として認識されちゃってる

この問題は、先ほど説明したように、永続化ルールを無効にすることで対応できますが、永続化ルールを無効化せずに、永続化ルールによって認識された情報をそのまま使いたい場合には、以下を実施してください。

  1. 仮想マシン管理クライアント を使って (例えば、VMware の場合には vCenter へ接続)、仮想マシンに付いている 1番目と 2番目の仮想 NIC の MAC アドレスを確認・控えておく (重要 : この後補足)
  2. OS へログイン
  3. 「ifcfg-eth0」と「ifcfg-eth1」に MAC アドレスを明示的に設定している場合には、ファイルを編集し、新しい MAC アドレスを設定する
  4. 「70-persistent-net.rules」を削除 (再起動で再作成される)
  5. 「shutdown -r now」で OS 再起動
  6. 「70-persistent-net.rules」に「eth0 / eth1」の情報が正しく認識されているか確認

MAC アドレス確認時の注意点 (永続化ルール有効状態、かつ仮想環境の場合)

うまく伝わるかどうか心配ですけど、書いておきますね。

OS 内での ifconfig -a の実行結果に表示される誤認識された eth2eth3 の順番は、必ずしも仮想マシンに追加した仮想 NIC の順番通りに認識されるわけではありません。

eth2 の MAC アドレスが仮想マシンに追加した 2番目の仮想 NIC の MAC アドレスなっている場合もあるし。

eth3 の MAC アドレスが仮想マシンに追加した 1番目の仮想 NIC の MAC アドレスなっている場合もあるので、注意が必要です。

なので、仮想マシンの MAC アドレスを調べる際には、仮想マシン管理クライアント (VMware の場合には vSphere Client・Web Client で vCenter へログインするか ESXi ホストへ直接ログイン) にて、仮想マシンに付いている各仮想 NIC の MAC アドレスを確認・控えてください。

ポイントとしては、永続化ルールを無効化しない限り、70-persistent-net.rules は、削除してから再起動すると再作成されるので、既存のゴミ情報をキレイに削除するために、一旦 70-persistent-net.rules を削除してから OS を再起動する。 後は OS にお任せって感じですね。

永続化ルールを無効にしたくない場合の直し方
01
02
03
04
05
06
07
08
09
10
11
12
# cat /etc/udev/rules.d/70-persistent-net.rules
※ この例だと eth0eth3 までの情報が存在するはず
eth0eth1 はゴミ情報で、本物は eth2eth3 として認識されている
 
# vi /etc/sysconfig/network-scripts/ifcfg-eth0     #### MAC アドレスを設定している場合には、新しい MAC アドレスを設定
# vi /etc/sysconfig/network-scripts/ifcfg-eth1     #### MAC アドレスを設定している場合には、新しい MAC アドレスを設定
 
# rm -f /etc/udev/rules.d/70-persistent-net.rules  #### 再起動すると再作成されるので、消しておく
 
# shutdown -r now    #### OS 再起動
 
# cat /etc/udev/rules.d/70-persistent-net.rules    #### eth0 と eth1 の情報が正しく認識されていること

70-persistent-net.rules が見つからない場合

例えば、CentOS 7 では、70-persistent-net.rules を検索しても見つかりません。

CentOS 7 : 永続化ルールファイル 検索
1
# find / -name "*persistent-net*"

こういうときには、ネットワーク設定ファイルに正しい MAC アドレスを設定した上で、network サービスを再起動すると直ります。

  • vCenter 上、1番目の NIC : 00:50:56:95:4e:d4
    OS 側で確認したときの ens160 : 00:50:56:95:c8:df
  • vCenter 上、2番目の NIC : 00:50:56:95:c8:df
    OS 側で確認したときの ens192 : 00:50:56:95:4e:d4

このように、OS 側で MAC アドレスが入れ替わっている場合には、vCenter 上の NIC の順番通りに OS 側の各ネットワーク設定ファイルに MAC アドレスを手動で設定した上で、network サービスを再起動します。

CentOS 7 : MAC アドレス手動設定
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# ip a | grep -B1 "inet"
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
--
    link/ether 00:50:56:95:c8:df brd ff:ff:ff:ff:ff:ff
    inet 10.10.10.10/24 brd 10.10.10.255 scope global ens160
--
    link/ether 00:50:56:95:4e:d4 brd ff:ff:ff:ff:ff:ff
    inet 10.10.20.10/24 brd 10.10.20.255 scope global ens192
 
# vi /etc/sysconfig/network-scripts/ifcfg-ens160
・・・
MACADDR=00:50:56:95:4e:d4    #### 仮想マシンの NIC アダプタ 1 の MAC アドレスを設定
 
# vi /etc/sysconfig/network-scripts/ifcfg-ens192
・・・
MACADDR=00:50:56:95:c8:df    #### 仮想マシンの NIC アダプタ 2 の MAC アドレスを設定
 
# systemctl restart network  #### サービス再起動
 
# ip a | grep -B1 "inet"
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
--
    link/ether 00:50:56:95:4e:d4 brd ff:ff:ff:ff:ff:ff
    inet 10.10.10.10/24 brd 10.10.10.255 scope global ens160
--
    link/ether 00:50:56:95:c8:df brd ff:ff:ff:ff:ff:ff
    inet 10.10.20.10/24 brd 10.10.20.255 scope global ens192

終わりに

仮想環境の場合には、クローン作成、テンプレート展開 (デプロイ)、仮想 NIC の追加・削除が手軽に出来てしまうので、こういうトラブルがよく起こります。

特に、OpenStack のカスタム OS イメージを作成する際には、インスタンスが起動する際に誤動作を起こす原因になるので、必ずネットワーク永続化ルールを無効にする必要があります。

OS 構築時には忘れずに設定しておくといいと思います。

以上、仮想マシンの NIC 設定が反映されない 時の対処方法でした。