現在は新しい内蔵ボード(カード)のほとんど全てがプラグ&プレイ (PnP)です.Linux にも PnP を扱うソフトウェアはあるのですが,これは必ず しも使いやすいとは言えません.PnP とうまく共存するための方法を以下に 6 つ示します(状況によっては使えないものもあります).この中のどれを使う べきかは目的によって異なります.その場しのぎの方法は,簡単でないかもし れない上に,長く使えるとも限りません.簡単と思われる方法は,自分では何 もしないで PnP-BIOS に設定を行わせることですが,調査を行わないと BIOS が行った設定を調べることができないかもしれません.これらの方法を比較す るには,誰かが全てを試してそれを文章にする必要があります.作業を行うに あたって複数の方法を使う必要があるかもしれません.
以上の方法のいずれを使っても,ハードウェア内のバスリソースが設定されるでしょ う.しかし,行った設定をデバイスドライバに伝えるのは最後の 2 つだけで す.確実に伝えるのは最後の 1 つだけです(というのも,それ自身がドライバ だからです).ドライバに情報がどのようにして伝えられるかはドライバに依 存し,情報を伝えるためにはユーザが何かを行わなければならないこともあり ます.詳しくは, ドライバに設定を教える の章をご覧ください.
多くのデバイスは PnP 専用であり,PnP を無効にすることはできません. しかし一部のデバイスでは,ジャンパや(ジャンパ無しの構成の場合には)デバ イス付属の Windows 用プログラムを使ってこれを無効にすることができます. これにより,PnP 設定の面倒な作業を回避できることもよくあります.このよ うなバスリソースが予約されていることを,忘れずに BIOS に設定しましょう. PnP を無効にしない方がよい理由は他にもいくつかあります:
PnP BIOS をお使いならば,この BIOS はハードウェアの設定を行うこと ができます.つまり,BIOS が全てのデバイスが必要とするリソースを全て読 み込み,これを設定します(バスリソースをデバイスに割り当てます).これは PnP OS の代用となりますが,BIOS はデバイスを設定しない点と,行った設定 をドライバに教えない点が異なります.通常は不揮発性メモリ(ESCD)内に保存 されている設定を使うべきです.新しいデバイスを検出した場合や,リソースが 衝突した場合は,BIOS は必要に応じて設定を変更すべきであり,ESCD 内の 設定をそのまま使ってはいけません.
お使いの BIOS はこのような設定をサポートしているはずですが,BIOS が正 しい設定をしないことや不完全な設定をすることがあります.BIOS を使うこと の利点は単純なことです.というのも,ほとんどの場合設定することがないか らです(BIOS の CMOS メニューで「PnP OS でない」と設定する点を除きます). デバイスドライバによっては BIOS が行った設定を自動的に検出できるものも ありますが,場合によっては BIOS が行った設定をユーザが調べる必要があり ます(必ずしも容易ではありません).詳しくは 現在の設定はどうなっているか? を参照してください.他に考えられ る利点としては,BIOS は Linux が起動する前に動作するので,後から起動す るデバイスドライバが全てのバスリソースが使える(そして検出できる)点が挙 げられます.
MS によると,PnP BIOS がデバイスの PnP 設定を(MS Windows の補助無しに) 行える機能はオプション的なものに過ぎません(必須ではありません).ですが, 1996 年(??)頃より後に作られた BIOS のほとんどはこれをこの機能を持って います.これが正しく動作するならば,我々は彼らにお礼のメモを送らなけれ ばなりません.このような BIOS は PCI バスも ISA バスも設定しますが,一 部の古い BIOS は PCI しか設定できないと言われています.お使いの BIOS についてもっと調べたければ WWW を見てください.筆者もこれに関するデー タを持っているわけではないので,筆者に問い合わせるのはやめてください. BIOS について読者の皆さんが知りたいと思っているような詳しい情報は入手 が困難(あるいは入手できない)かもしれません.一部の BIOS は最小限の PnP 機能しか持っておらず,設定作業の難しい部分は Windows のユーティリティ に任せようとします.これに当てはまった場合には,別の方法(isapnptools 等)を見つける,あるいは BIOS に ESCD データベースがあればこれを使わな ければならないでしょう.詳しくは次の章を参照してください.
BIOS は PnP 設定情報を記録してある不揮発性のデータベース を管理しています.これは ESCD(Extended System Configuration Data)と呼 ばれます.繰り返しになりますが,ESCD に関する規定はオプション的なもの ですが,ほとんどの PnP BIOS にはこの機能があります.ESCD は PnP デバイ スのリソース設定情報を格納するだけではなく,非 PnP デバイスの設定情報 も格納している(非 PnP デバイスであることも記録しています)ので,衝突を 回避することができます.ESCD データは普通チップに保存されるため電源を 落しても消えませんが,ハードディスクにデータを保持するタイプのものもあ ります(??).
ESCD は前回使った設定を保持するためのものですが,Linux の isapnp や PCI Utilities のような(ESCD を更新しない)プログラムを使った場合には, ESCD はこのようなプログラムを知らないため,この設定は ESCD 内に保存さ れません.出来の良い PnP OS は ESCD を更新するので,後で(標準の Linux のような)非 PnP の OS で設定を使うことができます. Windows は特殊な場合だけこれを行います. Windows を用いた ESCD の設定 を参照してください.
ESCD に設定されている情報を用いるには,必ず BIOS の CMOS で "Not a PnP OS" あるいは同様の設定を行ってください.BIOS が起動する度に(Linux OS が ロードされる前),BIOS は ESCD を使って設定を行うはずです.BIOS が ESCD に記録されていない新しい PnP カードを検出すると,BIOS はそのカードに バスリソースを割り当ててから ESCD を更新しなければなりません.既存の PnP カードに割り当てているバスリソースを変更し,それに伴って ESCD を 修正しなければならないこともあります.
それぞれのデバイスが前回の設定をハードウェアに保存しているならば,PC を起動する度にハードウェアの設定を行う必要はありません.しかし実際の 動作はそうではありません.したがって,BIOSを PnP で使っている場合には 全ての ESCD データは常に正しい状態に保たなければなりません.ESCD を持っ ていない BIOS もいくつかありますが,このような BIOS も不揮発メモリをい くらか持っており,非 PnP カードが使うために予約しているバスリソースを 格納できます.BIOS の多くはこれをどちらも持っています.
BIOS が行うESCD の設定がユーザの希望通りでない(または,あるべき設 定が行われない)場合には,Linux 用のユーティリティを使って ESCD を設定 できれば良いのにと思うことでしょう.1999 初めの時点では,このようなツー ルは全くありません.したがって,これを行う最後の手段として Windows を 使うことになるでしょう(同じ PC に Windows が入っている場合には).
Windows に ESCD を設定または修正させる方法は 3 つあります.最初の方法 は,DOS または Windows 3.x 用に作られた ICU ユーティリティを使う ことです.これは Windows 9x/2k でも動くはずです(??).二番目の方法は, Windows 9x/2k 上で手動で(「強制的な」)設定を行い,Windows の正常終了時 にこの情報を ESCD に保存させる方法です.三番目の方法はプラグ&プレイ でないレガシーデバイスでしか使えません.Windows がこのようなデバイスの 存在と使用しているバスリソースを知っていれば,Windows はこの情報を ESCD に格納するはずです.
Windows がデバイスの設定を自動的に行っており,ユーザが「強制的に」設定 を変えていなければ,このような設定はおそらく ESCD には反映されないでしょう. もちろん,Windows は自分自身の設定を ESCD に保存されている設定に合わせ ることがあるので,結果的にはたまたま一致することもあります.
Windows9x は PnP オペレーティングシステムであり,自動的にデバイスの PnP 設定を行います.Windows はレジストリ(これはバイナリである Windows ファイル群に格納されています)の奥底で PnP データベースを管理しています. PnP バスリソースの他にもたくさんの設定情報がレジストリに入っています. PnP バスリソースは,現在メモリに記憶されているものと(たぶんほとんど同じで すが)ハードディスクに格納されているものとどちらもあります.Windows98 で PnP バスリソース(メモリに保持している方?)を間接的に見たり,強制的な 変更を行うには,デバイスマネージャを使います.
Windows98 でデバイスマネージャを呼び出す方法は 2 通りあります:
Programs --> Accessories --> System Tools --> System Information --> Hardware Resources --> Forced Hardware. When you "force" a change of bus-resources in Windows, it should put your change into the ESCD (provided you exit Windows normally). From the "System Information" window you may also inspect how IRQs and IO ports have been allocated under Windows. --> Windows98 においてどんな設定が「強制」されているか調べるには次の操作を 行います: スタート --> プログラム --> アクセサリ --> システムツール --> システム情報 --> ハードウェアリソース --> 強制設定されたハードウェア. Windows でバスリソースを「強制的」に変えた場合には,その変更を ESCD に保存しなければなりません(Windows を正常終了させればそうなります). 「システム情報」ウィンドウを見ると,Windows 上で IRQ と I/O ポートがど のように割り当てられているかを調べることができます.
Windows でバスリソースの衝突が起こらなくても,Linux で衝突が起こること があります.その理由は,Windows は ESCD と異なる方法でバスリソースを割 り当てることがあるからです.滅多にないケースですが,Windows 上の全ての デバイスがレガシーデバイスであるか,設定が「強制」されている場合には, Windows と ESCD の設定は全く同じになるはずです.
新しい PnP デバイスが追加され,かつ BIOS の設定が「PnP OS でない」 である場合,PnP BIOS は自動的にデバイスの設定を行って,その設定を ESCD に格納しなければなりません.非 PnP のレガシーデバイス(またはジャンパ等 で PnP を無効にしたデバイス)の場合には,これを処理するためのオプション がいくつかあります.
特定のバスリソース(IRQ 等)が予約されていて,PnP で割り当ててはならないこと を(CMOS 設定メニューを使って)直接 BIOS に指定することもできます.BIOS がこの情報を ESCD に記録することはありません.しかし,衝突が起きた場合 に,あらかじめ選択してあった CMOS の設定で ESCD の設定を上書きするかど うかを BIOS のメニューで選択できるようになっているかもしれません.別の 方法としては,DOS または Windows で ICU を実行する方法があります.さら に別の方法として,ICU を Windows9x/2k に手動でインストールして, その設定を「強制」する(前節を参照)方法もあります.設定が「強制」される と,Windows は PC がシャットダウンされる時に ESCD を更新するはずです.
残念ながら,PnP の基礎を知らない人には, isapnp についてのたくさん
の文書の内容は分かりにくいでしょう.そこで本 HOWTO では,isapnp 付属の
FAQ と同様に isapnp
の理解を助けるための説明を行います.
isapnp
が使えるのは ISA バス 上の PnP デバイスだけです(PCI バスで
は使えません).Linux の起動時に "isapnp" プログラムを実行すると,
/etc/isapnp.conf ファイルで指定されたリソース値が PnP デバイスに設定され
ます.この設定ファイルは自動的に作ることができますが,各種オプションを
設定するには手で編集しなければなりません.isapnp を使う場合,カーネル
の一部であるデバイスドライバは isapnp がアドレス等をハードウェアに設定
するよりもずっと前に実行されます.結果として,デバイスドライバはデバイ
スを見つけることができません.ドライバが正しいアドレスにアクセスしよう
としても,そのアドレスがまだハードウェアに設定されていないからです.
お使いのディストリビューションが isapnptools を自動的にインストールし
ている場合には,isapnp はシステム起動時に既に実行されているかもしれま
せん.この場合にすべきなのは,"man isapnp.conf
" の出力を見ながら
/etc/isapnp.conf を編集することだけです.ただし,この作業は手動で
PnP を設定することとあまり変わらない点に注意してください.というのも,
ユーザはどのような設定にするかを決めてから設定ファイルを編集しなければ
ならないからです.設定ファイルを編集するには,"pnpdump" プログラムが
便利です.このプログラムは設定ファイルをだいたい作ってくれますが,この
設定を使う前にはうまく編集してやらなければなりません.このファイルには
編集の参考になるコメントが含まれています."isapnp" を設定に用い,かつ
PnP BIOS がある場合には,BIOS には(設定時に)「PnP OS を持っていない」
と指定しなければなりません.なぜなら,この場合にも PCI デバイスの設定
を BIOS に行わせたいからです.BIOS が ISA デバイスの設定も行うかもしれ
ませんが,isapnp はそれを更に再設定します.
最初のうちは /etc/isapnp.conf で使われている用語が変に思われるかもしれ ません.例えば,I/O アドレス 0x3e8 を表すのに,"(IO 0 (BASE 0x3e8))" となっていたりします."IO 0" というのは,これがデバイスが使う最初の (0 番目の) I/O アドレス領域という意味です.これを表す別の方法として は "IO[0] = 0x3e8" がありますが,isapnp はこの方法は使いません. "IO 1" は,これがこのデバイスが使う 2 番目の I/O アドレス領域という意 味です.以下も同様です."INT 0" も同様の意味ですが,IRQ(割り込み)に対 して用います.1 つのカードが複数の物理デバイスを持つことがありますが, 上記の説明はこれらのデバイスのうち 1 つにしか当てはまりません.
新しいパッケージである PCI Utilities (=pciutils, 誤って "pcitools" と呼ばれることもあります)は PCI バスの PnP 設定を手動で行えるようにしま す."lspci" はバスリソースをリスト表示し,"setpci" はハードウェアデバイ スのリソース割り当てを設定します.setpci は主にスクリプトで使われること を想定しているようです.現時点でこれを利用するには PCI 設定レジスタを詳 細に理解している必要がありますがその点に関しては,このドキュメントや setpci のマニュアルでは詳しく説明されていません.
David Howells さんは "Linux Kernel Configuration/Resource Manager" と呼ばれる,Linux カーネルを PnP 対応にするためのパッチを作成しました ("Hardware Configuration Manager" と呼ばれることもあります).1999 年末 の時点では,このパッチを彼のページから入手することはできません.つまり, 最近のバージョンのカーネルに対して使えるパッチはないということです.
前のパッチについては,パッチを当てて得られるカーネルは安定していると作 者が主張していましたが,バグがいくつか報告されています.このパッチには, シリアルポートの扱い方を説明する serial.txt 等の文書が付いています.このパッチを当てると /proc ディレク トリに「ファイル」が作られます.これらのファイルで現在の状況が調べられ ますし,これらのファイルにコマンドを送ることによって設定を変えることも できます.ただし問題が 1 つあります.デバイスドライバの多くはこのパッ チを想定していないので,設定を行うためには今まで通りの設定ファイル等を 使わなければならないことがあるのです.このパッチの WWW ページは http://www.astarte.free-online.co.uk です.
Windows9x (または Windows 2k)が Linux と同じ PC に入っていれば,単 に Windows を起動して PnP を設定してください.その後,Windows(または DOS)から Linux を起動します.Windows が PCI デバイスレジスタから IRQ を消してしまうことが報告されています.この場合には Linux は 0 である IRQ が検出されたとエラーを出します.したがって,この方法は使えないかもしれ ません.
いくつかのドライバは,PnP の手法を使ってハードウェア内にバスリソースを 設定しますが,これはそのドライバが制御するデバイスに対してだけです. ドライバが設定を終えて以降は,ドライバは明らかに設定を知っているので, ユーザはこの情報をドライバに教える必要はありません.
この方法に伴う問題は設定の重複です.この情報の全てをドライバに組み込む のは困難であり,ドライバは他のデバイスが必要としているバスリソースを押えて しまうかもしれません.これによりユーザの設定は簡単になるでしょうが, PnP 対応 Linux カーネルを使う方がもっと良いでしょう.詳しくは Linux で PnP をうまくやっていくことの必要性 をご覧ください.