<!doctype linuxdoctr system>
<article>
<title>Mini-HowTo on using multiple Ethercards with Linux
<author>Don Becker, <tt/becker@cesdis.gsfc.nasa.gov/
<date>v2.00
<trans>中野武雄, <tt/nakano@apm.seikei.ac.jp/
<tdate>v2.00j3 22 May 1999

<abstract>
<!--O
This is an short note on configuring  Linux to recognize multiple ethernet
adapters.
-->
これは Linux に 2 枚以上のイーサネットアダプタを
認識させる方法を解説した文書です。
【訳注: 本文書は
<URL URL="http://cesdis.gsfc.nasa.gov/linux/misc/multicard.html">
の翻訳です】
</abstract>

<sect>クイックスタート: ドライバモジュールの場合
<sect1>PCI ドライバ
<p>
<!--O
<P>PCI devices have safe probes, so you can just add the following line to
<tt>/etc/conf.modules</tt>:
-->
PCI デバイスでは安全に自動検知 (probe) が行えるので、
以下のような行を <tt>/etc/modules.conf</tt> に追加するだけで OK です。
【訳注: 原文では /etc/conf.modules でしたが、
現在は /etc/modules.conf の方が推奨されているので、
訳文では全て書き換えました。】

<tscreen><verb>
alias eth1 tulip
</verb></tscreen>

<!--O
where 'tulip' is the name of the correct driver.
-->
`tulip' は使っているイーサーカードドライバの名前に変えてください。

<sect1>ISA ドライバ
<p>
<!--O
<P>ISA devices tend to have dangerous probes, so you must specify the I/O
address of the cards.  Multiple cards supported by a single driver requires
specifying all of the I/O address.  Add the following lines to
<tt>/etc/conf.modules</tt>:
-->
ISA デバイスの自動検知は危ないことが多いので、
カードの I/O アドレスを指定しなければなりません。
複数のカードを一つのドライバで利用する場合は、
すべての I/O アドレスを指定する必要があります。
以下の行を <tt>/etc/modules.conf</tt> に追加してください。

<tscreen><verb>
 alias eth0 ne
 alias eth1 ne
 alias eth2 ne
 options ne io=0x280,0x300,0x220
</verb></tscreen>

<!--O
where 'ne' is the name of the correct driver.
-->
`ne' は使っているイーサーカードドライバの名前に変えてください。

<sect>クイックスタート: カーネル組み込みのドライバ
<p>
<!--O
<P>For systems running a Linux distribution with built-in device drivers,
just add this line to the top of your <i>/etc/lilo.conf</i> file and re-run
`lilo':
-->
標準的な Linux ディストリビューションが動いているシステムで、
デバイスドライバがカーネルに組み込まれている場合には、
<tt>/etc/lilo.conf</tt> に以下の行を加えて
lilo コマンドを実行すれば OK です。

<tscreen><verb>
append = "ether=0,0,eth1 ether=0,0,eth2 ether=0,0,eth3"
</verb></tscreen>

<!--O
<P>That's all there is to it.  The next time you boot Linux should
probe for up to four ethercards.
-->
以上、これだけです。
次にブートしたときから Linux は 2 枚目のイーサカードを認識してくれるはずです。

<sect>ドライバモジュール
<!--O
<P>For distributions such as RedHat that use loadable device driver modules
exclusively the situation is slightly more complex, and
distribution-specific.  You can tell if your distribution is using network
driver modules by looking for a network module in <tt>/proc/modules</tt>,
which reports all loaded modules.
-->
<p>RedHat のようなディストリビューションでは、
ロード可能なデバイスドライバモジュールを排他的に利用しています。
このような場合は少々やっかいで、解はディストリビューションによって
異なります。お使いのディストリビューションがネットワークドライバを
モジュールで利用しているかどうかを調べるには、
<tt>/proc/modules</tt> を見てください。
ロードされているモジュールが全てレポートされるので、
ネットワークモジュールがあるか探してみてください。

<!--O
<P>Device drivers modules are loaded either by a process called
'<i>kerneld</i>' which handles the kernel's request for a network device, or
'<i>modprobe</i>' which attempts to load every device driver module in the
hope that one will find a valid device.
-->
デバイスドライバモジュールは、次の 2つのいずれかによってロードされます。
ひとつは kerneld というプロセスです。これはカーネルからの
ネットワークデバイスに対する要求を扱います。
もう一つは modprobe です。こちらは、要求されたデバイス全てを
ロードしようとするものです (もちろん正しいデバイスがあれば、ですが)。

<!--O
<p>The 'kerneld' process reads a configuration file
<tt>/etc/conf.modules</tt> which describes the device driver to load when a
request is made for a specific capability.  For Ethernet drivers the
name of the capability is the interface name e.g. "eth0" or "eth1".  In
order to load the proper driver, the "eth*" name must be mapped ("aliased")
to the driver name.  For ISA devices (except the 3c509), the I/O addresses
must also be supplied.
-->
kerneld プロセスは設定ファイル <tt>/etc/modules.conf</tt> を参照します。
ここには特定の機能に対する要求があったときにロードすべきデバイスドライバ
が記述してあります。イーサーネットドライバの場合は、機能の名前は
インターフェースの名前です。つまり "<it/eth0/" とか "<it/eth1/" とかです。
正しいドライバをロードするためには、これらの "eth*" をドライバの名前に
マップする (エイリアスする) 必要があります。 (3c509 以外の) ISA
デバイスでは、 I/O アドレスも必ず与えてください。

<!--O
<p>An example <tt>/etc/conf.modules</tt> loading the device driver module
'ne' to support two additional NE2000 adapters at I/O 0x280 and 0x240 on a
system that uses a WD8013 card at 0x300 as its primary interface:
-->
<tt>/etc/modules.conf</tt> の例を示します。プライマリの
インターフェースとして WD8013 を I/O 0x300 に持ち、
2 枚の NE2000 アダプタ (I/O はそれぞれ 0x280 と 0x240) を
追加したシステムに対して、それぞれ `wd' と `ne' デバイス
ドライバモジュールをロードするような設定です。

