Linux&FreeBSD ハードウェア設定 |
YAMAMORI Takenori ●yamamori |
■ネットワークカード
redhatやVineでは,インストール時にはLANの設定メニューがあり, そこで設定できますが,あとでネットワークを設定したい場合は, インストール時と同じメニューでの設定はできません. その場合は,linuxconfなどを使って設定しますが, この方法については,『Linux×BSD』夏号Vol.1 にも書いていますので, そちらもあわせてご参照下さい.
ここでは,詳細が不明なネットワークカードを認識させて, 使えるようにする方法について説明します.
再インストールはしないまでも,インストーラの冒頭部分を利用して,
ネットワークカードを自動認識するかどうか試してみることができます.
Vine 1.1のインストーラを起動して,インストールメディアとして
形式的に「NFSサーバ」を選びます.
するとカードによっては次の画面で自動認識されて表示されます.
自動認識されなかった場合でも,メニューからカードを選択し,
ドライバを試してみることが出来ます.
場合によっては,I/Oポートのアドレスや,IRQも指定します.
ここではio=0x240を指定してみました.
ここで,認識に失敗することもあるでしょう.
それでもあきらめずに,ドライバやI/OやIRQの指定を変えたりしてみます.
このようにして次のBOOTP/DHCPの画面に進められればOKです.
この画面ではIPアドレス等を設定する必要はありません.
ここで一度シェルに切替えたいところですが,ここではまだ出来ませんので,
「戻る」で戻って,インストールメディアとして「ローカルのCD-ROM」を
選び直し,「インストール」「アップグレード」の選択画面
まで進めて[Alt]左+[F2]でシェルに切替えて下さい.
(注:LASER5 Linux 6.0のインストーラでは, NFSインストールとローカルインストールのインストーラが 分かれてしまったため,上記の方法は使えません)
シェル上で,lsmodを実行すると,その表示の中にはネットワークカードに 対応したドライバ名が含まれているはずです. また,以下のようにしても情報が得られます.
bash# cat /tmp/conf.modules ← ここでは/etcではなく/tmpです. alias eth0 ne options ne io=0x240 |
これを覚えておきます.
ところで上記で,暗黙のうちにio=0x240と指定していますが, これは実は,以下のようにして調べました.
Solaris 7のインストールの際に最初にブートを行なうための
DCA(Device Configuration Assistant)と呼ばれるフロッピディスクがあります.
これのメニューの中に,
のように,そのマシン上の
各種デバイスの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以下の設定ファイルを更新すればいいでしょう.
ここで,ネットワークカードを Intel EtherExpressPro100に交換して,マシンをブートしてみました. すると,当然ながらイーサネットは使えない状態で立ち上がります.
さて,このカードに対応するドライバは,前述の方法などを使って eepro100ドライバであることがわかりました. また,カードはI/OやIRQの指定は要りません.(自動認識されます) そこで,これに設定変更してみましょう. それにはlinuxconfまたはcontrol-panelを使って, eth0のドライバをeepro100に変更してもOKですし, /etc/conf.modulesの,以前のneの設定の2行を削除し, 代わりに,
alias eth0 eepro100 |
と書いて,ifconfigで手動で立ち上げても構いません. これで無事,ネットワークカードが交換できました.
今度は,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は以下のようになります.
alias eth0 ne options ne io=0x240 alias eth1 via-rhine |
これで,eth0とeth1について,ifconfig でネットワークを立ち上げることができます.その場合の注意点としては, eth0とeth1とでIPアドレスのネットワーク部を別にすることと, kernel 2.0系の場合はrouteコマンドも明示的に必要なことです.
FreeBSD では,/stand/sysinstallを実行することにより, インストール時と同じ設定画面を呼び出せるため, インストール後にカードを追加した場合でも, これを使って楽に設定できるでしょう.
ところが,実際にNE2000互換ISAカードを挿して,sysinstallを実行して Configure→Networking→Interfaces と選んでみたところ,そこにはPPPやSLIPのデバイスなどしか 表示されていませんでした.
その後いろいろ考えて,カーネルソース中の以下の行に目が止まりました.
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 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 ed0 192.168.1.249 |
$ 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 を記述することによって出来たのです.
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の設定も必要です.
userconfig_script_load="YES" |
さて,IPアドレスなどの設定を/etc以下の各設定ファイルに反映するには,
/stand/sysinstallを使うと楽です.
Configure→Networking→Interfacesと選ぶと,
最初の時には表示されていなかったed0が,
無事リストに表示されていました.
(ここでは都合により,英語モードの表示になっています)
あとはこの画面を進めて,IPアドレス,ホストネーム,DNS等を入力すれば,
その設定が以下のファイルに書き込まれます.
/etc/rc.conf /etc/hosts /etc/resolv.conf
このように,FreeBSDでは,主要なドライバがGENERICカーネルに すでに含まれているため,まずはそのまま認識されるかどうかを確認し, 認識されなかった場合で,ISAカードでI/OポートやIRQが異なっていると 思われる場合は,/boot/loader.conf /boot/kernel.conf に 適切な設定項目を記述することにより,認識させればよいことがわかりました.
ここで,ネットワークカードを Intel EtherExpressPro100に交換して,マシンをブートしてみました. すると,ドライバレベルではそのままfxp0で認識されました. ただ,/etc/rc.confの設定が,以前のed0のままになっているため, ifconfigはされません.これは,/etc/rc.confを直接修正するか, または/stand/sysinstallで同様に設定し直すとOKです.
今度は,NE2000互換ISAカードとPlanex FNW-9700-Tとの2枚挿しです. これについても,あっけなくed0とvr0として認識されました. ここで,手動でifconfigして立ち上がりますし, あとはsysinstallで設定ファイルを更新すればOKです.
LinuxもFreeBSDも,ネットワークカードを2枚挿しても, デフォルトではIPフォワーディング(一方のネットワークインターフェイスに届いた, 自分以外宛のIPパケットを,他方のインターフェイスに中継すること)は 行なわれません. IPフォワーディングを行なうには以下のようにします.
なお,余談ですが,SunOSでは"The Network is the Computer"とばかりに, IPフォワーディングを行なうのがデフォルトになっていて, 逆に,「IPフォワーディングを止めるにはどうすればいいのでしょう?」 というのがFAQになっていたりします.
IPフォワーディング状態を直接確認・変更するには,以下のようにします.
$ cat /proc/sys/net/ipv4/ip_forward 0 ← 0: IPフォワーディングなし 1: あり |
# echo 1 > /proc/sys/net/ipv4/ip_forward |
これを,/etc以下の設定ファイルに反映するには, linuxconfを起動し,ここの,Enable routingのところをチェックします. これは結局,以下のファイルのFORWARD_IPV4の行を 変更することになります.
FORWARD_IPV4="yes" |
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に記述しますが,この場合は以下の行を追加します.
gateway_enable="YES" |
/stand/sysinstallを使って設定する場合は,
Configure→Networkingと選び,Gatewayにカーソルを合わせて
[Space]を押して,[X]GateWayとチェックを入れます.
なお,LinuxでもFreeBSDでも,IPフォワーディングの動作検証を行なうには, ゲートウェイとなるマシンを含めて,最低3台のマシンが必要ですが, ゲートウェイ以外の2台のマシンについては, デフォルトルートをゲートウェイに向けるなどの設定ももちろん必要です.
To「Linux&FreeBSD ハードウェア設定」index