Linux&FreeBSD ハードウェア設定

YAMAMORI Takenori ●yamamori

■ネットワークカード

●ネットワークカードのあとからの設置と交換(RedHat系)

redhatやVineでは,インストール時にはLANの設定メニューがあり, そこで設定できますが,あとでネットワークを設定したい場合は, インストール時と同じメニューでの設定はできません. その場合は,linuxconfなどを使って設定しますが, この方法については,『Linux×BSD』夏号Vol.1 にも書いていますので, そちらもあわせてご参照下さい.

ここでは,詳細が不明なネットワークカードを認識させて, 使えるようにする方法について説明します.

再インストールはしないまでも,インストーラの冒頭部分を利用して, ネットワークカードを自動認識するかどうか試してみることができます. Vine 1.1のインストーラを起動して,インストールメディアとして 形式的に「NFSサーバ」を選びます.
nfs.gif
するとカードによっては次の画面で自動認識されて表示されます. 自動認識されなかった場合でも,メニューからカードを選択し, ドライバを試してみることが出来ます.
ne2000.gif
場合によっては,I/Oポートのアドレスや,IRQも指定します.
ne2000-opt.gif
ここではio=0x240を指定してみました.
ne2000-io.gif
ここで,認識に失敗することもあるでしょう.
no-dev.gif
それでもあきらめずに,ドライバやI/OやIRQの指定を変えたりしてみます. このようにして次のBOOTP/DHCPの画面に進められればOKです.
bootp.gif
この画面ではIPアドレス等を設定する必要はありません. ここで一度シェルに切替えたいところですが,ここではまだ出来ませんので, 「戻る」で戻って,インストールメディアとして「ローカルのCD-ROM」を 選び直し,「インストール」「アップグレード」の選択画面
inst-up.gif
まで進めて[Alt]左+[F2]でシェルに切替えて下さい.

(注:LASER5 Linux 6.0のインストーラでは, NFSインストールとローカルインストールのインストーラが 分かれてしまったため,上記の方法は使えません)

シェル上で,lsmodを実行すると,その表示の中にはネットワークカードに 対応したドライバ名が含まれているはずです. また,以下のようにしても情報が得られます.

試しに用いたNE2000互換ISAカードの場合:
bash# cat /tmp/conf.modules  ← ここでは/etcではなく/tmpです.
alias eth0 ne
options ne io=0x240

これを覚えておきます.

ところで上記で,暗黙のうちにio=0x240と指定していますが, これは実は,以下のようにして調べました.

Solaris 7のインストールの際に最初にブートを行なうための DCA(Device Configuration Assistant)と呼ばれるフロッピディスクがあります. これのメニューの中に,
dca.gif
のように,そのマシン上の 各種デバイスのI/OポートやIRQを調査して表示する画面がありますので, これを見て情報が得られます.

その他,同じマシンにすでに別のOSもインストールされているなら, そちらから情報を得ることもできるでしょう.

これでモジュール名やI/Oポートがわかったので, Linuxをブートし,/etc/conf.modulesに以下のように書きます.

alias eth0 ne
options ne io=0x240

そして,このまま手動でネットワークを立ち上げるには,以下のようにします.

# /sbin/ifconfig eth0 192.168.1.249
# /sbin/route add -net 192.168.1.0    ← kernel 2.2.x の場合は不要

これで確認できたら,最終的にはlinuxconfなり control-panelなりを使って IPアドレスなどを入力し, /etc以下の設定ファイルを更新すればいいでしょう.


・ネットワークカードの交換(RedHat系)

ここで,ネットワークカードを Intel EtherExpressPro100に交換して,マシンをブートしてみました. すると,当然ながらイーサネットは使えない状態で立ち上がります.

さて,このカードに対応するドライバは,前述の方法などを使って eepro100ドライバであることがわかりました. また,カードはI/OやIRQの指定は要りません.(自動認識されます) そこで,これに設定変更してみましょう. それにはlinuxconfまたはcontrol-panelを使って, eth0のドライバをeepro100に変更してもOKですし, /etc/conf.modulesの,以前のneの設定の2行を削除し, 代わりに,

alias eth0 eepro100

と書いて,ifconfigで手動で立ち上げても構いません. これで無事,ネットワークカードが交換できました.

・ネットワークカードの2枚挿し(RedHat系)

