次のページ 前のページ 目次へ

5. 高度な話題

5.1 PCMCIA デバイスへのリソース割り当て

理論的には、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 を読み込む前に低レベルのソケットドライバ モジュール(i82365tcic)が決めます。したがって、このファイル を変更しても影響はありません。この割り込みを設定するには、 ソケットドライバをロードする時に cs_irq= オプションで設定してくだ さい。この設定は /etc/rc.d/rc.pcmciaPCIC_OPTS 変数を 設定することによって行います。

全てのクライアントカードドライバには、割り当てを試みる割り込みを指定す るための irq_list というパラメータがあります。このようなドライバ オプションは /etc/pcmcia/config ファイルで設定します。指定例 を以下に示します:

device "serial_cs"
  module "serial_cs" opts "irq_list=8,12"
  ...

この指定により、シリアルドライバは irq 8 か irq 12 しか使わなくなりま す。irq_list の設定に関係なく、カードサービスシステムは他のデバイス が既に使っている割り込みや設定ファイルで除外されている割り込みは決して 割り当てません。

5.2 家と会社で別々の設定を使い分けることができますか?

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'' と入力すれば、適切な スキームでシステムが起動します。

5.3 PCMCIA デバイスからの起動

ルートファイルシステムを 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''

pcinitrd スクリプトは、PCMCIA デバイス上のルートパーティションで 起動するための基本的な initrd イメージを作ります。このイメージには必要 最低限のディレクトリ階層とわずかのデバイスファイル、少しの実行ファイル と共有ライブラリ、PCMCIA ドライバモジュール群しか入っていません。 pcinitrd を実行する時には、イメージに入れたいドライバモジュールを 指定します。PCMCIA システムの中心部分である pcmcia_coreds は自動的に入ります。

例として、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 のオンラインマニュアルを見てください。

initrd 起動ディスクの作成

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 ディレクトリにあるファイルを使うことができないからです。

Linux 用でないドライブ上にある initrd イメージのインストール

initrd 機能を使う理由としてよくあるのは、内蔵ハードディスクが他の OS 専用になっているシステムを使う場合でしょう。Linux のカーネルと initrd イメージを Linux 用でないパーティションに置き、 liloLOADLIN を使ってこれらのイメージから 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 のデバイスファイルが作れないかもしれないからです。


次のページ 前のページ 目次へ