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

6. all-in-one package の作り方

Slackwareでは色々なデバイスドライバを組みこんだカーネルを用意したファ イルシステム(ブートデイスク)とインストール用のファイルシステム(ルート ディスク) 2 枚組でインストールします。また、ルートファイルシステムにト ラブルが発生した場合などに非常用のツール一式を組みこんだルートファイル システム(レスキューディスク)も用意されています。

しかし、2 枚のディスクが必要な場合、マーフィの法則の典型例として、必要 な場合にはどちらかのディスクが見当たらなくなるので(単に私に整理能力が 無いためだろうけど、、)、これらの 2 枚分のデータを 1 枚のフロッピーに 詰めこんでしまいたくなります。本節では 1 枚の FD から Linux を起動し、 最小限のシステムが動く環境を構築する方法(all-in-one package)について説 明します。

all-in-one package を作る方法としては、通常の ramdisk を使う方法と initrd を使う方法の 2 つがあります。ramdisk を使う場合にはさらに lilo を経由する方法と経由しない方法があります。これらの方法を順に説明します。

6.1 lilo 経由で ramdisk を使う方法

ramdisk を使う場合、起動用のファイルシステムを書きこんだ FD の空いてい る部分に ramdisk に組みこむためのルートファイルシステムのイメージを書 きこむことになります。そのためには ルートファイルシステムを圧縮したイ メージを /dev/fd0 に書きこむ際に、dd の seek オプションを使っ てブートファイルシステムの分だけ後ろにずらしてやる必要があります。

この方法の利点は lilo 経由で起動するためにカーネルにコマンドラインオプ ションを指定したり、複数の設定を切りかえて使えることです。一方、欠点と しては mount してディスクの中身を確認する際に root fs の分しか内容が表 示されず、root fs として何が入っているかを確認するには起動してみるしか ないことがあります。

ここでは Slackware 3.1 に付属の AHA-1542 用ドライバを組みこんだカーネ ルに rescue disk のイメージ(rescue.gz)を書きこんで、非常用の root/boot フロッピーを作ってみます。

  1. AHA-1542 用の起動用ディスクイメージを dd を使ってフロッピーディ スクに書きだします。
    # dd if=/cdrom/slackware/bootdsks.144/aha1542.s of=/dev/fd0 bs=1k
    556+0 records in
    556+0 records out
    

    rescue disk のイメージを boot disk のイメージの後ろに書きこみたいため、 "bs=1k" オプションを指定して、boot disk のイメージがフロッピーのどこま でを占めるかを確認しておきます。この例では 1 ブロック 1k として 556 ブ ロックまで占めています。
  2. recue disk のルートファイルシステムイメージをフロッピーに追加す る。 dd の seek オプションを使ってブートディスクのイメージと重ならないよう 560 ブロック以降に rescue disk のイメージ(rescue.gz)を追記します。
    # dd if=/cdrom/slackware/rootdsks/rescue.gz of=/dev/fd0 bs=1k seek=560
    529+1 records in
    529+1 records out
    

    これで 1 枚の FD にブート用のファイルシステムとルート用のファイルシス テムが入りました。
  3. boot disk の /etc/lilo.conf の修正 次に、起動時に ramdisk を読みこむように boot disk の /etc/lilo.conf を修正します。このためには /dev/fd0 をどこか適当なディレクトリに mount する必要があります。以下では /workdir にマウントしています。
    # mount /dev/fd0 /workdir
    # df
    Filesystem         1024-blocks  Used Available Capacity Mounted on
    /dev/hda3             944303  747325   148191     83%   /
    /dev/hda1             308248  267832    40416     87%   /dos
    /dev/fd0                 539     490       49     91%   /workdir
    #
    

    この方式で作った all-in-one ディスクをマウントした場合、認識されるのは このようにブートディスクの部分だけです。 もともとの lilo.conf はこのようになっているはずです。
    # cat /workdir/etc/lilo.conf 
    boot = /dev/fd0
    message=/boot/message
    prompt
    image = /vmlinuz
            label = ramdisk
            ramdisk = 49152
            root = /dev/fd0u1440
            vga = normal
    image = /vmlinuz
    (後略)
    #
    

    この /workdir/etc/lilo.conf を修正して、起動時に自動的に ramdisk を読 みこむようにします。ramdisk 用にカーネルのコマンドラインとして以下のよ うなパラメータが用意されています。 以上のことから、今回は lilo.conf に "ramdisk_start=560 load_ramdisk=1 prompt_ramdisk=1" という指定を追加すればいいこと が分ります。これらのオプションは lilo.conf に "append = " という形で記述します。
    boot = /dev/fd0
    message=/boot/message
    append="ramdisk_start=560 load_ramdisk=1 prompt_ramdisk=0"
    prompt
    image = /vmlinuz
            label = ramdisk
            root = /dev/fd0u1440
            vga = normal
    

  4. /sbin/lilo を実行して、MBR の設定 lilo.conf を修正すると、一度 /sbin/lilo を実行して、設定情報 を MBR に反映させる必要があります。lilo は -r オプションでディレクトリ を指定すると、そのディレクトリに chroot して実行されます。今回の例では /workdir/dev/fd0 がマウントされているので、 /workdir を指定して /workdir/etc/lilo.conf の設定を 反映するように lilo を実行します。
    # /sbin/lilo -r /workdir
    Added ramdisk *
    Added big2
    Added small2
    Added drive2
    Added mount
    #
    

    これで all-in-one の boot/rescue ディスクができました。システムを FD から立ちあげて、自動的に ramdisk がロードされ、rescue disk が起動する ことを確認してください。

