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

4. ブートディスク作成上級編

4.1 概要

これまでの節では boot/root ディスクの作り方の基本について述べて来まし た。この方法はいまのところほとんど全てのカーネル(最新の安定版は 2.0) に適用することができます。

1.3.48 以降のカーネルでは、 RAM ディスクのコードがかなり書き換えられ、 重要な新機能が追加されました。これらのカーネルはブート時に圧縮されたファ イルシステムを自動的に検知し、解凍して RAM ディスクにロードします。こ のルートファイルシステムはカーネルが入っているのとは別のディスクにも置けます。 また 1.3.98 辺り以降のカーネルでは RAM ディスクのサイズを動的に拡張 できます。

要するに、この新機能を用いれば、ブートディスクに入れることのできる中身 を非常に増やすことができるわけです。圧縮を用いれば 1722K のディス クに 3.5 メガほどのファイルを入れることができます。ブートディスクを作っ た人ならおわかりと思いますが、小さなファイルシステムに押し込むためにファ イルを取捨選択してサイズを合わせるのは結構な時間がかかります。新しい機 能を使えばもうそれほど苦労しなくてもすむでしょう。

残念ながら、これらの新しい機能を持ったブートディスクを作るのは現在のと ころそれほど簡単ではありません。圧縮ファイルシステムをフロッピーに作る には、ファイルシステムを他のデバイスに作り、それを圧縮してからフロッピー にコピーします。作業が少々増えるわけです。

圧縮されたルートファイルシステムを作る手順は以下のようになります。まず カーネルをフロッピーディスクにコピーし、カーネルにルートファイルシステ ムの場所を教えます。そして圧縮ルートファイルシステムをフロッピーにコピー するのです。

ディスクがどのようになっているかを簡単な ASCII の絵で示します。

|<--- zImage --->|<------ Compressed root filesystem -------->|
|________________|____________________________________________|
             Floppy disk space

以下に boot フロッピーの作り方を順を追って説明します。

4.2 ルートファイルシステムを作る

ルートファイルシステムの作り方は、 root ディスク の節で説明した内容とほぼ同じです。ここでの手順における最も大きな違いは、 ファイルシステムを直接フロッピー上には作成できないということです。別の (フロッピーより容量の大きな)デバイスにファイルシステムを作成しなけれ ばなりません。

デバイスを選ぶ

このようなルートファイルシステムを作成するには充分大きなデバイスが必要 になります。以下のようなものが候補となるでしょう。

以上のどれかを用いてデバイスを作ったら、まず次のようなコマンドを実行 します。

        dd if=/dev/zero of=DEVICE bs=1k count=3000

このコマンドによってデバイスの中身が 0 で埋め尽くされます。圧縮ファイ ルシステムを作成するにあたってはこの作業は重要です。未使用の部分を全て 0 にしておくと圧縮率を最大にできるからです。

次にファイルシステムを作ります。

        mke2fs -m 0 DEVICE

ループバックデバイスを使うときは DEVICE の部分にデバイスにしたファイル 名を入れて下さい。この場合 mke2fs は実行確認を求めますので、yes と答え て下さい。

ここでデバイスをマウントします。

        mount -t ext2 DEVICE /mnt

この後は root ディスク の節で説明したように /mnt へファイルをコピーしていって下さい。

ファイルシステムを圧縮する

ルートファイルシステムへのコピーが終わったら、ファイルシステム全体をコ ピーしなおして圧縮します。まずマウントを解除します。

        umount /mnt

原理的にはマウントしたままでもファイルシステムのコピーは可能で すが、危険ですので行わないほうが良いでしょう。

次にデバイスの内容をディスクファイルへコピーします。ディスクファイルの 名前を rootfs としますと以下のようになります。

        dd if=DEVICE of=rootfs bs=1k

続いて圧縮します。 gzip に '-9' オプションを用いて、圧縮率を最大にします。

        gzip -9 rootfs

数分かかることもあります。終了すると rootfs.gz ができているでしょう。 これが圧縮されたルートファイルシステムです。

ディスク容量に余裕がなければ dd と gzip を同時に行なうこともできます。

        dd if=DEVICE bs=1k | gzip -9 > rootfs.gz

4.3 容量を計算する

この段階でカーネルとファイルシステムの両方がフロッピーに入るかどうか確 認しましょう。 "ls -l" を用いると、それぞれが必要とするバ イト数が確認できます。これを 1024 で割れば必要なブロック数が解ります。 割った余りにも 1 ブロック必要ですから注意して下さい。

