NICの認識

Linux活用日記

Last modified: May 24th, 2002


Table of Contents



Linux では, OS のインストール時にネットワーク接続の設定を行うことができます. また, インストール後であっても多くのネットワークドライバがモジュールとして組み込まれていますので大抵のカードは自動認識されます. もし自動認識しなかった場合には手動で設定することになります. しかしドライバが無い場合は, 認識させることはほとんど不可能になってしまいます. なぜなら Linux は, Windows などと違い専用のドライバが用意されているケースが少ないからです. ただし, 手持ちの NIC が認識されないからと言って諦めるのは早いかと思います. NIC が認識されない原因はさまざまです. 究明するためにはひとつずつ確認していくしかないのですが, 例えばケーブルがはずれているとかハブの電源がはずれている, 壊れている, といった物理的な問題であることもありがちです. また設定が間違っていたために正常に動作しない, ソースコードを修正したら認識した, といったこともあり得ます. この文書では NIC を認識させる事例をご紹介していきたいと思います.



コマンドで調べてみる


まずは、ドライバモジュールが組み込まれているかどうかを次のコマンドで確認してみましょう.

# lsmod

このコマンドを実行することにより, 組み込まれているモジュールが確認できます. 例えば 「VIA Rhine」 のチップを使ってるカードであればここに "via-rhine" が表示されればいいわけです.

# ifconfig -a

このコマンドを実行して出力された内容に eth0 と書かれていれば認識自体はしています.

また次のコマンドを実行し, システム起動時に認識されているかどうかを確認できます.

#tail -n /var/log/messages | grep eth0 ---> n は行数を指定

続いて, ping を通してみます.

# ping -c3 192.168.0.3
# ping -c3 www.ymorning.or.jp

このように ping コマンドを実行してみます. IP アドレスなどは一例ですので自身の環境に置き換えて読んでください. この ping を Windows 上から実行するにはコマンドプロンプトから次のように実行してください.

C:\WINDOWS>ping 192.168.1.1
C:\WINDOWS> ping www.ymorning.or.jp

Linux 上で, KTerm などの端末エミュレータなどから ping コマンドを実行した場合, 正常に通信できていれば下表のように返ってくるはずです.

# ping 192.168.1.64

PING 192.168.1.64 (192.168.1.64): 56 data bytes
64 bytes from 192.168.1.64: icmp_seq=0 ttl=255 time=1.0 ms
64 bytes from 192.168.1.64: icmp_seq=1 ttl=255 time=0.9 ms
64 bytes from 192.168.1.64: icmp_seq=2 ttl=255 time=0.9 ms
64 bytes from 192.168.1.64: icmp_seq=3 ttl=255 time=0.9 ms
64 bytes from 192.168.1.64: icmp_seq=4 ttl=255 time=0.9 ms
64 bytes from 192.168.1.64: icmp_seq=5 ttl=255 time=0.9 ms
64 bytes from 192.168.1.64: icmp_seq=6 ttl=255 time=0.9 ms

--- 192.168.1.64 ping statistics ---
7 packets transmitted, 7 packets received, 0% packet loss
round-trip min/avg/max = 0.9/0.9/1.0 ms

このように, ping が返ってくればネットワークの認識自体は出来ています. それでもネットワークに接続できないのであれば, あとは設定内容のいずれかが間違ってるかといったことになりますので, IPアドレス, NETMASK, NETADDRESS, BROADCAST, GATEWAY などの設定が間違っていないかどうか確かめてみてください.

また, DNS の名前解決が出来ていないこともあるかも知れませんので次のコマンドを実行して確認してみてください.

# nslookup www.ymorning.or.jp

必要なドライバがわからない場合


手持ちのカードがどのドライバを必要としているかが不明な場合には, NIC のメーカーの web サイトなどに情報が掲載されているかも知れません. 最近では多くのメーカーが Linux での設定事例を公開されていますので確認してみる価値はあるかと思います.

○各メーカーのLinux関連情報

コレガ OS 対応情報 (PC-UNUX)
プラネックス・コミュニケーションズ Linux
ラトックシステム
Linksys Linux 情報
メルコ Linux 動作確認情報
LanNeed(Elecom) Linux 動作確認情報
Intel® PRO/100 Linux用ドライバ

また次のサイトから最新の NIC ドライバをダウンロードできます.

Linux Network Drivers


ドライバモジュールの組み込み


