PCカードのNICが落ちる【PCC-TXD】

linux, サーバー関連 2010年3月10日,

機能の記事(WOLの設定) のために仕事場の粗大ゴミ的立場のノートPCを拾ってきました。
現在、ぼくの家の電源管理用鯖およびPerl検証環境として稼動しているのですが
なんだか大きいサイズのファイルを転送したらNICが落ちる事が判明してきた。



【スペック】
機種名 : CF-X1 パナソニック
OS : Debian Lenny
CPU : PenIII 700MHz
メモリ : 64MB + 追加126MB
NIC : Corega FEtherⅡPCC-TXD 100M/10M LAN PC Card



はじめてこの現象になったのはひにゃのさんがDebianパッケージのインスコ行った時。
突然インスコ中にSSHターミナルが突然動かなくなった。
「これだから64MBメモリはwwwwwwwwww」
とか笑って再起動してーってやってました。

それからは順調に2日間と落ちる事なく稼動してマジックパケット送ってたんだけど

今日仕事先から、PerlモジュールをCPANでインストールしてたら
ソースをダウンロードしてくる段階でSSHターミナルが突然動かなくなったし、
落ちるときは必ず「何かを通信を行ったとき」なので
「それなりのデータをNICで通信する」と落ちる感じがしてきました。

ちなみにNICは落ちてもサーバー機自体は生きててコンソールからは操作はできる。
落ちてる状況で実記から

ping 192.168.1.1

とかやってみたけど無反応。完全にNICは落ちてます。
ifconfigしてみると、

eth0 Link encap:イーサネット ハードウェアアドレス 00:01:02:03:04:05
inetアドレス:192.168.1.2 ブロードキャスト:192.168.1.255 マスク:255.255.255.0

と正常な値が帰ってきます。
ちゃんと認識してるのにしてないという変な状況にw
一応・・・と思ってシスログをみてみると

tail -f /var/log/syslog

Mar 10 00:42:14 home kernel: [258137.636360] eth0: bogus packet size: 2313, status=0x0 nxpg=0x0.
Mar 10 00:42:14 home kernel: [258137.636389] eth0: bogus packet size: 2313, status=0x0 nxpg=0x0.
Mar 10 00:42:14 home kernel: [258137.636416] eth0: bogus packet size: 2313, status=0x0 nxpg=0x0.
Mar 10 00:42:14 home kernel: [258137.636441] eth0: bogus packet size: 2313, status=0x0 nxpg=0x0.
Mar 10 00:42:14 home kernel: [258137.636467] eth0: bogus packet size: 2313, status=0x0 nxpg=0x0.
Mar 10 00:42:14 home kernel: [258137.636492] eth0: bogus packet size: 2313, status=0x0 nxpg=0x0.
Mar 10 00:42:14 home kernel: [258137.636518] eth0: bogus packet size: 2313, status=0x0 nxpg=0x0.
Mar 10 00:42:14 home kernel: [258137.636544] eth0: bogus packet size: 2313, status=0x0 nxpg=0x0.
Mar 10 00:42:14 home kernel: [258137.636569] eth0: bogus packet size: 2313, status=0x0 nxpg=0x0.


とこんなのがマジ半端ない速さで延々と出続けていました。
「bogus packet size」でぐぐってみるとかなり情報がいっぱいw
で、その症状となっている人はほとんどがPCカードタイプのイーサネットNICであることがわかってきて
Corega FEtherⅡPCC-TXD 100M/10M LAN PC Card
のやつに問題がある事がわかってきました。
ヤフオクで500円だから壊れててもしょうがないわけなんだけど、同じカードで同じ状況の人も複数いたので
一概に壊れてるとはいいがたし。

複数サイトの情報を僕が解釈できたレベルのものを引用

カードはcardbusじゃなくてPCMCIA形式のようなので、100base速度のとき
に無理がたたって不具合が発生するのかもしれません。