例えばカーネルのサイズが 453281 バイトだったら、必要なブロック数は以下 の式で得られます。

        ceil(453281 / 1024) = 443 (訳注: ceil -> 切り上げ)
従ってカーネルはフロッピーの 0-442 ブロックを必要とすることになります。 ルートファイルシステムの圧縮イメージは第 443 ブロックからはじまります。 このブロックの番号を記録しておいて下さい。以下のコマンドではこれを ROOTBEGIN と表します。

次にカーネルにこのルートファイルシステムのフロッピー上の位置を知らせる 必要があります。カーネルイメージの ramdisk 変数にはルートファイルシス テムの位置に関係するオプションが指定されています。この変数は /usr/src/linux/arch/i386/kernel/setup.c で定義されており、以下のような 内容を保持しています。

第 0-10 ビット

RAM ディスクの先頭位置のオフセットアドレス。 1024 バイトブロックの数で与えられます。これが先ほど計算した ROOTBEGIN にな ります。

第 11-13 ビット

未使用です。

第 14 ビット

RAM ディスクをロードするかどうかのフラグです。

第 15 ビット

フロッピー交換のプロンプトを出すかどうかのフラグです。

第 15 ビットがセットされていると、ブート時に 2 枚目のフロッピーをドライブに 入れるようにというプロンプトが出ます。ディスク 2 枚からなるブートシス テムではこのフラグが必要になります。これに関しては後程 2 枚組のセットを作る の節で説明します。今のところはこのビットは 0 としておいて下さい。

ルートファイルシステムが第 443 ブロックからはじまるとすると ramdisk 変数は以下のように計算できます。

        1BB (16進)      443 (10進)        (第 0-10 ビット)
     + 4000 (16進)      RAM ディスクロードのフラグ (第   14 ビット)
       ----------
     = 41BB (16進) 
     =16827 (10進)

この ramdisk 変数は "rdev -r" を用いてカーネルイメージに設 定します。実際の作業については次の節で説明します。

4.4 ファイルをフロッピーにコピーする

この時点でブートフロッピーを作成する準備ができたことになります。まずカー ネルをコピーします。

        dd if=zImage of=/dev/fd0

次にカーネルにルートファイルシステムをフロッピーから取得する旨を伝えま す。

        rdev /dev/fd0 /dev/fd0

次にフロッピーに置かれたカーネルイメージの ramdisk 変数を設定します。 ramdisk 変数の設定には "rdev -r" コマンドを用います。 容量を計算する の節で求めた数値を用いて以下を実行します。

        rdev -r /dev/fd0 16827

最後にルートファイルシステムをカーネルの続きに書き込みます。 dd コマン ドの seek オプションを用いれば、先頭からスキップするブロック数を指定で きます。

        dd if=rootfs.gz of=/dev/fd0 bs=1k seek=443

ここで 443 は 容量を計算する で計算した ROOTBEGIN の値です。

フロッピードライブの書き込みが終われば完成です。

4.5 2 枚組のセットを作る

もっと容量が必要な場合には、 2 枚組のブートセットを作ることができます。 この場合 1 枚目のフロッピーにはカーネルのみを入れ、 2 枚目には圧縮され たルートファイルシステムを入れます。この方法を使うと圧縮ファイルシステ ムのサイズとして 1440K まで使えるようになります。

2 枚組のセットを作るのは先ほどの手順を少々変更するだけです。まず ramdisk 変数のディスク交換プロンプトのフラグを 1 にして、カーネルが 2 枚目のフロッピーを待つように設定します。ルートファイルシステムは 2 枚 目のフロッピーの先頭から始めます。

容量を計算する の節で説明したように、今回の場合にはフロッピー交換プロンプトのフラグを 1 にして、 RAM ディスクのオフセットを 0 にします。今回は以下のようにな ります。

        4000 (16進)     RAM ディスクロードのフラグ     (第 14 ビット)
      + 8000 (16進)     ディスク交換プロンプトのフラグ (第 15 ビット)
      -------------
      = C000 (16進)
      =49152 (10進)

この数値を前のように "rdev -r" を用いてカーネルに書き込み ます。

ファイルをフロッピーにコピーする の手順にしたがって作業を進めます。ただし "rdev -r" まで終 わったら新しいフロッピーに交換して、以下のコマンドを実行します。

        dd if=rootfs.gz of=/dev/fd0

ディスクの先頭から書き込むので seek オプションはつけません。


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