6.2 zdisk で ramdisk を使う方法

lilo を使って起動する場合、lilo の出す boot: プロンプトに対して必要な オプションを指定することができるので、さまざまな状況に対応することがで きます。一方、この方法では、起動用にファイルシステムが必要となり、使用 するディスクスペースも大きめになります。

一方、Linux の make zImage で作成されるカーネルイメージには FD から自 分自身を起動するためのコードが付いているので、lilo のオプション指定を する必要がない環境では lilo を使わずに直接 FD からカーネルを起動するこ とも可能です。ただし、この機能を使って ramdisk をロードするためには rdev というコマンドを使ってカーネル自身にルートファイルシステムのデバ イス名や ramdisk の位置、 ramdisk のロードの有無を書きこんでおく必要が あります。

この方法の利点は boot disk にファイルシステムが不要でカーネルイメージ を直書きすればいいだけになるので、FD の使用量が少なくできることです。 一方、欠点としては、カーネルが直接起動してしまうのでコマンドラインオプ ションを指定できないことです。そのためこの方法で 1FD router を作ること はできません(ルータを作る場合、複数の ethernet カードを認識させる必要 があるので、カーネルオプションが必須です)

また作成したフロッピーの中身を確認する方法がない(これで作った /dev/fd0 はファイルシステムとしてマウントできません)ことも欠 点と言えるでしょう。

  1. AHA-1542 用のカーネルイメージを FD に書きこむ。 前節と同様に AHA-1542 用のドライバを組みこんだカーネルを使いますが、今 回書きこむものはファイルシステムではなくカーネルそれ自身なので、必要な ファイルは /cdrom/slackware/kernels/aha1542.s/zImage になります。
    # dd if=/cdrom/slackware/kernels/aha1542.s/zImage of=/dev/fd0 bs=1k
    437+1 records in
    437+1 records out
    #
    

    ファイルシステムを書きこんだ場合、530 ブロック必要でしたが、カーネルだ けを書きだすと 440 ブロックほどで済んでいることが分ります。
  2. rescue disk のイメージを FD に追加する。 カーネルは 440 ブロックぐらいで収まっているので、rescue.gz は 450 ブロッ ク以降に書きこみましょう。
    # dd if=/cdrom/slackware/rootdsks/rescue.gz of=/dev/fd0 bs=1k seek=450
    529+1 records in
    529+1 records out
    #
    

  3. rdev でカーネル自身に必要な情報を設定 lilo の場合、カーネルにコマンドラインパラメータを使って ramdisk に関す る設定を行えましたが、今回は lilo を経由しないのでカーネル自身に必要な パラメータを書きこんでしまう必要があります。そのために使うコマンドが rdev です。まず、rdev コマンドで /dev/fd0 にあるカー ネルのルートデバイスを /dev/fd0 に書きかえておきます。
    # rdev /dev/fd0 /dev/fd0
    

    rdev ではカーネル内部の 1 word(2 bytes)の領域を直接書き替えることで ramdisk のロードの有無や ramdisk の位置を変更できます。 rdev で指定する 2 bytes のうち、下位 11 bit(0 bit -> 10 bit) は ramdisk の位置を指定するために使われ(1k 単位のオフセット情報)、14 bit 目が ramdisk のロードの有無、15 bit 目が ramdisk をロードする際のプロ ンプトの有無の指定です。 今回の例では、ramdisk をロードし(bit 14 on)、ramdisk をロードする際に プロンプトは不要(bit 15 off)、ramdisk のオフセットは 440 ブロックにな りますので、 2^15*0(prompt) + 2^14*1(ramdisk) + 440(offset) = 16824 を rdev で設定します。同時に rdev -R オプションを使ってルートファイルシス テムを r/w でマウントするように設定します。
    # rdev -r /dev/fd0 16384
    # rdev -R /dev/fd0 0
    

    これで、直接起動用の boot/root フロッピーができました。システムを再起 動して、rescue disk が正しく機能するか確認してください。

6.3 initrd を使う方法

initrd を使う方法の利点は、ロードする ramdisk のあるファイルシステムを 圧縮ファイルとして直接指定できるので、FD の中に見えない領域が無くなる ことです。私のように整理能力の無い人間にはどの root fs イメージが入っ ているのか確認してから起動できるこの方式がもっとも安心できます(笑)。ま た、FD 全体の使用量が見えるので、あとどれくらいの機能を組みこめるかを 検討する際にも便利です。