http://mlog.euqset.org/archives/debian-users/45495.html


問題: 以下のようなメッセージが表示される:

eth0: bogus packet size: 65531, status=0xff, nxpg=0xff

理由: 共有メモリに問題があります。

解決法: 最もよくある原因は、PCI マシンが ISA メモリデバイスにマップするように設定されていない場合です。したがって、受信パケットのデータが含まれている、本来見にいくべきカードの RAM ではなく、 PC の RAM の一番最後 (値が全部 0xff) を見にいってしまっているのです。

他にありがち (で修正が簡単) なものとしては、ボードの競合、キャッシュかその領域の `shadow ROM’ が有効になっている、 ISA バスが 8MHz 以上で動作している、などがあります。イーサネットカードでのメモリ不良も、じつは驚くほどたくさん起きています。こんな問題が起きた場合には、診断プログラムを走らせておくといいですね。

http://www.linux.or.jp/JF/JFdocs/Ethernet-HOWTO-3.html


解決策案

サーバからパッケージ落としてくるときに、こんなメッセージが

eth0:bogus packet size:32864 status=0x21 nxpg=0xed
eth0:nextframe inconsistency 0xcd

(数字は適当。) これが出ると、ほぼ確実に回線、というか LAN カードの調子が悪くなり ネットにつながらなくなるということが。 HDD フォーマットし終わった後にこれされると、再び 1) から始めないといけない。疲れる。 調べてみると、1回に受信したパケットサイズがでかすぎるってことらしい。 なので、インターフェースの MTU を変えてやってみることに。 ifconfig は無いので IP コマンドで。 # ip link show eth0 とかすると、文中に MTU = 1500 ぐらいが出てきました。 こいつを # ip link set eth0 mtu 1000 とかやると MTU が変更されました。 1300 とか 1454 でもよかったかもしれないけど とりあえずこれでやるとエラーメッセージも出ず、平和に終わりました。

http://d.hatena.ne.jp/gongoZ/20080926/1222358219



Linux NAT 使用 16-bit PC Card 時, 一段時間後 (使用 P2P 軟體時特別明顯) 會發生 eth0: bogus packet size: 1799, status=0x0 nxpg=0x0. 和 kernel: eth0: Too much work at interrupt, status 0x01 的錯誤訊息, 最後該網卡將無法運作, 但問題發生時另一張 CardBus 網卡不受影響. 此時可用指令 ifdown eth0 ; sleep 3 ; ifup eth0 恢復問題網卡的運作, 當然, 這方法只能治標, 最好還是換好一點的網卡 (或 driver). 此外, 減少 iptables rules 或寫一個 Shell Script 監控問題網卡也是可行的方案.

寫一個 Shell Script 定時 ping 一個有效的 IP, 如果 ping 不到, 表示上述問題又發生了, 自動重新啟動問題網卡:

#!/bin/bash

if [ -z “`ping -c 1 192.168.1.254 | grep ‘1 received’`” ]; then
ifdown eth0
sleep 3
ifup eth0
echo `date +%D\ %R` >> /var/log/eth0_restart.log
fi

http://cha.homeip.net/blog/archives/2005/09/_linux_pcmcia_1.html

中国語?でよくわからないけど
「CardBusの影響でハングして落ちた時は
ifdown eth0 ; sleep 3 ; ifup eth0
と一回落として再起動してやれば問題解決するべ。
んだから1パケットのPingをどっかに送信して「1 received」じゃなければ
networkを再起動するシェルスクリプトおいとくから適当にcronとか使ってまわしてね」
って事かと。


ひとまず

簡単なのでMTUを下げる方法で様子みてみたいと思います。
ブログ主さまのようにMTUを1000に設定しておきました。

ifconfig eth0 mtu 1000

のコマンド実行

んでローカルからだけど10Mくらいのサイズのファイルを転送してけど無事転送完了
更新もできてる・・・ってことでしばらくはこれで様子見します。

コメントどうぞ