<tscreen><verb>
alias eth0 wd
options wd io=0x300
alias eth1 ne
alias eth2 ne
options ne io=0x280,0x240
</verb></tscreen>

<sect>組み込みドライバ: やったこととその仕組み
<p>
<!--O
<P>By default a stock Linux kernel probes for a single ethercard, and once
one is found the probe ceases.  There are three defined ways to cause the
kernel to probe for additional cards.  In increasing order of difficulty and
permanence they are:
-->
デフォルトでは、Linux のカーネルはイーサカードを 1 枚認識するとそれ以上
の自動検知を行いません。
複数のイーサカードを認識させるには 3 つの方法があります。
以下、やさしい順に並べます。

<!--O
<ul>
<li>Passing parameters to your kernel at boot time.
<li>Configuring your boot loader to always pass those parameters.
<li>Modifying the kernel netcard probe tables in <b>drivers/net/Space.c</b>.
</ul>
-->
<itemize>
<item>ブート時にカーネルにパラメータを渡す
<item>起動時に常にパラメータを渡すようにブートローダを設定する
<item><tt>drivers/net/Space.c</tt> 内にある、
カーネルのネットカード検索テーブルを変更する。
</itemize>

<!--O
<P>For most people the second method is most appropriate, and it's the
one that was described above.
-->
普通は２番目の方法が良いでしょう。上で書いたのがこれです。

