次のページ
前のページ
目次へ
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
フロッピーを作ってみます。
- 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 ブ
ロックまで占めています。
- 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 にブート用のファイルシステムとルート用のファイルシス
テムが入りました。
- 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 用にカーネルのコマンドラインとして以下のよ
うなパラメータが用意されています。
- ramdisk_start
FD 上で ramdisk が開始するブロックを指定します。今回の例では 560 です。
- load_ramdisk
ramdisk をロードする(1)かしない(0)かの指定です。今回は 1 を指定して、
ramdisk をロードするようにします。
- ramdisk_prompt
ramdisk をロードする際にプロンプトを出す(1)か出さない(0)かの指定です。
FD が 2 枚組になっている場合は FD を入れかえるためにプロンプトを出しま
すが、all-in-one の場合はプロンプトを出す必要はないので 0 を指定します。
- ramdisk_size
必要な ramdisk のサイズです。デフォルトでは 4096k になっており、このサ
イズを超える 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
- /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 が起動する
ことを確認してください。
lilo を使って起動する場合、lilo の出す boot: プロンプトに対して必要な
オプションを指定することができるので、さまざまな状況に対応することがで
きます。一方、この方法では、起動用にファイルシステムが必要となり、使用
するディスクスペースも大きめになります。
一方、Linux の make zImage で作成されるカーネルイメージには FD から自
分自身を起動するためのコードが付いているので、lilo のオプション指定を
する必要がない環境では lilo を使わずに直接 FD からカーネルを起動するこ
とも可能です。ただし、この機能を使って ramdisk をロードするためには
rdev というコマンドを使ってカーネル自身にルートファイルシステムのデバ
イス名や ramdisk の位置、 ramdisk のロードの有無を書きこんでおく必要が
あります。
この方法の利点は boot disk にファイルシステムが不要でカーネルイメージ
を直書きすればいいだけになるので、FD の使用量が少なくできることです。
一方、欠点としては、カーネルが直接起動してしまうのでコマンドラインオプ
ションを指定できないことです。そのためこの方法で 1FD router を作ること
はできません(ルータを作る場合、複数の ethernet カードを認識させる必要
があるので、カーネルオプションが必須です)
また作成したフロッピーの中身を確認する方法がない(これで作った
/dev/fd0 はファイルシステムとしてマウントできません)ことも欠
点と言えるでしょう。
- 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 ブロックほどで済んでいることが分ります。
- 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
#
- 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 が正しく機能するか確認してください。
initrd を使う方法の利点は、ロードする ramdisk のあるファイルシステムを
圧縮ファイルとして直接指定できるので、FD の中に見えない領域が無くなる
ことです。私のように整理能力の無い人間にはどの root fs イメージが入っ
ているのか確認してから起動できるこの方式がもっとも安心できます(笑)。ま
た、FD 全体の使用量が見えるので、あとどれくらいの機能を組みこめるかを
検討する際にも便利です。
一方、この方法の欠点としては、Slackware 3.1 に付属のカーネルイメージに
は initrd 機能は組みこまれていないので、このためのカーネルは手元で
initrd 機能を組み込んでコンパイルしなければならないことです。また、
rescue.gz もそのままでは initrd として使えないため、少し細工をしてやる
必要があります。
- 手元でカーネルのコンパイル
必要なオプションを組みこんでカーネルを設定し、make zImage しておきます。
オプションを選ぶ際に、ramdisk 機能と initrd 機能は忘れずにカーネルに組
みこんでください。
ramdisk 機能はモジュール化できますが、モジュールではなくカーネルに組み
こむ必要があります。
- 起動用の 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
#
- 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
- 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
- /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 を終了させる前に、本文書中で説明した方法で実際のルートファイル
システムを設定しておく必要があることに御注意ください。
次のページ
前のページ
目次へ
|