この事象が再現したのは、CentOSでe1000eのNICとigbのNIC認識させた場合で、再起動することでポートと紐付くデバイス名(eth*)がころころ変更されてしまう問題を、運用者を考慮した方法で解決するための方法です。
最近では通信の種類によってNICをわけたりと、複数NICが当たり前になってきていますので、再起動してとあるNICに割り当てられていたeth0がeth2になってしまったりすると、障害の切り分けも困難になり、目も当てられない状況に陥る事が多々あります。
まず、なぜこういうことが起こるのかというと、Linuxは起動時にドライバに対応したNICを探し出し、見つかったら見つかった順にeth0からネットワークデバイス名を割り当てていきます。しかし、NICとネットワークデバイス名に明確な関連付けがされていない場合は、起動のたびにドライバとNICの紐付けをドライバ毎に行うため、先に別のドライバに対応したNICとeth0が紐付いてしまうなど、想定した割り当てがされる保証はありません。
普通に解決するには
普通に解決するためには、それぞれのifcfg-eth*の設定ファイルに対して、HWADDR(MACアドレス)を関連付けてやれば良いです。例えば以下のような記述です。
$ cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
IPADDR=172.16.0.2
NETMASK=255.255.255.0
ONBOOT=yes
HWADDR=${MACアドレス}
しかし、この場合だとサーバ本体が故障して本体そのものを交換した場合に、それぞれの設定ファイルに対して新しいMACアドレスを書き換える作業が必要になります。そのため、停止時間が増えたり対応手順が増えたりと、運用者に易しい作業とは言えません。NICの数が増えれば増える程、とても手間のかかる対応手順になってしまいます。
運用者を考慮した解決方法
運用者を考慮した場合、HWADDRを記述できないので、明確なポートとデバイス名の関連付けはできません。そこで、少し工夫をして、ドライバの探し出す順序を指定してやれば良いのです。例えば、eth0を割り当てたいNIC1がe1000eドライバで、eNIC2がigbドライバだとあらかじめ分かっていた場合、先にe1000eドライバを探しだすような設定を/etc/sysconfig/networkに記述してやります。本当はmodprobe.d以下に書いた方が良いと思います。これは、HWADDRを書かない事に起因する設定なのであえてこのファイルに書いてみました。
modprobe e1000e
modprobe igb
これによって、起動時にe1000eドライバに対応したNICとデバイス名の対応付けを先に行うため、NIC1とeth0の紐付けが先に行われます。次にigbに関する対応付けを行います。また、udevの機能で/lib/udev/write_net_rulesがあった場合、NICのルールを勝手にudev/rules.d/70-persistent-net.ruleに作ってしまいますので、それらは解除しておく必要があります。少なくとも、CentOS5.6の最小構成の環境には、write_net_rulesなんてものはなかったので、udevにNICのルールが自動で作られることはありませんでした。
この設定によって、HWADDRを記述することなくNICとデバイス名の紐付けが可能なため、サーバ本体の交換時も設定を書き換える事なく対応することができて、運用者に易しいといえます。
運用を意識した設計はとても大事
こういうちょっとした工夫が、障害時、特に大きな障害時にはサービス停止時間を大きく短縮することができるので、システムの設計者は単純な解決策を考えるだけではなく、運用者を考慮した解決策を常に意識して設計するとよいと思います。こうすることで、運用メンバーと仲良くなり、信頼を勝ち取ることができます。運用メンバーの信頼を得ていることが、できるインフラエンジニアのとても大事な条件の一つだとおもいます!