CentOSにNICを手動インストールした人は、正しいドライバが入っているかチェックしたほうがよさげ

CentOSにNICのドライバを手動インストール成功したつもりが、別のチップのドライバをインストールしていて、普段は正常だけど時々異常になるというケースに遭遇したので周知エントリー。

異常な状態は、「RealtekのNICを通した通信が著しく不安定になる。応答が極端に遅くなったり、接続できなかったりする。」というものでした。OSを起動してすぐに異常になるというわけではなく、起動からしばらくすると...というものでした。Realtek NICはマザーボードに搭載されていたものです。

一時的な回避策としては、OS自体を再起動するか「/sbin/service network restart」で直りました。でもしばらくして再発しますので、本当に応急措置でしかありませんでした。

NICが「R8111/R8168B」なら、インストールされているドライバを確認しよう

以下にあてはまる場合は要注意です。

  1. Linux OSである。
  2. Realtek R8111/R8168Bのチップを使ったNICを使用している。

NICの確認方法は以下の通り。

$ /sbin/lspci | grep Ether
01:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 02)

ここで「RTL8111/8168B」が出てきた場合、今回の話にあてはまる可能性があります。

あてはまった人はドライバが正しくインストールされているか、以下のようにして確認しましょう。

$ /sbin/lsmod | grep r81
r8169                  70853  0
mii                    38849  1 r8169
 

ここでr8168が表示されず、r8169などが見つかったらアウト!です。RTL8111/8168Bの正しいドライバは「r8168」だからです。

さらにだめ押しの確認として、以下のようにNICの「dropped」にpacketsよりも大きな数字が上がってきていたらかなりやばい状態だと思います。(ドライバどうこう以前にdroppedが大きければそれだけで怪しいでしょうけど)

$ /sbin/ifconfig -a | grep dropped
 :
RX packets:9787517 errors:0 dropped:102666736368 overruns:0 frame:0
 :

ちなみに「r8168 r8169」で検索してみるとUbuntu, CentOSなどLinux系OSのインストール時にr8168がインストールされるべきところでr8169がインストールされてしまい、全く通信できなくなる、という記事を多く見かけました。通信できなければ正しくインストールするしかないのでr8169のままほったらかしにはしないでしょう。

しかし、僕が遭遇した事象は「チップはr8168でドライバがr8169だが普段は普通に通信できている」ので、原因を特定するまでに苦労しました。 

r8168を正しくインストールする方法

結論&教訓としては「Linuxにドライバを手動でインストール(insmod)するときはREADMEを必ず読め」ということなんで、ここに書いてあることは現時点(ドライババージョン8.014.00、ドライバ更新日2009/8/31)での情報ですから、参考程度にしておいてください。

OSはCentOS5.3 x86_64(64bit)で、既にr8169をインストールしてしまっている場合の手順です。

# RealTek社からドライバをダウンロードしてサーバーに置いておく
# (※)先にやっておかないと、先にドライバ削除してしまって通信できなくなるので注意!(1回やりましたw)

# r8169がある場合は削除
rmmod r8169
# r8169.koファイルを残しておくのも不安なのでどこかへ待避
updatedb
locate r8169.ko
mv /lib/modules/2.6.18-xxx.x.xx.el5/kernel/drivers/net/r8169.ko ~
# modprob.confの書き換え
vi /etc/modprobe.conf # r8169をr8168に変更
# 再起動
reboot

# ドライバインストール
tar vjxf r8168-8.xx.xx.tar.bz2
cd r8168-8.xx.xx.tar.bz2
less README # READMEを読もう
make clean modules
make install
depmod -a
insmod ./src/r8168.ko

insmodがうまくいけば自動的にNICが認識されるので、以下でドライバインストールとNICの認識を確認するとよいでしょう。

lsmod | grep r8168
ifconfig -a

なお、modprobe.confを手動で編集する必要があるかどうかは検証したわけではありません。

この作業後、droppedの値はゼロのままになったので、正常になったとみてよさそうです。droppedが異常に増えていた間は、内部でパケットがぐるぐる回って臨界点を超えたところで通信が不安定になったんじゃないか...と思われます。未調査なので想像ですが。

ちなみに「そもそも蟹(Realtek)なんか使わずにintel使え」というつっこみは想定の範囲内ですが、まあ、RealtekでもオンボードNICがあるならできれば活用したいよねということで、アリな状況もあるのではと思います。外付けNICは流石にintelを選択しますよ!

参考サイト

$ /sbin/lsmod | grep r81
r8169                  70853  0
mii                    38849  1 r8169

コメント / トラックバック

コメント / トラックバック 2 件

  1. [...] CentOSにNICを手動インストールした人は、正しいドライバが入っているかチェックしたほうがよさげ AKPC_IDS += "1817,"; [...]