Monday, December 31, 2012

LinuxでNIC番号が思った通りにならない

よくあるトラブルのためのTIPSを1つ。

ディストロはRHEL系/Ubuntu系を問わず、表記のようなトラブルは多いと思う。

例えば、オンボードにEthernetが2port、拡張カードで 2port が搭載されているマシンにLinuxディストロをインストールするケースを考えよう。

この場合、ifconfig -a (等)でOSから見えるオンボードの2 port はそれぞれ eth0とeth1に、拡張ボード側は それぞれ eth2 と eth3 になってほしいと思うのが普通だと思う。

しかし、インストーラに任せておくと、往々にして以下のようなことが起こり、気付かないでいると、
正しく IP address 等を設定したはずなのに疎通がとれず、ハマることになる。

                               期待   実際
   オンボード1port 目   eth0   eth1
   オンボード2port 目   eth1   eth3
   拡張ボード1port 目  eth2   eth0
   拡張ボード2port 目  eth3   eth2

この場合、初期インストール時に udev が検出して ethX 等の名前を割りつけた順番がおかしいので、以下のファイルを直せばよい。

--------------------
認識順序がおかしかったものを手で修正後のサンプル。
[root@host08 ~]# cat /etc/udev/rules.d/70-persistent-net.rules
# This file was automatically generated by the /lib/udev/write_net_rules
# program, run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single
# line, and change only the value of the NAME= key.
# PCI device 0x8086:0x105e (e1000e)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:15:17:96:fe:42", ATTR{type}=="1", KERNEL=="eth*", NAME="eth2" ★インストール直後は "eth0" になっていた。

# PCI device 0x14e4:0x165a (tg3)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:22:19:b0:ce:e6", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0" ★インストール直後は "eth1" になっていた。
# PCI device 0x8086:0x105e (e1000e)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:15:17:96:fe:43", ATTR{type}=="1", KERNEL=="eth*", NAME="eth3" ★インストール直後は "eth2" になっていた。
# PCI device 0x14e4:0x165a (tg3)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:22:19:b0:ce:e7", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1" ★インストール直後は "eth3" になっていた。
--------------------

ところで、ここで問題になるのが、オンボードNICに対応するデバイス(ドライバ)がどれなのかを確認する方法。

完璧ではないのだが、私はこんな感じでやっている。

まず、OSから認識されている Ethernet Controller の一覧を調べる。
lspci コマンドを使い、以下のように grep で適当にフィルタする。

----
[root@host08 ~]# lspci | grep Ethernet
01:00.0 Ethernet controller: Broadcom Corporation NetXtreme BCM5722 Gigabit Ethernet PCI Express
02:00.0 Ethernet controller: Broadcom Corporation NetXtreme BCM5722 Gigabit Ethernet PCI Express
05:00.0 Ethernet controller: Intel Corporation 82571EB Gigabit Ethernet Controller (rev 06)
05:00.1 Ethernet controller: Intel Corporation 82571EB Gigabit Ethernet Controller (rev 06)
先頭がバス番号/デバイス番号。
----
このケースではオンボード+拡張ボードで合計4portの Ethernet port があり、バス/デバイス番号が若いもの(≒オンボード)は Broadcom のチップ、増設は Intel のチップだということが分かる。

特に、例えばIntel等、同じベンダ製のNICが6portとか付いている場合、へたをするとデバイスドライバが全部一緒になってしまい、判別に困ることになるが、現在OS上で認識されている ethX デバイスが、物理的にどのバス/デバイス番号に対応しているのかは、以下のように ethtool で
調べることができる。

----
[root@host08 ~]# ethtool  -i eth0
driver: tg3 ★デバイスドライバ
version: 3.124
firmware-version: 5722-v3.08, ASFIPMI v6.02
bus-info: 0000:01:00.0  ★バス番号
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: no

[root@host08 ~]# ethtool  -i eth1
driver: tg3 ★デバイスドライバ
version: 3.124
firmware-version: 5722-v3.08, ASFIPMI v6.02
bus-info: 0000:02:00.0  ★バス番号
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: no

[root@host08 ~]# ethtool  -i eth2
driver: e1000e ★デバイスドライバ
version: 2.1.4-k
firmware-version: 5.6-2
bus-info: 0000:05:00.0  ★バス番号
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: no

[root@host08 ~]# ethtool  -i eth3
driver: e1000e ★デバイスドライバ
version: 2.1.4-k
firmware-version: 5.6-2
bus-info: 0000:05:00.1  ★バス番号
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: no


----


サーバ系では最近は Intel か Broadcom の2択になることが多いと思うが、ethtool -i の出力の
driver: 欄に表示されたデバイスドライバが、具体的にどんなベンダのデバイス(Ethernet controller)
に対応するのかは、modinfo コマンドで調べることができる。

以下のような感じ。


----
[root@host08 ~]# modinfo tg3
filename:       /lib/modules/2.6.32-343.el6.x86_64/kernel/drivers/net/tg3.ko
firmware:       tigon/tg3_tso5.bin
firmware:       tigon/tg3_tso.bin
firmware:       tigon/tg3.bin
version:        3.124
license:        GPL
description:    Broadcom Tigon3 ethernet driver
author:         David S. Miller (davem@redhat.com) and Jeff Garzik (jgarzik@pobox.com)
srcversion:     554D5ED929C129F90580555
alias:          pci:v000010CFd000011A2sv*sd*bc*sc*i*
  : 
[snip]
----
なお、キッティングまで自分で行う場合は、ボード上にMAC addressが書いてあることが多いので、ifconfig -a の出力の中に HWaddr  と表示されている MAC address をみて付き合わせるのが一番である。
余談までに、同じベンダの同じ型番のNIC(=ドライバも同じ)で清一にした場合は、この事象はおきない「はず」…なのだが、例外をご存じの方は教えてほしい…。
---- ★以下のサンプルの下位3バイトはサンプルとして手で書き換えてある。
[root@host08 ~]# ifconfig -a | grep HWaddr
eth0      Link encap:Ethernet  HWaddr 00:22:19:01:02:10 ←最下位バイト
eth1      Link encap:Ethernet  HWaddr 00:22:19:01:02:11 ←最下位バイト(上と連番になるはず)
eth2      Link encap:Ethernet  HWaddr 00:15:17:03:04:20 ←最下位バイト
eth3      Link encap:Ethernet  HWaddr 00:15:17:03:04:21 ←最下位バイト(上と連番になるはず)
----
まとめ
表記のようなトラブルが起きた場合、以下のようなコマンドを駆使しておちついて対処しよう。
 * エディタ  (/etc/udev/rules.d/70-persistent-net.rules を編集する)
 * lspci
 * ethtool -i
 * ifconfig -a
 * modinfo <driver name>
特に、「あれ?ちゃんと設定したのに通信できない…」と思った場合は、ifconfig -a をたたいてみて、HWaddress の並びを確認してみよう。サーバ機であって、2port のカードを増設している場合など、MAC address が2枚ずつきれいにそろっていない限り、この事象を疑ってみる価値がある。

No comments:

Post a Comment