今度は,NE2000互換ISAカードと,Planex FNW-9700-Tとの2枚挿しという状態で 試してみました.

(※注) ちなみに,FNW 9700-Tというのは,"Linux動作確認済み"と 外箱などにはっきり書かれている100M/10M対応のカードです.

ただし,Linux対応と書かれていても,インストーラがインストール時に 認識するとは限らず,また,そのカード用のドライバを別途ダウンロードする 必要があるものもあります.

事実,FNW-9700-Tも,redhat 5.2などのkernel 2.0.xの場合は, 以下のWebページより,ドライバをダウンロードする必要があるのですが, 筆者がVine 1.1(kernel 2.0.36)で試してみたところ, 環境の違いか,なぜかOSに付属の via-rhine.oドライバのままで認識されて動作してしまいました.

    http://www.planex.co.jp/support/f_unix.htm
(※注)あとで別のマシンでも試してみてわかったのですが, FNW-9700Tは,ダウンロードしたvaia-rhineドライバを使った場合でも, マシンによっては動作が不安定になることがありました. また,同社のFNW-9800-T(tulipドライバ)でも, 同様に不安定になったことがあります. サンプルが少ないため,あまり断定的なことは言えませんが, 同社ENW-9501-T(こちらもtulipドライバ)のほうは, (値段は高くなりますが)今のところトラブルは起きていません.

FNW-9700-Tに対応するドライバはvia-rhineであることが, 上記Webでの情報からわかっていますので, この場合の,conf.modulesは以下のようになります.

/etc/conf.modules
alias eth0 ne
options ne io=0x240
alias eth1 via-rhine

これで,eth0eth1について,ifconfig でネットワークを立ち上げることができます.その場合の注意点としては, eth0eth1とでIPアドレスのネットワーク部を別にすることと, kernel 2.0系の場合はrouteコマンドも明示的に必要なことです.


●ネットワークカードのあとからの設置と交換(FreeBSD 3.2)

FreeBSD では,/stand/sysinstallを実行することにより, インストール時と同じ設定画面を呼び出せるため, インストール後にカードを追加した場合でも, これを使って楽に設定できるでしょう.

ところが,実際にNE2000互換ISAカードを挿して,sysinstallを実行して Configure→Networking→Interfaces と選んでみたところ,そこにはPPPやSLIPのデバイスなどしか 表示されていませんでした.

その後いろいろ考えて,カーネルソース中の以下の行に目が止まりました.

/usr/src/sys/i386/conf/GENERIC より:
device ed0 at isa? port 0x280 net irq 10 iomem 0xd8000

NE2000互換ISAカードはFreeBSDではedデバイスで認識されることが わかっていますが,この行に記述されているI/Oポートのアドレスと, IRQの値が,実際のカードのものとは違っていました. そこでコンフィグファイルのGENERICを適当な別名でコピーし, そちらに,以下の行を追加しました.

device ed0 at isa? port 0x240 net irq 9 iomem 0xd8000

これでカーネルをmakeし,/kernelにコピーしました. GENERICカーネルも,/kernel.GENERICとして残っています. なお,FreeBSD(その他のBSD系も含む)では,カーネルファイルを 触っても,disklabelなどを再設定する必要はありません.

この状態でリブートすると,ed0は無事認識されました…と思ったら, 認識はされたのですがそのあとの別のドライバ部分でハングしました.

(カーネルブート時のメッセージ)
  (略)
ed0 not found at 0x280
ed0 at 0x240-0x25f irq 9 on isa                       ← 無事認識
ed0: address 00:80:ad:b0:de:64, type NE2000 (16 bit)  ← された
  (略)
lpt0: <generic printer> on ppbus 0
lpt0: Interrupt-driven port
ie0: unknown board_id: f000
ie0 not found at 0x300
ep0 not found at 0x300
  (しかし,ここでハング.カーネルソースを見ると ex0 と思われる)

仕方なくリセットし,

  Hit [Enter] to boot immediately, or any other key for command prompt.

と表示されたところで[Enter]以外を押してブートを中断し, 以下のように入力してkernel.GENERICをブートし直しました.

disk1s3a:> unload
disk1s3a:> boot kernel.GENERIC

