JF-INDEX (document list of JF Project)

Mini-HowTo on using multiple Ethercards with Linux

Don Becker, becker@cesdis.gsfc.nasa.gov

v2.00

中野武雄, nakano@apm.seikei.ac.jp

v2.00j3 22 May 1999


これは Linux に 2 枚以上のイーサネットアダプタを 認識させる方法を解説した文書です。 【訳注: 本文書は http://cesdis.gsfc.nasa.gov/linux/misc/multicard.html の翻訳です】

1. クイックスタート: ドライバモジュールの場合

2. クイックスタート: カーネル組み込みのドライバ

3. ドライバモジュール

4. 組み込みドライバ: やったこととその仕組み

5. ブートローダを使ってパラメータを渡す

6. カーネルを変更する

7. 特定のデバイスに対する注意


1. クイックスタート: ドライバモジュールの場合

1.1 PCI ドライバ

PCI デバイスでは安全に自動検知 (probe) が行えるので、 以下のような行を /etc/modules.conf に追加するだけで OK です。 【訳注: 原文では /etc/conf.modules でしたが、 現在は /etc/modules.conf の方が推奨されているので、 訳文では全て書き換えました。】

alias eth1 tulip

`tulip' は使っているイーサーカードドライバの名前に変えてください。

1.2 ISA ドライバ

ISA デバイスの自動検知は危ないことが多いので、 カードの I/O アドレスを指定しなければなりません。 複数のカードを一つのドライバで利用する場合は、 すべての I/O アドレスを指定する必要があります。 以下の行を /etc/modules.conf に追加してください。

 alias eth0 ne
 alias eth1 ne
 alias eth2 ne
 options ne io=0x280,0x300,0x220

`ne' は使っているイーサーカードドライバの名前に変えてください。


2. クイックスタート: カーネル組み込みのドライバ

標準的な Linux ディストリビューションが動いているシステムで、 デバイスドライバがカーネルに組み込まれている場合には、 /etc/lilo.conf に以下の行を加えて lilo コマンドを実行すれば OK です。

append = "ether=0,0,eth1 ether=0,0,eth2 ether=0,0,eth3"

以上、これだけです。 次にブートしたときから Linux は 2 枚目のイーサカードを認識してくれるはずです。


3. ドライバモジュール

RedHat のようなディストリビューションでは、 ロード可能なデバイスドライバモジュールを排他的に利用しています。 このような場合は少々やっかいで、解はディストリビューションによって 異なります。お使いのディストリビューションがネットワークドライバを モジュールで利用しているかどうかを調べるには、 /proc/modules を見てください。 ロードされているモジュールが全てレポートされるので、 ネットワークモジュールがあるか探してみてください。

デバイスドライバモジュールは、次の 2つのいずれかによってロードされます。 ひとつは kerneld というプロセスです。これはカーネルからの ネットワークデバイスに対する要求を扱います。 もう一つは modprobe です。こちらは、要求されたデバイス全てを ロードしようとするものです (もちろん正しいデバイスがあれば、ですが)。

kerneld プロセスは設定ファイル /etc/modules.conf を参照します。 ここには特定の機能に対する要求があったときにロードすべきデバイスドライバ が記述してあります。イーサーネットドライバの場合は、機能の名前は インターフェースの名前です。つまり "eth0" とか "eth1" とかです。 正しいドライバをロードするためには、これらの "eth*" をドライバの名前に マップする (エイリアスする) 必要があります。 (3c509 以外の) ISA デバイスでは、 I/O アドレスも必ず与えてください。

/etc/modules.conf の例を示します。プライマリの インターフェースとして 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


4. 組み込みドライバ: やったこととその仕組み

デフォルトでは、Linux のカーネルはイーサカードを 1 枚認識するとそれ以上 の自動検知を行いません。 複数のイーサカードを認識させるには 3 つの方法があります。 以下、やさしい順に並べます。

  • ブート時にカーネルにパラメータを渡す
  • 起動時に常にパラメータを渡すようにブートローダを設定する
  • drivers/net/Space.c 内にある、 カーネルのネットカード検索テーブルを変更する。

普通は2番目の方法が良いでしょう。上で書いたのがこれです。


5. ブートローダを使ってパラメータを渡す

この節では、あなたが Linux の標準ブートローダである LILO を使っている ものとみなして話を進めます。

Linux のカーネルは、ブート時にパラメータを受け取ることができます。 ブート時には決められない設定をカーネルに渡すためです。 ネットワークアダプタに関しては、以下のパラメータが認識されます。