NIC を自動認識できなかった場合, どのドライバモジュールが必要なのかがわかれば手動で組み込むことができます. この項ではその手順についてご説明します.

Linux には一体どのようなNIC ドライバが用意されているのでしょうか? これはカーネルバージョンや使用環境により異なってきます. これらはモジュール化された状態で /lib/modules/2.x..x/net に置いてあります. もしも手持ちの NIC が自動認識できない場合にはどのドライバが必要なのかを確認 し, 以下の手順のように手動で設定することで認識されることがあります. そして例にあるように, 下表一覧のドライバを使用する NIC は他にも沢山あります. 例えば, ディストリビューションによっては rt8139.o と via-rhine.o, lance.o などのモジュールがはじめから用意されているもののインストール時に自動認識できないことがあります. そのような場合に直接, 設定ファイルを編集し, 手動で組み込むことになるわけです.

○ サポートされている主なチップ(使用環境により異なります)

チップ ドライバ
3COM 3c509 3c509
3COM 3c59x 3c59x
3COM 3c90x 3c59x
3COM 3c905 3c59x
3COM 3c501 3c501
3COM 3c503 3c503
3COM 3c505 3c505
3COM 3c507 3c507
3COM 3c523 3c523
3COM 3c527 3c527
ARCNet arcnet
Allied Telesis AT1700 at1700
AMD LANCE lance
AMD PCnet32 pcnet32
SMC Ultra smc-ultra
SMC 9xxx smc9194
NI5010 ni5010
NI5210 ni52
NI6510 ni65
RealTek 8129/8139 rtl8139
Cabletron E21xx e2100
DEPCA depca
EtherWorks3(DE203, DE204, DE205) ewrk3
Intel EtherExpress 16 eexpress
Intel EtherExpressPro eepro
Intel EtherExpressPro/100 eepro100
FMV-181/182/183/184 fmv18x
HP PCLAN+ (27247B and 27252A) hp-plus
HP PCLAN (27245 and 27x series) hp
ICL EtherTeam 16i/32 eth16i
NE2000 and Clones ne
NE2 (ne2000 MCA Version) ne2
Ansel Communications EISA 3200 ac3200
DM9102 PCI Fast Ethenet Adapter dmfe
Generic DEChip & DIGITAL EtherWORKS PCI/EISA de4x5
Mylex EISA LNE390A/B lne390
Novell/Eagle/Microdyne NE3200 EISA ne3200
NE2000 PCI and clones ne2k-pci
Tl ThunderLAN tlan
SiS 900/7016 PCI Fast Ethernet Adapter sis900
VIA Rhine via-rhine
SMC EtherPower II epic100
Apricot Xen-II apricot
CS89x cs89x

1. アイオーデータ ET100/PCI の認識例

設定ファイル /etc/conf.modules または /etc/modules.conf に次の1行を書き足す.

alias eth0 rtl8139

2. メルコ LGY-PCI-TXR の認識例

設定ファイル /etc/conf.modules または /etc/modules.conf に次の1行を書き足す.

alias eth0 via-rhine

設定ファイル /etc/conf.modules または /etc/modules.conf にこれらの設定を書き足したあと, 次のコマンドを実行します.

# /etc/init.d/network stop
# depmod -av
# rmmod via-rhine
# modprobe via-rhine
# /etc/init.d/network start

このようにすることでモジュールが組み込まれます.

もしも ISA のカードであれば次のように明示する必要があります(PCI の場合は不要です). この例ではモジュール ne.o を組み込むために書き足すものです.

alias eth0 ne
options ne io=0x300 irq=5


モジュールが正常に組込まれたかどうかを確認するには次のコマンドを実行します.

# lsmod

ここでモジュールが表示されたなら次のコマンドを実行して network を再起動します. NIC が eth0 で認識されるものとします.

# /etc/rc.d/init.d/network restart
# ifconfig ip-address broadcast broadcast-address netmask subnetmask
# ifconfig eth0 up

次に ifconfig で認識状況を確認します.

# ifconfig -a

ここに eth0 が表示されれば正常に動作していることになります.

ここまでの手順を行っても正常に動作しない場合は, ドライバや設定以外に問題があるのかも知れません. 物理的な障害が発生していないのであれば, 例えば IRQ の値が間違っているのかも知れません. カードを装着するときに PCI スロットの差込位置によって IRQ が変化しますので差込位置を換えてみるのもいいでしょう. また, BIOS の設定で Plug & Play が有効になっていると正常に認識できないことがありますのでここを無効にしてみるのもひとつの方法です. また, ドライバのバージョンが古いと動作しないものがありますので, 最新のドライバにする必要があるかも知れません. ドライバのアップデートの手順は下記文書をご参照ください.