そして再びカーネルコンフィグファイルのGENERICを見ました. ハングした位置的にex0が怪しいと思われたので, 以下のようにコメントアウトして再びカーネルをmakeしました.

  (略)
device ie0 at isa? port 0x300 net irq 10 iomem 0xd0000
device ep0 at isa? port 0x300 net irq 10
#device ex0 at isa? port? net irq?
  (略)

今度は無事,カーネルがブートし,ed0デバイスも認識されて イーサネットが使えるようになりました.

(この状態での ifconfig -a と netstat -in の出力)
$ ifconfig -a
ed0: flags=8802<BROADCAST,SIMPLEX,MULTICAST> mtu 1500
        ether 00:80:ad:b0:de:64 
lp0: flags=8810<POINTOPOINT,SIMPLEX,MULTICAST> mtu 1500
  (以下省略)

$ netstat -in
Name  Mtu   Network       Address            Ipkts Ierrs    Opkts Oerrs  Coll
ed0*  1500  <Link>      00.80.ad.b0.de.64        0     0        0     0     0
lp0*  1500  <Link>                               0     0        0     0     0
  (以下省略)
(ここで手動で ifconfig する)
# ifconfig ed0 192.168.1.249
(IPアドレスが割り当てられた状態での ifconfig -a と netstat -in の出力)
$ ifconfig -a
ed0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        inet 192.168.1.249 netmask 0xffffff00 broadcast 192.168.1.255
        ether 00:80:ad:b0:de:64 
lp0: flags=8810<POINTOPOINT,SIMPLEX,MULTICAST> mtu 1500
  (以下省略)

$ netstat -in
Name  Mtu   Network       Address            Ipkts Ierrs    Opkts Oerrs  Coll
ed0   1500  <Link>      00.80.ad.b0.de.64      105     0       79     0     0
ed0   1500  192.168.1     192.168.1.249        105     0       79     0     0
lp0*  1500  <Link>                               0     0        0     0     0
  (以下省略)

ここで,もしこのカードがOSのインストール時に存在していた 場合はどうなっていたのだろうと疑問に思いました. インストーラの起動時に現れる "Kernel Configuration Menu"から 「Start Kernel Configuration in full-screen visual mode」を 選んでドライバ関係を修正した場合, 内部でカーネルの再構築が行なわれているのでしょうか?

実際にそのようにして,つまり,ed0のI/OポートとIRQを変更し, かつ,ex0を外してインストールしてみたのですが, インストール後に確認してみると, そのままのGENERICカーネルが使われていました.

不思議に思ってdmesgを見てみると, その中に"config>"なる行が含まれていました.

Copyright (c) 1992-1999 FreeBSD Inc.
Copyright (c) 1982, 1986, 1989, 1991, 1993
        The Regents of the University of California. All rights reserved.
FreeBSD 3.2-RELEASE #0: Tue May 18 04:05:08 GMT 1999
    jkh@cathair:/usr/src/sys/compile/GENERIC
Timecounter "i8254"  frequency 1193182 Hz
CPU: Celeron (299.61-MHz 686-class CPU)
  Origin = "GenuineIntel"  Id = 0x665  Stepping=5
  Features=0x183f9ff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,SEP,MTRR,PGE,MCA,CMOV,PA
T,PSE36,MMX,<b24>>
real memory  = 67108864 (65536K bytes)
config> di ex0             ← ここ
config> en ed0             ← ここ
config> po ed0 0x240       ← ここ
config> ir ed0 9           ← ここ
config> iom ed0 0xd8000    ← ここ
config> f ed0 0            ← ここ
config> q                  ← ここ
avail memory = 61771776 (60324K bytes)
  (snip)

実はわざわざカーネルを再構築しなくても,/boot/kernel.conf を記述することによって出来たのです.

/boot/kernel.conf
di ex0            ← ex0を無効に
en ed0            ← ed0を有効に
po ed0 0x240      ← I/Oポートを0x240に
ir ed0 9          ← IRQを9に
iom ed0 0xd8000   ← デフォルトと同じなので無くても良い
f ed0 0           ← デフォルトと同じなので無くても良い
q

なお,同時にloader.confの設定も必要です.

/boot/loader.conf
userconfig_script_load="YES"