ether=<IRQ>,<IO-ADDR>,<PARAM1>,<PARAM2>,<NAME>

数字の指定には、10 進数, 8 進数 ('0'で始まる数字), 16 進数 ('0x'で始まる数字) を使うことができます。 最初に現われた数字以外の引数は、<NAME> (デバイス名) とみなされます。空白の引数は 0 とされます。省略された引 数は、デフォルトの設定のままになります。

IRQ

ここには IRQ を書きます。ソフト的に IRQ 指定が可能なカードの場合は、 書いた値に設定されます。 ジャンパスイッチなどを使って指定するカードの場合には、 指定した値を書いてください。 '0' を書くとカードへIRQ を読みに行きますが、 それが不可能な場合は autoIRQ を使います。

IO-ADDR

このエントリには、検知させたい I/O アドレスを書きます。 ここに '0' を書くと、イーサカードで通常使われるアドレスを全て探索します。

通常は I/O アドレス領域の予約マップを使って探索するアドレスを決めます。 I/O アドレスを指定した場合にはこのマップは無視されます。 他のデバイスからこの IO 領域を探索されないようにするには、 "reserve=<IO-ADDR>,<EXTENT>" パラメタを使用します。

PARAM1,PARAM2

もともとこれらのパラメタは、共有メモリ型のアダプタ (WD8013など) で、メ モリアドレスを指定するために使われていました。今では、ドライバ固有のパ ラメタを指定することができるように拡張されています。

NAME

定義されているデバイス名を入れてください。標準的な 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"


6. カーネルを変更する

いままでの方法でシステムの設定ができるのでしたら、 カーネルの変更はしない方が良いでしょう。 ソースを変えたことは他からわからないですし、 カーネルをアップデートする時の混乱の元にもなりかねません。 しかしそれでも、この方法をとるしかない場合もあります。

  • 4つ以上のデバイスを有効にする必要がある (古いカーネルの drivers/net/Space.c には eth0...eth3 のエントリしか ありません)
  • 自動検知の対象とするアダプタの種類を制限したい (そのままではカードを認識する時に別のカードと間違ってしまう場合など)
  • ethN 以外のデバイス名 (N は数字) を使いたい場合

カーネルを変更する場合は drivers/net/Space.c を編集して、 必要な値を挿入します。 新しいデバイスを加える場合には chain を切らないように注意してください。 ソース中に既にあるリストを参考にしてください。


7. 特定のデバイスに対する注意

7.1 PCI カード

PCI (および EISA) のカードでは、自動検知は安全かつ適切に行われます。 したがってほとんどの PCI デバイスドライバは、特にパラメータを追加指定 しなくてもサポートされているカードを全て見つけてくれます。 例外は ISA と PCI の両方のカードをサポートするデバイスドライバです。 具体的には NE2000 と昔の LANCE/PCnet ドライバです。

7.2 LANCE/PCnet のカード

v1.2.13 以前のカーネルでは、 LANCE ドライバはメモリの低位アドレスに 特殊な DMA バッファを必要としていました。したがって LANCE の自動検知は 他のネットワークデバイスに先立って行われました。 このカードの利点は、複数枚の LANCE カードの検知が自動的に行われる ことです (つまり、この文書はもともと不要なわけです)。 欠点は、LANCE のドライバは LILO から渡されるパラメタ (IRQ など) を 受け取れないことです。

7.3 ISA モードの 3c509

3c509 は独特の仕様になっており、ISA バス上の探索を非常に安全に行なう ことができます。 ISA Plug-and-Play に似た (そしてより進んだ)、 activation メカニズムを用いています。 これは素晴らしいものですが、しかし残念ながら この探索手法は他のカードの手法とうまく共存させることができません。

このカードでは以下のことに注意してください:どのカードが『一番目』 に認識されるのかは、簡単にはわかりません。 認識される順番はイーサネットの HW アドレスによります。 つまり最も小さいイーサネットアドレスを持つカードが eth0 になり、 次が eth1... というようになるわけです。 eth0 のカードが抜かれれば、 それぞれの番号がひとつずつ減ることになります。

関連しますが、先に探索されるカードを差したまま無効にすることはできません。 また EEPROM での設定と違う I/Oアドレス/IRQ でカードを有効にしたり、 特定のアドレスで有効にすることもできません。

[翻訳者謝辞]

本文書を 2.0 に更新するにあたって、早川さんをはじめ JF-ML の皆さまに有益なコメントをいただきました。 ありがとうございました。


sgml21html conversion date: Wed Mar 21 20:56:14 JST 2001

[