Tulip ドライバのインストール


これら要因のいずれかが特定できて, 修正できたらさきほどの via-rhine と同じ手順で設定を反映します.

まず, network を停止します.

# /etc/rc.d/init.d/network stop

組み込まれているモジュールを削除します.

# depmod -av

# rmmod tulip ---> (tulip.o の場合)

もう一度, モジュールを読み込みます.

# modprobe tulip

network を起動します.

# /etc/rc.d/init.d/network start

これで, 正常に動作するはずです.


NIC ドライバのコンパイルとインストール


前項に書いたとおり, NIC ドライバの中には最新のバージョンに差し替えることにより, 正常に動作することがあります. 例えば DEC21140 互換製品で, Tulip 互換であるにもかかわらず動作しない, という話を聞きますがこのような場合は, 新しい Tulip ドライバに入れ替えることによって動作することがあります. ここでは入手したドライバのソースを入手し, インストールする手順の一例をご紹介します.

最新ドライバの入手先:
Linux Network Drivers

ここでは, via-rhine ドライバのインストールを一例としてご紹介してみます. まず via-rhine.c と pci-scan.c を入手します. そして次のようにコンパイルします. このコンパイルオプションは via-rhine.c をエディタなどで開けば末尾に書かれていますので読んでおいた方がいいでしょう. また, 上記ドライバ入手先には他にも Redhat Linux 7 系バージョンでのコンパイル時の問題についての情報も書かれていますのでご確認下さい.

# egcs -DMODULE -D __KERNEL __ -DEXPORT_SYMTAB -Wall -Wstrict-prototypes -O2 -c pci-scan.c
# egcs -DMODULE -Wall -Wstrict-prototypes -O2 -c via-rhine.c

これでエラーが出なければ ".o" というオブジェクトファイルが作られます. そしてこれをインストールしますが, 古い via-rhine.o が残っている場合は次のようにバックアップしておきます.

# mv /lib/modules/`uname -r `/net/via-rhine.o /lib/modules/`uname -r `/net/via-rhine.o.bak

次に新しく出来たドライバをインストールします.

# install -m644 -o root -g root tulip.o /lib/modules/ `uname -r`/net/
# install -m644 -o root -g root pci-scan.o /lib/modules/ `uname -r`/net/
# /etc/init.d/network stop
# depmod -av

上記の `uname -r` は, カーネルバージョンでも構いません. 例えば自身の環境のカーネルバージョンが 2.2.16-22 ならば 2.2.16-22 とすればいいのです.

以上, エラーが出なければドライバのインストールは成功ですので, 後はモジュールを組み込みます.

# modprobe via-rhine

これを起動時に認識させましょう. そのためには /etc/modules.conf に以下のように書き足します.

alias eth0 via-rhine

次にネットワークを再起動します.

# /etc/init.d/network start

これで起動時に認識できるようになるはずです.


ところで, コンパイル時に以下のようなエラーが出ることがあります.

linux/version.h: No such file or directory

このような場合は, version.h を更新したら良いかもしれませんので次のように実行してみてください.

# cd /usr/src/linux
# make include/linux/version.h

ちなみに, これらの作業を行うためには kernel-headers と kernel-source がインストールされている必要がありますので事前に確認しておきましょう.

尚, ここでは, via-rhine の例でしたが tulip ドライバの例もご参照ください.


2枚目の NIC の認識


2枚目の NIC の認識事例をご紹介します.

2枚目の NIC を手動で認識させる場合, 既に認識されている1枚目のカードが eth0 となっているのに対し, 下記のように eth1 として /etc/conf.modules ( または modules.conf ) に書き足します. この事例では1枚目のモジュールドライバが tulip で, 2枚目が via-rhine であるとします.

alias eth0 tulip ---> 1枚目
alias eth1 via-rhine ---> 2枚目

次にコマンドを実行してモジュールを読込みます.

# modprobe via-rhine

次に, モジュールが正常に組込まれたかどうか確認します.

# lsmod


以上が完了したらネットワークの設定を行います. 設定後, network を再起動し, eth1 を起動させます.

# /etc/rc.d/init.d/network restart

または

# /etc/init.d/network restart

# ifconfig eth1 up

以上の手順で2枚目の NIC が認識できるようになるはずです.


HOME