TurboLinuxでLAN PCカードを使う
2003/02/02
約3年前、我がノートPC NEC Lavie NX LB400Dの購入と同時に以下のLAN PCカード(プラネックスコミュニケーションズ社 FNW-3700-T)を購入しました。このPCカードはDOSでも使えて、「起動ディスク(DOS)でネットワークアクセス」でも活躍してくれましたし、Windows上の利用でも困ったことや不具合は全く無かった、なかなかいい製品でした。
[Planex FNW-3700-T]
ただひとつ大きな難点がありました。それはLinuxで利用できなかったのです。ノートPCを買った当時は私もまだ、大したマルチブートの知識も無かったので、ノートPCにLinuxをインストールする気も無く、当然Linux対応をうたったPCカードなど購入しようとも考えていませんでした(一応当時から対応カードはあったようですが)。その後マルチブートの知識も高まり、ノートPCにインストールした時、どうしてもTurboLinuxでこのカードを認識させることができませんでした。ネット検索して、認識させたっぽい記事も見かけたのですが、相当の裏技を駆使していて、当時の私にはお手上げ状態でした。
もうひとつの選択肢として、PCカードも非常に安くなってきたので、対応品を別途買うという手もありました。しかし、それ程ノートPCでLinuxを使うことが必要に迫られていた訳でもなく、また使えるものを捨てることができないたちの私としては、Windowsでは十分に使えているものを捨てるに忍びなく、この選択肢はありえませんでした。結局壊れてくれるのを待つ他なかったのです。
と言うのも、上記のような当時のLAN PCカードはカードとLANコネクタ(RJ45)が分かれていて、これらを繋ぐコネクタ部分(上図で丸で囲んだ部分)が非常に薄くて壊れやすいと言われていました。その反省から多くのメーカーからカードとLANコネクタをドッキングさせたもの(コネクタ一体型)が次々に登場しましたから、上記従来タイプのものは早晩壊れると思っていた訳です。
思ったよりも長持ちしてしまいましたが、ついに先週(2003/1/21)壊れました。いざ壊れてみると、やっぱりさみしいもので、いろいろとまだ使えないかと接触具合を確認している自分がいじらしかったです。
これで晴れて、心置きなくLinux対応(そして実は早く欲しかったコネクタ一体型)を買えることになったので、早速製品の選定を始めました。
製品としては、やはり同じプラネックス・コミュニケーションズ社の「FNW-3600-TX」がLinux対応状況も良さそうだと判断しましたし、デザインも気に入っていました。しかし近場には全然売っていませんでした。秋葉へ行けば絶対にあるのでしょうが、最近私は近場の、しかもヨドバシやビックカメラなどのポイント還元のある場所で済ませるくせがついてしまい、近場での購入に拘っていました(どうでもいいことに拘る癖があります)。
しかし最も近いヨドバシ京急川崎駅前店には、IO-DATAかメルコの製品しかありません。これらのメーカはまったくだめだめで、Linux対応なんて、これっぽっちも考えていません。横浜まで足を伸ばしたところ、ビックピーカンに同社の「FNW-3603-TX」という製品が置いてありました。これも一応Linux対応をうたっていました。しかし同社のホームページをざっと見た感じでは、設定方法などが載っていなかったのでちょっと不安だったのですが、もう疲れたので購入することにしました。CardBus対応という点も、折角新しいのを買うなら、それがいいなということもあり、あまり悩まず購入した訳です。因みに2,880円 15%還元でした。
しかしこの決断が結局このページを書くような、ちょっと苦労をする結果を招いてしまいました。
製品の取説にはLinuxのことは一切書いてありません。勿論ドライバなるものは同梱されていません。まあこのあたりは全く期待をしていなかったので良しとしました。しかし同社のホームページには、稼動確認をとったというだけで、設定方法などもやっぱり全く書いてありませんでした。一応ホームページからフォームで入力して質問などをするということになっているようだったので、早速質問をして、回答を待つことにしました。ノートPCの利用の99%はWindows2000なので、別に急ぐ必要もなかったからです。
ただいろいろなサイトを検索すれば、だれかがやっているかもしれないと思い、ネットサーフをしていると、あるではないですか、「Planex FNW-3603TXのセットアップ」。全く同じ製品の話です。ただいやな情報も含まれていました。その人も最初は前述した同社のホームページのフォームで質問をしたのですが、何度も送ってみても、数ヶ月たっても返事が無いということで、仕方なく自分で情報収集してやったということした。
これは同社のサポートには期待できないと思い、そのサイトの情報に従い、設定を試みることにしました。
しかし、バージョンがちょっと違いました。Linuxもバージョンが違うと全然方法が違ったりします。特にCardBusは、カーネル2.2系と2.4系で認識のさせ方がかなり違うようです。
私のLavieは多分ビデオチップが一番ネックなのだと思うのですが、今までTurboLinux Workstation 6.0しか、まともにインストールできて、Xが動いたものもありませんでした。最新のものだといいのでしょうが、ディスクもあまり余裕がないので、どうしてもTurboの6.0でいきたいと考えていました。
上記サイトにも、TurboLinux Server 6.5 (カーネルが同じ2.2系)の話が出ていたのですが、同じようにやってもだめでした。単なる記述ミスなのかもしれませんが、私の予想では、いろんなことをやっていると、前提としてやるべきことが、あたりまえのようになって記述をし忘れる場合があるので、それなのではないかと思っています。
結局同サイトの情報、及び同サイトが参考にしたコレガのサイトの情報を総合した結果、何とか利用できるようになったので、その方法をこれから記述したいと思います。
ポイントはこのカードが、LANチップに「Realtek 8139C」だということ。同じチップなら、ほぼ同じ方法でTubolinux 6.0で動作させることができるはずです。また前提として、TurboLinux 6.0をインストールする時にPCMCIAを使うように設定しておくべきでしょう。ノートPCにインストールする場合、インストーラがPCMCIAを使うか聞いてくるはずです。それに使うと答えればいいだけです。OSインストール時にPCMCIAをインストールしなかった場合は、別途PCMCIAのrpmをインストールする必要があります。
まずドライバのソースファイルを、「SCYLDのサイトのネットワークのページ」から入手します。必要なファイルは以下です。
一応これだけいいのですが、面倒くさいし、他にも必要だと困るので、同ページにあるファイルをアーカイブ化した「netdrivers-3.3.tgz」を取ってきてしまえばいいでしょう。このアーカイブを適当な場所で解いて、2つのCソースファイルをコンパイルします。Makefileも同梱されていますが、残念ながらmakeは通りませんでした。
Makefileの記述を参考にしたところ、必要なモジュール作成のためには以下のコマンドでいいことが分かりました。
> gcc -DMODULE -DCARDBUS -O6 -c rtl8139.c -o realtek_cb.o -I /usr/src/linux/include -I /usr/src/linux/pcmcia-cs-3.0.14/include
> gcc -DMODULE -D__KERNEL__ -O6 -c pci-scan.c -I /usr/src/linux/include
これでモジュール「realtek_cb.o」と「pci-scan.o」が出来上がります。作成しなければならないドライバーモジュールはこの2つだけです。
次に2つのモジュールを、/lib/module/`uname -r`/pcmcia/ にコピーします。ネットワークドライバだと、/lib/module/`uname -r`/net/ だと考えるかもしれませんが、PCカードのドライバは皆こちらのようです。
コピーには以下のようなコマンドを打つのがカッコいいみたいですが、普通のコピーでも問題ありません。
> install -m 644 realtek_cb.o pci-scan.o /lib/module/`uname -r`/pcmcia/
これでモジュールの準備はOKです。次にPCMCIAの構成ファイル(/etc/pcmcia/config)に次の記述を追加します。
[/etc/pcmcia/config]
device "realtek_cb" class "network" module "cb_enabler", "realtek_cb"
card "Planex FNW-3603-TX CardBus DirectDock FastEthernet" |
card文はどんな記述でもいい訳ですが、インターフェース情報を表示する時などにここで設定したものが表示されますから、どうせなら実体に即したものがいいでしょう。それ以外は上記の通り、正確に記述します。
最後に通常のNICの設定時と同様に、turbonetcfg でネットワークの設定をしましょう。その上でネットワークとPCMCIAのサービスを再起動すれば完了です。
> /etc/rc.d/init.d/pcmcia restart
この時、終了時に「ピーッ」、起動時に「ピーッ、ピーッ」と鳴ったらOKです。起動時に「ピーッ、ブー」だったら、何らかの問題がありますから、一からやりなおした方がいいでしょう。どこかの手順に誤りがあります。
尚、PCカードを抜き挿しすることも、PCMCIAサービスの再起動と同様の効果があります。
> /etc/rc.d/init.d/network restart
カーネル2.2系では、PCカードのホットプラグなどがうまく動作しないようです。PCカードを抜き挿ししたり、PCMCIAサービスを再起動したときは、ネットワークも再起動する必要があります。実際はインターフェースの再起動だけでいいので、turbonetcfg でインターフェースの再起動をしてもいいでしょう。
これでネットにつながれば、ご喝采!
先に私はカーネル2.2系ではホットプラグがうまく動作していないと申し上げましたが、実はOS起動時にも正しく動作しませんでした。従ってこれはホットプラグの問題ではないのではないかと思い始めました。
結局、起動時、PCMCIAサービス再起動時、カード抜き挿し時(これはPCMCIAサービス再起動と同じことだと思いますが)の3つのケースで正常に動作しません。その後ネットワークサービスの再起動、またはインターフェースの再起動が必要です。まあカード抜き挿し時はまだ我慢できるとしても、起動時に正常に動作せず、いちいちもう一度ネットワークサービスの再起動しなければいけないのは、ちょっと納得がいきません。勿論カード抜き挿し時にも正常に動作しないというのも、PCカードの利点が失われることになるので、好ましい動作でないのは言うまでもありません。
ネットでこの点について、いろいろと情報を探しましたが、全くみつかりません。通常は問題がないのだろうか。何か手順に間違いがあるのか。ハードウェア環境に依存しているのか。疑問は全く解けませんでした。
起動時に関しては、ネットワークサービスの立ち上げがPCMCIAサービス起動の前に行われるのがいけないと思って、/etc/rc.d/以下のファイルを弄って、サービス起動の順序をいろいろと工夫してみました。しかしどうやってもうまくいきません。ネットワークサービスは非常に早い段階で起動されるようになっていたのですが、その後のサービスがネットワークサービスを前提にしているようなものも多かったので、これは変えることができないと判断し、PCMCIAサービスの起動を早めるようにしてみましたが、全くうまくいきませんでした。そもそもPCMCIAサービス自体が動作しなくなってしまいます。この方法は諦めました。
次にPCMCIAサービスを起動後にネットワークサービス再起動をすればいいのだから、PCMCIAサービス起動スクリプト(/etc/rc.d/init.d/pcmcia)の最後にネットワークサービス再起動を実施するコマンドを書けばいいと考えました。
[/etc/rc.d/init.d/pcmciaへのネットワークサービス再起動コマンドの追加]
・・・<略>・・・
EXITCODE=1 ・・・<略>・・・
'start') ・・・<略>・・・
if [ -d /var/lock/subsys ] ; then ・・・<略>・・・ |
上記のように設定したのですが、うまくいきませんでした。ここで起動時の問題は一旦諦めました。
その後抜き挿し時のことを調べていると、/var/log/messageの内容からカードマネージャ(cardmgr)がインターフェースの起動を実施していると思われるログが見つかりました。それは以下のような内容でした。
cardmgr: ./network start eth0
そこでいろいろネットで調べているうちに、最初は意味も分からずネットの情報に従って記述していたPCMCIAの構成ファイル(/etc/pcmcia/config)の「class "network"」の意味が分かりました。これは当該PCMCIAカードを読み込んだ場合、そのカードのクラスによって実施するスクリプトを決めるものでした。"ネットワーククラス"のカード(実際はそのドライバ)を読み込んだときは、「/etc/pcmcia/network」というスクリプトにアクションオプションとデバイスオプションをつけて実施するのだということも分かりました。
つまりカードマネージャが実施している上記コマンドは、「/etc/pcmcia/network」スクリプトをアクションオプションは「start」、デバイスオプションは「eth0」で実施していることを意味していました。要するに、ちゃんとPCMCIAサービス起動時(OS起動時、カード抜き挿し時も勿論含む)にネットワークインターフェースの再起動を実施していた訳です。
ではなぜその後、更にインターフェースの再起動が必要なのか、ここが問題となります。またよくよく/var/log/messageを見てみると、カードマネージャがこのコマンドを実行した後に、カーネルが最終的にモジュールを認識したと思われるログが出ていました。それがインターフェース再起動の3秒も後でした。もしかしたらインターフェースの再起動が早すぎるのかと思った訳です。カーネルがドライバモジュールを認識するのに時間がかかっているようでした。
そこで/etc/pcmcia/networkスクリプトの実際にインターフェースを起動するステップの前にスリープを入れてみました。
[/etc/pcmcia/networkへのスリープの追加]
action=$1 device=$2 case "${action:?}" in 'start') sleep 5 /etc/sysconfig/network-scripts/ifup ifcfg-${device} ;; 'stop') /etc/sysconfig/network-scripts/ifdown ifcfg-${device} ;; 'restart') /sbin/ifconfig ${device:?} down up ;; esac |
予想は的中です。これでカード抜き挿し時は勿論、起動時の問題もすべて一蓮托生で解決しました! 一応スリープ時間もいくつか試した結果、3秒なら問題ないことが分かりました(2秒ではだめだった)。カードを挿すときの音が「ビーッ、・・・ピーッ」となり、間に3秒のウェイトがあるのがよくわかります。
これで使っていくのには、殆ど問題のない状態になりました。まあ3秒のタイムラグくらい実用上は全く問題ありません。しかし何かしっくりこないものがありました。
というのは、この方法は決してスマートではないと思ったからです。モジュールの認識に時間がかかることがあるのであれば、例えばカードマネージャの設定などに、後処理スクリプト実行までに時間をあけるというようなオプションがあってもよさそうです。逆にそういうオプションがあるのであれば、こういうことはあり得るものだということが納得できます。
しかしカードマネージャについていろいろ調べましたが、そんなオプションは見つかりませんでした。ネットでも検索しましたが、そのような話が出てきません。
これでは納得がいきません。問題なく使えればいいという問題ではありません。こういうことに拘ってきたからこそ、今日の私があるので、引き続き調査をします。
問題はやはりドライバにあるとしか思えません。しかしドライバのソースファイルは最新です。問題があったとしても、改修されるのを待つ他ありません。しかし私には迷わずに試す価値があると思っていた、ある施策がありました。
プラネックス社のサポートは期待できないとのネット情報を前述しましたが、実はプラネックス社からは、メールを出した後4日後にドライバの場所を指示するメールが届いていました。既にカード自体は使えていましたし、ざっと中身を確認したところ、それ程私が既に行った内容と違っているとは思わなかったのでそのままにしていました。
しかしよく確認したところ、ドライバモジュールの数などが違っていました。またRedHat 6.2で実際に適用するための方法を日本語で記述した説明ファイルも添付されていました。これは期待できると思った訳です。早速このドライバを試すことにしました。ドライバはカーネル2.2系用と2.4系用に別途用意されていました。
カーネル2.4系用
http://www.planex.co.jp/support/driver/kar_24x.zip
カーネル2.2系用
http://www.planex.co.jp/support/driver/kar_22x.zip
カーネル2.2系用をダウンロードし、アーカイブを解きます。同梱されているRedHat 6.2用の説明書(Redhat62.txt)に従って作業をします。しかし「make all」のところで大量のエラーが出てmakeが通りません。
ネットで情報を探したところ、CFLAGSに「-V2.7.2.3」を追加することでmakeが通るようになるとの情報を得ました。早速makefileを以下のように書き換えてみました。
[makefileの書き換え]
・ ・ PCMCIA=/usr/src/pcmcia/include CC=gcc CFLAGS=-V2.7.2.3 -DMODULE -D__KERNEL__ -Wall -Wstrict-prototypes -O6 -I$(LINUX)/include ・ ・ |
この書き換えを行って、make allを実施したところ以下のように成功し、モジュール「pci-scan.o」、「rtl8139.o」、「cb_shim.o」が出来上がりました。
[make allの結果]
# make all gcc -V2.7.2.3 -DMODULE -D__KERNEL__ -Wall -Wstrict-prototypes -O6 -I/lib/modules/2.2.13-33/build/include -pipe -fno-strength-reduce -DMODVERSIONS -c -o pci-scan.o pci-scan.c gcc -V2.7.2.3 -DMODULE -D__KERNEL__ -Wall -Wstrict-prototypes -O6 -I/lib/modules/2.2.13-33/build/include -pipe -fno-strength-reduce -DMODVERSIONS -c -o rtl8139.o rtl8139.c gcc -DCARDBUS -I/lib/modules/2.2.13-33/build/include -I/usr/include -I/usr/src/pcmcia/include -V2.7.2.3 -DMODULE -D__KERNEL__ -Wall -Wstrict-prototypes -O6 -I/lib/modules/2.2.13-33/build/include -pipe -fno-strength-reduce -DMODVERSIONS -c cb_shim.c -o cb_shim.o # |
後は説明書どおり、make installや/etc/pcmcia/configファイルの変更(これは同梱されているconfigファイルをそのまま、/etc/pcmcia/にコピーしてしまってもいい)を行います。ネットワークの設定は既にしてあるので、後はPCMCIAサービスの再起動のみ。(勿論事前に/etc/pcmcia/networkスクリプトのsleepは外します)
起動時に「ピーッ、ピーッ」と鳴りました。おっ、ドライバはうまく動いているな。当然タイムラグもない。早速pingを打ってみると、ちゃんと通ります。カードを抜き挿ししてみましたが、その直後でもpingが通る。PC再起動後も同様、もやはネットワークインターフェースの再起動なしに正常に動作するようになりました。
やっぱり、これでなくっちゃ!