理論的には、2 つのデバイスが同じ IRQ を使わない限り、どの IRQ がどの
デバイスに割りあてられても問題にはならないはずです。
/etc/pcmcia/config
ファイルには、PCMCIA 以外のデバイスが
利用する IRQ を PCMCIA では使わないように設定する部分があります。
同様に、あるカードが使う I/O アドレスを直接指定する方法はありません。
/etc/pcmcia/config.opts
ファイルを使うと、どのカードでも使え
る I/O ポートの範囲を指定することや、他のデバイスと衝突する範囲の
I/O ポートを使わないように指定することができます。
/etc/pcmcia/config.opts
を修正したら、``kill -HUP
'' を使っ
て cardmgr
の初期化をやり直してください。
カード状態の変更を監視するための割り込みは、cardmgr
が
/etc/pcmcia/config
を読み込む前に低レベルのソケットドライバ
モジュール(i82365
や tcic
)が決めます。したがって、このファイル
を変更しても影響はありません。この割り込みを設定するには、
ソケットドライバをロードする時に cs_irq=
オプションで設定してくだ
さい。この設定は /etc/rc.d/rc.pcmcia
で PCIC_OPTS
変数を
設定することによって行います。
全てのクライアントカードドライバには、割り当てを試みる割り込みを指定す
るための irq_list
というパラメータがあります。このようなドライバ
オプションは /etc/pcmcia/config
ファイルで設定します。指定例
を以下に示します:
device "serial_cs"
module "serial_cs" opts "irq_list=8,12"
...
この指定により、シリアルドライバは irq 8 か irq 12 しか使わなくなりま
す。irq_list
の設定に関係なく、カードサービスシステムは他のデバイス
が既に使っている割り込みや設定ファイルで除外されている割り込みは決して
割り当てません。
PCMCIA の「スキーム」を使えば簡単です。例えば ``home'' と ``work'' と
いう 2 つのスキームの設定を考えてみましょう。スキームを反映した
network.opts
スクリプトの例を以下に示します:
case "$ADDRESS" in
work,*,*,*)
# definitions for network card in work scheme
...
;;
home,*,*,*|default,*,*,*)
# definitions for network card in home scheme
...
;;
esac
PCMCIA デバイスアドレスの最初の部分は常にスキームの設定に対応していま す。この例では 2 つめの ``case'' の部分が ``home'' と ``default'' のス キームになっており、スキームが設定されていない場合は ``home'' の設定で 起動されることになります。
2 つの設定を切りかえるには、
cardctl scheme home
あるいは
cardctl scheme work
を実行します。
cardctl
は、全てのカードの停止と再起動に相当する操作を行います。
このコマンドは PCMCIA システムがロードされているかどうかに関わらず安全
に実行することができますが、その時にちょうど別の PCMCIA デバイスを使っ
ていれば、コマンドは失敗するかもしれません(たとえ、設定がそのスキーム
設定に明示的に依存していなくても)。
現在のスキームの設定を知るには以下のコマンドを実行します:
cardctl scheme
デフォルトでは、スキーム設定は再起動しても変化しません。そのため、
間違った環境向けにネットワークが初期化されてしまうと、好ましくない結果
になるかもしれません。このような場合には、起動オプションの SCHEME
を使ってスキームの初期値を設定することができます(詳しくは
起動オプション を参照)。lilo
の起動
プロンプトを使ってスキームを設定することもできます。lilo
は認識で
きないオプションを環境変数として init
に渡すので、起動プロンプト
で SCHEME
(あるいは別の PCMCIA 起動オプション)を設定すると、その値
が PCMCIA 起動スクリプトに伝えられます。
キー操作を減らすには、スキームを lilo
の設定ファイルで指定すると
よいでしょう。例えば以下のように設定します:
root = /dev/hda1
read-only
image = /boot/vmlinuz
label = home
append = "SCHEME=home"
image = /boot/vmlinuz
label = work
append = "SCHEME=work"
起動プロンプトで ``home'' あるいは ``work'' と入力すれば、適切な スキームでシステムが起動します。
ルートファイルシステムを PCMCIA デバイス上に置くには細工が必要です。と いうのも、Linux の PCMCIA システムはカーネルにリンクするようには設計さ れていないからです。中心部分となるローダブルカーネルモジュールと、 ユーザモードで動作する cardmgr デーモンは、既に動作しているシステムを 前提にしているのです。この要件はカーネルの ``initrd'' を使っ て回避することができます。この機能は一時的な RAM ディスクを小さな ルートファイルシステムとして用いて起動し、ドライバをロードし、その後で 別のルートファイルシステムを改めてマウントするというものです。一時的な ルートファイルシステム上で PCMCIA のデバイスを設定し、それから PCMCIA デバイスをルートファイルシステムとしてマウントし直すことができます。
initrd イメージは絶対に起動デバイス以外に置かなければなりません。した がって、これを PCMCIA デバイスに置くことはできません。これは BIOS によ る制限であり、カーネルの制限ではありません。ここでは「起動可能」デバイス (つまり起動できるデバイス)と「ルート利用可能」デバイス(つまり ルートファイルシステムとしてマウントできるデバイス)を区別すると便利で しょう。「起動可能」デバイスは BIOS が決めますが、一般的には内蔵フロッピー とハードディスクに制限されています。「ルート利用可能」デバイスは、 カーネルがロードされた後に対応している全てのブロックデバイスです。 initrd 機能は、より多くのデバイスを「ルート利用可能」にします。 「起動可能」にはしません。
Linux ディストリビューションには、インストール時に PCMCIA SCSI アダプタ を使えるものもあります。これは、PCMCIA SCSI CD-ROM デバイスからの インストールに対応した結果としての意図しない副作用です。しかし現状では、 ``initrd'' を適切に設定して PCMCIA デバイス上のルートファイルシステム を使って起動するインストール用ツールはありません。したがって、PCMCIA デバイス上にルートファイルシステムを置くシステムを設定するには、別の Linux マシンを使って ``initrd'' イメージを作らなければなりません。別の Linux マシンが無ければ、最小構成の Linux を PCMCIA でないデバイス上に 一時的に構築し、そこで initrd イメージを作成し、それからインストール先 の PCMCIA に改めてインストールすることもできます。
Linux Bootdisk-HOWTO には起動ディスクの設定に関する一般的な情報が書か
れていますが、initrd 固有の情報は載っていません。initrd に関する最も
重要な文書は、最近のカーネルソースに含まれている
linux/Documentation/initrd.txt
です。作業を始める前に、この
文書を必ず読んでください。lilo
にも慣れておくといいでしょう。
initrd を使うためには、カーネルの CONFIG_BLK_DEV_RAM
オプションと
CONFIG_BLK_DEV_INITRD
オプションが有効でなければなりません。
これは高度な設定技術であり、Linux と PCMCIA に関する高度な技術が必要で す。作業の前には必ず関連文書を全て読んでください。以下の説明の手順でう まく行くはずですが、例から離れるとすぐに案内がない「サポート無し」の領 域に入るので、自分で何とかしなくてはならなくなります。
この方法を使うにはバージョン 2.9.5 以降の PCMCIA ドライバが必ず必要で す。古い PCMCIA パッケージやパッケージ内の個別の要素は、initrd におい てはうまく動作しません。異なるバージョンの内容を混ぜてはいけません。
pcinitrd
スクリプトは、PCMCIA デバイス上のルートパーティションで
起動するための基本的な initrd イメージを作ります。このイメージには必要
最低限のディレクトリ階層とわずかのデバイスファイル、少しの実行ファイル
と共有ライブラリ、PCMCIA ドライバモジュール群しか入っていません。
pcinitrd
を実行する時には、イメージに入れたいドライバモジュールを
指定します。PCMCIA システムの中心部分である pcmcia_core
と
ds
は自動的に入ります。
例として、i82365 互換のホストコントローラを使っているラップトップ機が あり、Adaptec SlimSCSI アダプタに接続されているハードディスク上に ルートファイルシステムを置いて Linux を起動したいと考えているものとし ます。この場合の initrd イメージは以下のようにして作成します:
pcinitrd -v initrd pcmcia/i82365.o pcmcia/aha152x_cs.o
initrd の起動シーケンスのカスタマイズは、
mount -o loop -t ext2 initrd /mnt
といったコマンドで「ループバックデバイス」を利用してイメージをマウント
して、
linuxrc
スクリプトを編集することで行えます。設定ファイルはイメージ
の /etc
ディレクトリにインストールされ、これもカスタマイズで
きます。詳しくは pcinitrd
のオンラインマニュアルを見てください。
pcinitrd
を使ってイメージを作った後は、起動ディスクを作成します。
これはカーネルと圧縮した initrd イメージ、lilo
用のファイル数個を
新品のフロッピーにコピーすることによって行います。以下の例では、使う予
定の PCMCIA ルートデバイスは /dev/sda1
であるものとします:
mke2fs /dev/fd0
mount /dev/fd0 /mnt
mkdir /mnt/etc /mnt/boot /mnt/dev
cp -a /dev/fd0 /dev/sda1 /mnt/dev
cp [kernel-image] /mnt/vmlinuz
cp /boot/boot.b /mnt/boot/boot.b
gzip < [initrd-image] > /mnt/initrd
以下の内容を持つ /mnt/etc/lilo.conf
を作成します:
boot=/dev/fd0
compact
image=/vmlinuz
label=linux
initrd=/initrd
read-only
root=/dev/sda1
最後に lilo
を以下のように実行します:
lilo -r /mnt
-r
オプションを付けて lilo
を実行すると、lilo
は指定さ
れた代替ルートディレクトリからの相対位置に基づいて全ての動作を行います。
/mnt/dev
ディレクトリにデバイスファイルを作成した理由は、
lilo
はこの代替ルートモードで動作している時には、/dev
ディレクトリにあるファイルを使うことができないからです。
initrd 機能を使う理由としてよくあるのは、内蔵ハードディスクが他の OS
専用になっているシステムを使う場合でしょう。Linux のカーネルと initrd
イメージを Linux 用でないパーティションに置き、
lilo
や LOADLIN
を使ってこれらのイメージから Linux を起動す
る設定にすることができます。
適切なルートデバイス用のカーネルの設定が既にできており、他の OS 上に
initrd イメージが作られているものとすると、手っ取り早い方法は
LOADLIN
を使って Linux を起動することです。これは以下のように行い
ます:
LOADLIN <kernel> initrd=<initrd-image>
対象のマシンで一度 Linux が起動できれば、lilo
をインストールして
直接 Linux を起動するようにできるでしょう。例えば /dev/hda1
が Linux 用のファイルシステムでない対象パーティションであり、
/mnt
がマウントポイントとして使えるものとします。まずは Linux
関連ファイル用のサブディレクトリを作成します:
mount /dev/hda1 /mnt
mkdir /mnt/linux
cp [kernel-image] /mnt/linux/vmlinuz
cp [initrd-image] /mnt/linux/initrd
この例では /dev/sda1
が希望する Linux のルートパーティション
であり、SCSI ハードディスクは PCMCIA の SCSI アダプタ経由でマウントさ
れるものとします。lilo
をインストールするには、以下のような内容の
lilo.conf
を作ります:
boot=/dev/hda
map=/mnt/linux/map
compact
image=/mnt/linux/vmlinuz
label=linux
root=/dev/sda1
initrd=/mnt/linux/initrd
read-only
other=/dev/hda1
table=/dev/hda
label=windows
boot=
行は、指定されたデバイスの MBR(Master Boot Record)に
ブートローダをインストールすることを指示します。root=
は、
initrd イメージをロードした後に使うルートファイルシステムを指定します。
この指定は、カーネルイメージが既にこのように設定されている場合には必要
ありません。other=
は、/dev/hda1
にインストールされてい
る他の OS を記述するために使います。
この場合に lilo
をインストールするには、以下のコマンドを使います:
lilo -C lilo.conf
今回は、lilo.conf
では /mnt
等の絶対パスを使っている点に
注意してください。私が例でこれを使ったのは、
対象のファイルシステムでは boot=
オプションと root=
オプション
に対して、Linux のデバイスファイルが作れないかもしれないからです。