Slackwareでは色々なデバイスドライバを組みこんだカーネルを用意したファ イルシステム(ブートデイスク)とインストール用のファイルシステム(ルート ディスク) 2 枚組でインストールします。また、ルートファイルシステムにト ラブルが発生した場合などに非常用のツール一式を組みこんだルートファイル システム(レスキューディスク)も用意されています。
しかし、2 枚のディスクが必要な場合、マーフィの法則の典型例として、必要 な場合にはどちらかのディスクが見当たらなくなるので(単に私に整理能力が 無いためだろうけど、、)、これらの 2 枚分のデータを 1 枚のフロッピーに 詰めこんでしまいたくなります。本節では 1 枚の FD から Linux を起動し、 最小限のシステムが動く環境を構築する方法(all-in-one package)について説 明します。
all-in-one package を作る方法としては、通常の ramdisk を使う方法と initrd を使う方法の 2 つがあります。ramdisk を使う場合にはさらに lilo を経由する方法と経由しない方法があります。これらの方法を順に説明します。
ramdisk を使う場合、起動用のファイルシステムを書きこんだ FD の空いてい
る部分に ramdisk に組みこむためのルートファイルシステムのイメージを書
きこむことになります。そのためには ルートファイルシステムを圧縮したイ
メージを /dev/fd0
に書きこむ際に、dd の seek オプションを使っ
てブートファイルシステムの分だけ後ろにずらしてやる必要があります。
この方法の利点は lilo 経由で起動するためにカーネルにコマンドラインオプ ションを指定したり、複数の設定を切りかえて使えることです。一方、欠点と しては mount してディスクの中身を確認する際に root fs の分しか内容が表 示されず、root fs として何が入っているかを確認するには起動してみるしか ないことがあります。
ここでは Slackware 3.1 に付属の AHA-1542 用ドライバを組みこんだカーネ ルに rescue disk のイメージ(rescue.gz)を書きこんで、非常用の root/boot フロッピーを作ってみます。
# dd if=/cdrom/slackware/bootdsks.144/aha1542.s of=/dev/fd0 bs=1k 556+0 records in 556+0 records out
# dd if=/cdrom/slackware/rootdsks/rescue.gz of=/dev/fd0 bs=1k seek=560 529+1 records in 529+1 records out
/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 #
# 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 (後略) #
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
/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 #
lilo を使って起動する場合、lilo の出す boot: プロンプトに対して必要な オプションを指定することができるので、さまざまな状況に対応することがで きます。一方、この方法では、起動用にファイルシステムが必要となり、使用 するディスクスペースも大きめになります。
一方、Linux の make zImage で作成されるカーネルイメージには FD から自 分自身を起動するためのコードが付いているので、lilo のオプション指定を する必要がない環境では lilo を使わずに直接 FD からカーネルを起動するこ とも可能です。ただし、この機能を使って ramdisk をロードするためには rdev というコマンドを使ってカーネル自身にルートファイルシステムのデバ イス名や ramdisk の位置、 ramdisk のロードの有無を書きこんでおく必要が あります。
この方法の利点は boot disk にファイルシステムが不要でカーネルイメージ を直書きすればいいだけになるので、FD の使用量が少なくできることです。 一方、欠点としては、カーネルが直接起動してしまうのでコマンドラインオプ ションを指定できないことです。そのためこの方法で 1FD router を作ること はできません(ルータを作る場合、複数の ethernet カードを認識させる必要 があるので、カーネルオプションが必須です)
また作成したフロッピーの中身を確認する方法がない(これで作った
/dev/fd0
はファイルシステムとしてマウントできません)ことも欠
点と言えるでしょう。
/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 #
# dd if=/cdrom/slackware/rootdsks/rescue.gz of=/dev/fd0 bs=1k seek=450 529+1 records in 529+1 records out #
rdev
です。まず、rdev コマンドで /dev/fd0
にあるカー
ネルのルートデバイスを /dev/fd0
に書きかえておきます。
# rdev /dev/fd0 /dev/fd0
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
initrd を使う方法の利点は、ロードする ramdisk のあるファイルシステムを 圧縮ファイルとして直接指定できるので、FD の中に見えない領域が無くなる ことです。私のように整理能力の無い人間にはどの root fs イメージが入っ ているのか確認してから起動できるこの方式がもっとも安心できます(笑)。ま た、FD 全体の使用量が見えるので、あとどれくらいの機能を組みこめるかを 検討する際にも便利です。
一方、この方法の欠点としては、Slackware 3.1 に付属のカーネルイメージに は initrd 機能は組みこまれていないので、このためのカーネルは手元で initrd 機能を組み込んでコンパイルしなければならないことです。また、 rescue.gz もそのままでは initrd として使えないため、少し細工をしてやる 必要があります。
# mkfs.minix /dev/fd0 1440 480 inodes 1440 blocks Firstdatazone=19 (19) Zonesize=1024 Maxsize=268966912 #
/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
# 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
/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
# /sbin/lilo -r /workdir Added ramdisk * #