さて,IPアドレスなどの設定を/etc以下の各設定ファイルに反映するには, /stand/sysinstallを使うと楽です. Configure→Networking→Interfacesと選ぶと, 最初の時には表示されていなかったed0が, 無事リストに表示されていました.
freebsd-network.gif
(ここでは都合により,英語モードの表示になっています) あとはこの画面を進めて,IPアドレス,ホストネーム,DNS等を入力すれば, その設定が以下のファイルに書き込まれます.

/etc/rc.conf
/etc/hosts
/etc/resolv.conf

このように,FreeBSDでは,主要なドライバがGENERICカーネルに すでに含まれているため,まずはそのまま認識されるかどうかを確認し, 認識されなかった場合で,ISAカードでI/OポートやIRQが異なっていると 思われる場合は,/boot/loader.conf /boot/kernel.conf に 適切な設定項目を記述することにより,認識させればよいことがわかりました.

・ネットワークカードの交換(FreeBSD 3.2)

ここで,ネットワークカードを Intel EtherExpressPro100に交換して,マシンをブートしてみました. すると,ドライバレベルではそのままfxp0で認識されました. ただ,/etc/rc.confの設定が,以前のed0のままになっているため, ifconfigはされません.これは,/etc/rc.confを直接修正するか, または/stand/sysinstallで同様に設定し直すとOKです.

・ネットワークカードの2枚挿し(FreeBSD 3.2)

今度は,NE2000互換ISAカードとPlanex FNW-9700-Tとの2枚挿しです. これについても,あっけなくed0vr0として認識されました. ここで,手動でifconfigして立ち上がりますし, あとはsysinstallで設定ファイルを更新すればOKです.


●IPフォワーディングするには(RedHat系/FreeBSD 3.2)

LinuxもFreeBSDも,ネットワークカードを2枚挿しても, デフォルトではIPフォワーディング(一方のネットワークインターフェイスに届いた, 自分以外宛のIPパケットを,他方のインターフェイスに中継すること)は 行なわれません. IPフォワーディングを行なうには以下のようにします.

なお,余談ですが,SunOSでは"The Network is the Computer"とばかりに, IPフォワーディングを行なうのがデフォルトになっていて, 逆に,「IPフォワーディングを止めるにはどうすればいいのでしょう?」 というのがFAQになっていたりします.
・RedHat系のIPフォワーディング

IPフォワーディング状態を直接確認・変更するには,以下のようにします.

現在の状態の確認:
$ cat /proc/sys/net/ipv4/ip_forward
0         ← 0: IPフォワーディングなし 1: あり
直接設定:
# echo 1 > /proc/sys/net/ipv4/ip_forward

これを,/etc以下の設定ファイルに反映するには, linuxconfを起動し,ここの,Enable routingのところをチェックします. ipforwarding.gif これは結局,以下のファイルのFORWARD_IPV4の行を 変更することになります.

/etc/sysconfig/network
FORWARD_IPV4="yes"
・FreeBSD 3.2のIPフォワーディング

FreeBSDの場合は以下のようになります.

現在の状態の確認:
$ sysctl net.inet.ip.forwarding
net.inet.ip.forwarding: 0    ← 0: IPフォワーディングなし 1: あり
直接設定:
# sysctl -w net.inet.ip.forwarding=1
net.inet.ip.forwarding: 0 -> 1

これを,/etc以下の設定ファイルに反映するには, /etc/defaults/rc.confを参考に,変更箇所のみ /etc/rc.confに記述しますが,この場合は以下の行を追加します.

/etc/rc.conf
gateway_enable="YES"

/stand/sysinstallを使って設定する場合は, Configure→Networkingと選び,Gatewayにカーソルを合わせて [Space]を押して,[X]GateWayとチェックを入れます.
gateway.gif

なお,LinuxでもFreeBSDでも,IPフォワーディングの動作検証を行なうには, ゲートウェイとなるマシンを含めて,最低3台のマシンが必要ですが, ゲートウェイ以外の2台のマシンについては, デフォルトルートをゲートウェイに向けるなどの設定ももちろん必要です.


To「Linux&FreeBSD ハードウェア設定」index


このページは、技術評論社 Linux×BSD HYPER PRESS Vol.2秋号、『もう困らない!Linux&FreeBSD ハードウェア設定テクニック』 の原稿を元に、Web 用に再構成したものです。
To 謎の処理系 SunOS 4.1.4 Home
yamamori