<sect>ブートローダを使ってパラメータを渡す
<p>
<!--O
<P>In the following instructions it's assumed that you are using the standard
Linux boot loader, `<i>LILO</i>'.
-->
この節では、あなたが Linux の標準ブートローダである LILO を使っている
ものとみなして話を進めます。

<!--O
<P>The Linux kernel recognizes certain parameters passed at boot-time.  Most
often these parameters specify aspects of the configuration that cannot be
determined at boot-time.  For network adaptors the following parameter is
recognized:
-->
Linux のカーネルは、ブート時にパラメータを受け取ることができます。
ブート時には決められない設定をカーネルに渡すためです。
ネットワークアダプタに関しては、以下のパラメータが認識されます。

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

<!--O
Valid numeric arguments may be in decimal, octal (with a leading '0')
or hexadecimal (preceded by a '0x').  The first non-numeric argument
is taken to be the <i>NAME</i> of the device.  Empty arguments are
taken to be zero, and any omitted arguments before the name are left
unchanged.
-->
数字の指定には、10 進数, 8 進数 ('0'で始まる数字), 16 進数
('0x'で始まる数字) を使うことができます。
最初に現われた数字以外の引数は、&lt;NAME&gt;
(デバイス名) とみなされます。空白の引数は 0 とされます。省略された引
数は、デフォルトの設定のままになります。

<descrip>
<!--O
<dd>This entry specifies the IRQ value to be set (on boards with
software-settable IRQs) or used (on boards with jumpered IRQs).  A
value of '0' means to read the IRQ line from the board (if possible)
or use autoIRQ if the board doesn't provide a way to read the IRQ.
-->
<tag/IRQ/
ここには IRQ を書きます。ソフト的に IRQ 指定が可能なカードの場合は、
書いた値に設定されます。
ジャンパスイッチなどを使って指定するカードの場合には、
指定した値を書いてください。 '0' を書くとカードへIRQ を読みに行きますが、
それが不可能な場合は autoIRQ を使います。

<tag/IO-ADDR/
<!--O
<dd>This entry specifies a single base I/O address to probe.
A value of zero specifies that all reasonable I/O address are to be probed.
-->
このエントリには、検知させたい I/O アドレスを書きます。
ここに '0' を書くと、イーサカードで通常使われるアドレスを全て探索します。

<!--O
<P>Normally an I/O region reservation map is used to decide if a
location can be probed.  This map is ignored if an I/O address is specified.
This allows the "reserve=&lt;IO-ADDR>,&lt;EXTENT>" parameter to exclude
other device probes from an IO region.
-->
通常は I/O アドレス領域の予約マップを使って探索するアドレスを決めます。
I/O アドレスを指定した場合にはこのマップは無視されます。
他のデバイスからこの IO 領域を探索されないようにするには、
"reserve=&lt;IO-ADDR&gt;,&lt;EXTENT&gt;" パラメタを使用します。

<!--O
<dt>PARAM1,PARAM2
<dd>Originally these entries were for specifying the memory address of
adaptors that use shared memory, like the WD8013.  Over time they have
been extended to provide other driver-specific information.
-->
<tag/PARAM1,PARAM2/
もともとこれらのパラメタは、共有メモリ型のアダプタ (WD8013など) で、メ
モリアドレスを指定するために使われていました。今では、ドライバ固有のパ
ラメタを指定することができるように拡張されています。

<!--O
<dt>NAME
<dd>The name of a predefined device.  The stock kernel defines at
least "eth0", "eth1", "eth2", and "eth3".  Other devices names (e.g.
for PPP, SLIP, or a pocket ethernet device) may exist but will have
different semantics.
-->
<tag/NAME/
定義されているデバイス名を入れてください。標準的な kernel では、
<it/eth0/, <it/eth1/, <it/eth2/, <it/eth3/ が定義されています。ほかの 
デバイス名 (<tt/PPP/ とか <tt/SLIP/ など) も定義されているかもしれませ
んが、それらは他の用途で用います。
</descrip>

<!--O
<P>LILO provides two ways to pass these boot-time parameters to the kernel.
The most common way to do this is to type them immediately after specifying
the name of the boot image.  The following example enables all four of the
available probe slots.
-->
LILO でこれらのブートパラメータをカーネルに渡すには、2 つの方法があ
ります。ひとつはブートイメージの名前に続けて書く方法です。
次の例では 4 つのカードを一気に指定しています。

<tscreen><verb>
linux ether=0,0,eth1 ether=0,0,eth2 ether=0,0,eth3
</verb></tscreen>

<!--O
<P>Of course this is pretty complicated to type in at each boot, and
would preclude unattended reboots.  You can make the kernel parameters
permanent by adding an "append" line to your LILO configuration file,
<i>/etc/lilo.conf</i>, and running LILO to install your updated configuration.
-->
これらをブートの度に入力するのは面倒ですし、
またこの方法では無人リブートができなくなってしまいます。
上記のパラメータを常に有効にすることもできます。
LILO のコンフィギュレーションファイル 
<tt>/etc/lilo.conf</tt> 中で <it/append/ 行によってこれらを指定し、 
lilo を実行して変更を有効にします。

<tscreen><verb>
append = "ether=0,0,eth1 ether=0,0,eth2 ether=0,0,eth3"
</verb></tscreen>

<sect>カーネルを変更する
<p>
<!--O
<P>If it's possible for you to configure your system without modifying
the kernel source, I recommend that you do so.  Modifying the source
code isn't self-documenting and results in extra complications at
upgrade time.  Still there are a few instances where it is
appropriate:
-->
いままでの方法でシステムの設定ができるのでしたら、
カーネルの変更はしない方が良いでしょう。
ソースを変えたことは他からわからないですし、
カーネルをアップデートする時の混乱の元にもなりかねません。
しかしそれでも、この方法をとるしかない場合もあります。

<!--O
<ul>
<li>When you need to enable more than four devices.  (The
drivers/net/Space.c in older kernels only has entries for eth0...eth3.)
<li>When you must limit the probe types to a subset of possible card types
e.g. when a probe confuses a different type of device.
<li>When you want a device name other than eth<i>N</i>.
</ul>
-->
<itemize>
<item>４つ以上のデバイスを有効にする必要がある (古いカーネルの
<tt>drivers/net/Space.c</tt> には <tt/eth0...eth3/ のエントリしか
ありません)
<item>自動検知の対象とするアダプタの種類を制限したい
(そのままではカードを認識する時に別のカードと間違ってしまう場合など)
<item><it/ethN/ 以外のデバイス名 (N は数字) を使いたい場合
</itemize>

<!--O
If you've decided to go this route, edit the device list in
drivers/net/Space.c to insert your desired values.  If you need to add
a new device take care that you preserve the chaining: use the
existing list entries as a guide.
-->
カーネルを変更する場合は <tt>drivers/net/Space.c</tt> を編集して、
必要な値を挿入します。
新しいデバイスを加える場合には chain を切らないように注意してください。
ソース中に既にあるリストを参考にしてください。

<sect>特定のデバイスに対する注意
<sect1>PCI カード
<!--O
PCI (and EISA) cards are safe and reliable to probe for, so most PCI device
drivers find all supported cards with no additional parameters.  The
exceptions are device drivers that support both ISA and PCI versions of a
card: the NE2000 and the older LANCE/PCnet drivers.
-->
<p>
PCI (および EISA) のカードでは、自動検知は安全かつ適切に行われます。
したがってほとんどの PCI デバイスドライバは、特にパラメータを追加指定
しなくてもサポートされているカードを全て見つけてくれます。
例外は ISA と PCI の両方のカードをサポートするデバイスドライバです。
具体的には NE2000 と昔の LANCE/PCnet ドライバです。

<sect1>LANCE/PCnet のカード
<!--O
The kernel v1.2.13 and earlier LANCE driver requires special low-memory
DMA buffers, and so the LANCE probe occurs earlier than the
other network device probes. The upside of this is that you could ignore
this section: multiple LANCE cards were automatically probed for.  The
downside is that the earlier LANCE driver did't use the LILO parameters
e.g. IRQ. 
-->
<p>
v1.2.13 以前のカーネルでは、 LANCE ドライバはメモリの低位アドレスに
特殊な DMA バッファを必要としていました。したがって LANCE の自動検知は
他のネットワークデバイスに先立って行われました。
このカードの利点は、複数枚の LANCE カードの検知が自動的に行われる
ことです (つまり、この文書はもともと不要なわけです)。
欠点は、LANCE のドライバは LILO から渡されるパラメタ (IRQ など) を
受け取れないことです。

<sect1>ISA モードの 3c509
<!--O
P>The 3c509 has a unique feature that allows truly safe probing on the
ISA bus.  It's an activation mechanism that is similar to (and predates) ISA
Plug-and-Play.  This is great, but unfortunately for us this method doesn't
mix well with the rest of the probes.
-->
<p>
3c509 は独特の仕様になっており、ISA バス上の探索を非常に安全に行なう
ことができます。
ISA Plug-and-Play に似た (そしてより進んだ)、
activation メカニズムを用いています。
これは素晴らしいものですが、しかし残念ながら
この探索手法は他のカードの手法とうまく共存させることができません。

<!--O
<P>The most noticeable aspect is that it's difficult to predict
<i>a priori</i> which card will be accepted "first" -\- the order is based
on the hardware ethernet address.  That means that the ethercard with the
lowest ethernet address will be assigned to "eth0", and the next to "eth1",
etc.  If the "eth0" ethercard is removed, they all shift down one number.
-->
このカードでは以下のことに注意してください：どのカードが『一番目』
に認識されるのかは、簡単にはわかりません。
認識される順番はイーサネットの HW アドレスによります。
つまり最も小さいイーサネットアドレスを持つカードが <it/eth0/ になり、
次が <it/eth1.../ というようになるわけです。
<tt/eth0/ のカードが抜かれれば、
それぞれの番号がひとつずつ減ることになります。

<!--O
<P>A related aspect is that it's not possible to leave an "earlier"
card disabled, enable a card at an address or IRQ different than the
EEPROM setting, or enable a card at a specific address.
-->
関連しますが、先に探索されるカードを差したまま無効にすることはできません。
また EEPROM での設定と違う I/Oアドレス／IRQ でカードを有効にしたり、
特定のアドレスで有効にすることもできません。

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

<!--
$Id: Multiple-Ethernet.sgml,v 1.6 2001/03/21 11:50:58 nakano Exp $
-->
</article>