一方、この方法の欠点としては、Slackware 3.1 に付属のカーネルイメージに は initrd 機能は組みこまれていないので、このためのカーネルは手元で initrd 機能を組み込んでコンパイルしなければならないことです。また、 rescue.gz もそのままでは initrd として使えないため、少し細工をしてやる 必要があります。

  1. 手元でカーネルのコンパイル 必要なオプションを組みこんでカーネルを設定し、make zImage しておきます。 オプションを選ぶ際に、ramdisk 機能と initrd 機能は忘れずにカーネルに組 みこんでください。 ramdisk 機能はモジュール化できますが、モジュールではなくカーネルに組み こむ必要があります。
  2. 起動用の FD の準備 この方式では FD 1 枚に 1 つのファイルシステムを作って、そこに boot fs と initrd 用の圧縮したファイルシステムを置くことになります。FD にファ イルシステムを作る際は ext2fs よりも minix fs にした方が容量を効率よく 使えます。状況によっては -i オプションを使って i-node を増しておいた方 がいいかも知れません。
    # mkfs.minix /dev/fd0 1440
    480 inodes
    1440 blocks
    Firstdatazone=19 (19)
    Zonesize=1024
    Maxsize=268966912
    #
    

  3. FD に必要なファイルのコピー この FD を起動用に使うには /dev/etc 以下のファイ ルが必要ですが、それらはSlackware のブートディスクのイメージをコピーす るのが簡単でしょう。そのために /dev/fd0/workdir に、/cdrom/slackware/bootdsk.144/aha1542.s/mnt にそれぞれマウントし、tar を使ってブートディスクのイメージを FD にコピー します
    # mount /dev/fd0 /workdir
    # mount /cdrom/slackware/bootdsk.144/aha1542.s /mnt -o loop
    # df
    Filesystem         1024-blocks  Used Available Capacity Mounted on
    /dev/hda3             944303  747372   148144     83%   /
    /dev/hda1             308248  267832    40416     87%   /dos
    /cdrom/slackware/bootdsk.144/aha1542.s
                             539     490       49     91%   /mnt
    /dev/fd0                1404       1     1403      0%   /workdir
    #
    # cd /mnt
    # tar cvf - * |(cd /workdir; tar xf -)
    # sync
    # df
    Filesystem         1024-blocks  Used Available Capacity Mounted on
    /dev/hda3             944303  747372   148144     83%   /
    /dev/hda1             308248  267832    40416     87%   /dos
    /cdrom/slackware/bootdsk.144/aha1542.s
                             539     490       49     91%   /mnt
    /dev/fd0                1404     490      914     35%   /workdir
    # ls -l /workdir
    total 446
    drwxr-xr-x   2 root     root          160 Jun 13  1996 boot
    drwxr-xr-x   2 root     root         3632 May 20  1996 dev
    drwxr-xr-x   2 root     root           48 May  8  1995 etc
    drwxr-xr-x   2 root     root           32 Mar 10  1993 proc
    -rw-r--r--   1 root     root       448013 Jun 13  1996 vmlinuz
    #
    

    この時点での /workdir/vmlinuz は initrd の機能が組みこまれて いないカーネルなので、手元でコンパイルした zImage(あるいは bzImage) ファ イルを vmlinuz に置きかえます。
    # cp /usr/src/linux/arch/i386/boot/zImage /workdir/vmlinuz
    

  4. initrd の準備 initrd で使うためには rescue.gz に linuxrc というファイルを作る必要が あります(linuxrc の実体はbin/sh へのシンボリックリンクで構いません)。 このためには一度 rescue.gz を展開してファイルとしてマウントする必要が あります。
    # gunzip < /cdrom/slackware/rootdsks/rescue.gz > /tmp/rescue
    # mount /tmp/rescue /tmpmnt -o loop
    # cd /tmpmnt
    # ln -s bin/sh linuxrc
    # cd /
    # umount /tmpmnt
    # gzip -9 < /tmp/rescue > /workdir/rescue.gz
    

  5. /etc/lilo.conf の設定 /workdir/etc/lilo.conf を修正して、initrd として rescue.gz を 使うようにします。initrd を使う場合、lilo.conf に "initrd = filename" というオプションを追加します。私はこういう風にしてみま した。
    boot = /dev/fd0
    message=/boot/message
    prompt
    image = /vmlinuz
            label = ramdisk
            initrd = /rescue.gz
            vga = normal
    

    lilo.conf を設定すれば、lilo を再実行して、変更点を反映させます。
    # /sbin/lilo -r /workdir
    Added ramdisk *
    #
    

    これで initrd を使った all-in-one disk ができました。システムを再起動 して正しく機能するか確認してみてください。この例では ctrl-D や exit で linuxrc を終了させる前に、本文書中で説明した方法で実際のルートファイル システムを設定しておく必要があることに御注意ください。


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