becker@cesdis.gsfc.nasa.gov
nakano@apm.seikei.ac.jp
PCI デバイスでは安全に自動検知 (probe) が行えるので、
以下のような行を /etc/conf.modules
に追加するだけで OK です。
alias eth1 tulip
`tulip' は使っているイーサーカードドライバの名前に変えてください。
ISA デバイスの自動検知は危ないことが多いので、
カードの I/O アドレスを指定しなければなりません。
複数のカードを一つのドライバで利用する場合は、
すべての I/O アドレスを指定する必要があります。
以下の行を /etc/conf.modules
に追加してください。
alias eth0 ne
alias eth1 ne
alias eth2 ne
options ne io=0x280,0x300,0x220
`ne' は使っているイーサーカードドライバの名前に変えてください。
標準的な Linux ディストリビューションが動いているシステムで、
デバイスドライバがカーネルに組み込まれている場合には、
/etc/lilo.conf
に以下の行を加えて
lilo コマンドを実行すれば OK です。
append = "ether=0,0,eth1 ether=0,0,eth2 ether=0,0,eth3"
以上、これだけです。 次にブートしたときから Linux は 2 枚目のイーサカードを認識してくれるはずです。
RedHat のようなディストリビューションでは、
ロード可能なデバイスドライバモジュールを排他的に利用しています。
このような場合は少々やっかいで、解はディストリビューションによって
異なります。お使いのディストリビューションがネットワークドライバを
モジュールで利用しているかどうかを調べるには、
/proc/modules
を見てください。
ロードされているモジュールが全てレポートされるので、
ネットワークモジュールがあるか探してみてください。
デバイスドライバモジュールは、次の 2つのいずれかによってロードされます。 ひとつは kerneld というプロセスです。これはカーネルからの ネットワークデバイスに対する要求を扱います。 もう一つは modprobe です。こちらは、要求されたデバイス全てを ロードしようとするものです (もちろん正しいデバイスがあれば、ですが)。
kerneld プロセスは設定ファイル /etc/conf.modules
を参照します。
ここには特定の機能に対する要求があったときにロードすべきデバイスドライバ
が記述してあります。イーサーネットドライバの場合は、機能の名前は
インターフェースの名前です。つまり "eth0" とか "eth1" とかです。
正しいドライバをロードするためには、これらの "eth*" をドライバの名前に
マップする (エイリアスする) 必要があります。 (3c509 以外の) ISA
デバイスでは、 I/O アドレスも必ず与えてください。
/etc/conf.modules
の例を示します。プライマリの
インターフェースとして WD8013 を I/O 0x300 に持ち、
2 枚の NE2000 アダプタ (I/O はそれぞれ 0x280 と 0x240) を
追加したシステムに対して、それぞれ `wd' と `ne' デバイス
ドライバモジュールをロードするような設定です。
alias eth0 wd
options wd io=0x300
alias eth1 ne
alias eth2 ne
options ne io=0x280,0x240
デフォルトでは、Linux のカーネルはイーサカードを 1 枚認識するとそれ以上 の自動検知を行いません。 複数のイーサカードを認識させるには 3 つの方法があります。 以下、やさしい順に並べます。
drivers/net/Space.c
内のを書き換えて、
カーネルのネットカード検索テーブルを変更する。普通は2番目の方法が良いでしょう。上で書いたのがこれです。
この節では、あなたが Linux の標準ブートローダである LILO を使っている ものとみなして話を進めます。
Linux のカーネルは、ブート時にパラメータを受け取ることができます。 ブート時には決められない設定をカーネルに渡すためです。 ネットワークアダプタに関しては、以下のパラメータが認識されます。
ether=<IRQ>,<IO-ADDR>,<PARAM1>,<PARAM2>,<NAME>
数字の指定には、10 進数, 8 進数 ('0'で始まる数字), 16 進数 ('0x'で始まる数字) を使うことができます。 最初に現われた数字以外の引数は、<NAME> (デバイス名) とみなされます。空白の引数は 0 とされます。省略された引 数は、デフォルトの設定のままになります。
ここには IRQ を書きます。ソフト的に IRQ 指定が可能なカードの場合は、 書いた値に設定されます。 ジャンパスイッチなどを使って指定するカードの場合には、 指定した値を書いてください。 '0' を書くとカードへIRQ を読みに行きますが、 それが不可能な場合は autoIRQ を使います。
このエントリには、検知させたい I/O アドレスを書きます。 ここに '0' を書くと、イーサカードで通常使われるアドレスを全て探索します。
通常は I/O アドレス領域の予約マップを使って探索するアドレスを決めます。 I/O アドレスを指定した場合にはこのマップは無視されます。 他のデバイスからこの IO 領域を探索されないようにするには、 "reserve=<IO-ADDR>,<EXTENT>" パラメタを使用します。
もともとこれらのパラメタは、共有メモリ型のアダプタ (WD8013など) で、メ モリアドレスを指定するために使われていました。今では、ドライバ固有のパ ラメタを指定することができるように拡張されています。
定義されているデバイス名を入れてください。標準的な kernel では、
eth0, eth1, eth2, eth3 が定義されています。ほかの
デバイス名 (PPP
とか SLIP
など) も定義されているかもしれませ
んが、それらは他の用途で用います。
LILO でこれらのブートパラメータをカーネルに渡すには、2 つの方法があ ります。ひとつはブートイメージの名前に続けて書く方法です。 次の例では 4 つのカードを一気に指定しています。
linux ether=0,0,eth1 ether=0,0,eth2 ether=0,0,eth3
これらをブートの度に入力するのは面倒ですし、
またこの方法では無人リブートができなくなってしまいます。
上記のパラメータを常に有効にすることもできます。
LILO のコンフィギュレーションファイル
/etc/lilo.conf
中で append 行によってこれらを指定し、
lilo を実行して変更を有効にします。
append = "ether=0,0,eth1 ether=0,0,eth2 ether=0,0,eth3"
いままでの方法でシステムの設定ができるのでしたら、 カーネルの変更はしない方が良いでしょう。 ソースを変えたことは他からわからないですし、 カーネルをアップデートする時の混乱の元にもなりかねません。 しかしそれでも、この方法をとるしかない場合もあります。
drivers/net/Space.c
には eth0...eth3
のエントリしか
ありません)カーネルを変更する場合は drivers/net/Space.c
を編集して、
必要な値を挿入します。
新しいデバイスを加える場合には chain を切らないように注意してください。
ソース中に既にあるリストを参考にしてください。
PCI (および EISA) のカードでは、自動検知は安全かつ適切に行われます。 したがってほとんどの PCI デバイスドライバは、特にパラメータを追加指定 しなくてもサポートされているカードを全て見つけてくれます。 例外は ISA と PCI の両方のカードをサポートするデバイスドライバです。 具体的には NE2000 と昔の LANCE/PCnet ドライバです。
v1.2.13 以前のカーネルでは、 LANCE ドライバはメモリの低位アドレスに 特殊な DMA バッファを必要としていました。したがって LANCE の自動検知は 他のネットワークデバイスに先立って行われました。 このカードの利点は、複数枚の LANCE カードの検知が自動的に行われる ことです (つまり、この文書はもともと不要なわけです)。 欠点は、LANCE のドライバは LILO から渡されるパラメタ (IRQ など) を 受け取れないことです。
3c509 は独特の仕様になっており、ISA バス上の探索を非常に安全に行なう ことができます。 ISA Plug-and-Play に似た (そしてより進んだ)、 activation メカニズムを用いています。 これは素晴らしいものですが、しかし残念ながら この探索手法は他のカードの手法とうまく共存させることができません。
このカードでは以下のことに注意してください:どのカードが『一番目』
に認識されるのかは、簡単にはわかりません。
認識される順番はイーサネットの HW アドレスによります。
つまり最も小さいイーサネットアドレスを持つカードが eth0 になり、
次が eth1... というようになるわけです。
eth0
のカードが抜かれれば、
それぞれの番号がひとつずつ減ることになります。
関連しますが、先に探索されるカードを差したまま無効にすることはできません。 また EEPROM での設定と違う I/Oアドレス/IRQ でカードを有効にしたり、 特定のアドレスで有効にすることもできません。
[翻訳者謝辞]
本文書を 2.0 に更新するにあたって、早川さんをはじめ JF-ML の皆さまに有益なコメントをいただきました。 ありがとうございました。