/ «2004-03-01 (Mon) ^ 2004-03-07 (Sun)» ?
   西田 亙の本:GNU 開発ツール -- hello.c から a.out が誕生するまで --

Categories Books | Hard | Hardware | Linux | MCU | Misc | Publish | Radio | Repository | Thoughts | Time | UNIX | Writing | プロフィール


2004-03-03 (Wed)

[Linux] Debian rescue.bin 解剖学

rescue.bin は何をしているのか?

それでは、前回の続きから始めよう。まず、ダウンロードした rescue.bin FDイメージファイルの中身を再確認。

/usr/src/debian/fd # mount -o loop rescue.bin /mnt
/usr/src/debian/fd # ls -F /mnt
config.gz*   f2.txt*  f6.txt*  install.sh*   readme.txt*
debian.txt*  f3.txt*  f7.txt*  ldlinux.sys*  sys_map.gz*
f1.txt*      f4.txt*  f8.txt*  linux.bin*    syslinux.cfg*
f10.txt*     f5.txt*  f9.txt*  rdev.sh*      type.txt*

既に説明した通り、この中で大切なファイルは SYSLINUX 本体(ldlinux.sys)、SYSLINUX 設定ファイル(syslinux.cfg)、そして Linux カーネルイメージ(linux.bin)の3つである。他のファイルにほとんど意味はないが、type.txt だけは、インストール後半でカーネルイメージをルートファイルシステムにダウンロードする際に必要となる。その中身はいたって簡単であり、"rescue" というサインが書かれているだけである。

/usr/src/debian/fd # hexdump -C /mnt/type.txt 
00000000  72 65 73 63 75 65 0a                              |rescue.|
00000007

インストーラーは、レスキューディスクを挿入するようユーザーに指示し、type.txt ファイルの中身をチェックした後に、linux.bin を読み込むため、rescue.bin においては本ファイルの存在が重要なのである。

添付されている linux.bin カーネルイメージのビルドオプションは zcat /mnt/config.gz を実行することで確認することができる。

SYSLINUX 設定ファイル

rescue.bin において、最も注目すべきは、syslinux.cfg である。その中身は、次のようになっている。

FONT font.psf
# see /usr/doc/syslinux/syslinux.doc.gz for file format description
DEFAULT linux.bin
APPEND vga=normal noinitrd load_ramdisk=1 prompt_ramdisk=1 ramdisk_size=16384 root=/dev/fd0 disksize=1.44 
TIMEOUT 0
DISPLAY debian.txt
PROMPT 1
F1 f1.txt
F2 f2.txt
F3 f3.txt
F4 f4.txt
F5 f5.txt
F6 f6.txt
F7 f7.txt
F8 f8.txt
F9 f9.txt
F0 f10.txt
LABEL linux
KERNEL linux.bin
APPEND vga=normal noinitrd load_ramdisk=1 prompt_ramdisk=1 ramdisk_size=16384 root=/dev/fd0 disksize=1.44 
LABEL initrd
KERNEL linux.bin
APPEND vga=normal noinitrd load_ramdisk=1 prompt_ramdisk=1 ramdisk_size=16384 root=/dev/fd0 disksize=1.44 
LABEL ramdisk
KERNEL linux.bin
APPEND vga=normal noinitrd load_ramdisk=1 prompt_ramdisk=1 ramdisk_size=16384 root=/dev/fd0 disksize=1.44 
LABEL ramdisk0
KERNEL linux.bin
        APPEND vga=normal noinitrd load_ramdisk=1 prompt_ramdisk=1 ramdisk_size=16384 root=/dev/fd0 disksize=1.44 
LABEL ramdisk1
KERNEL linux.bin
        APPEND vga=normal noinitrd load_ramdisk=1 prompt_ramdisk=1 ramdisk_size=16384 root=/dev/fd1 disksize=1.44 
LABEL floppy
KERNEL linux.bin
        APPEND vga=normal noinitrd root=/dev/fd0 disksize=1.44 
LABEL floppy0
KERNEL linux.bin
        APPEND vga=normal noinitrd root=/dev/fd0 disksize=1.44 
LABEL floppy1
KERNEL linux.bin
        APPEND vga=normal noinitrd root=/dev/fd1 disksize=1.44 
LABEL rescue
KERNEL linux.bin
        APPEND vga=normal noinitrd

例によって枝葉が私達の視界を邪魔している。余分な枝はバッサリ切り落とし、エッセンスをまとめると次のようになる(SYSLINUX コマンドについては、こちらを参照)。

DEFAULT linux.bin
APPEND load_ramdisk=1 prompt_ramdisk=1 ramdisk_size=16384 root=/dev/fd0

簡単ではないか。具体的には、

  • デフォルトのカーネルイメージには linux.bin を用いる
  • ルートデバイスは /dev/fd0
  • Initial RAMDISK をFDからロードする
  • ロードする際、ユーザーにディスク交換の指示を出す
  • RAMDISK のサイズは 16MB(通常、デフォルトは4MB)

を意味している。

このあたりについては、Interface 2002年7月号特集 "Linux徹底詳解" や Embedded UNIX "Linux システム縮小化計画" において、詳しく解説しているので、興味のある方は参照してほしい。

Linux 2.6 rescue.bin の作成

これだけでは、全く面白くないので、Debian rescue.bin を Linux kernel 2.6 版に改造してしまおう。ちなみに、この改造により、最終インストールまで到達できるかどうかは、「神のみぞ知る」である。白状すると、私自身未体験ゾーンなのである。よい子は、くれぐれも真似をしないように。

それでは、SYSLINUX 起動ディスクを手作りするところから、始めよう。何事も、他人のお下がりではなく、自らの手を動かすことが大切だ。最初は、ブランクFDイメージを作成する。

/usr/src/debian/fd # dd if=/dev/zero of=fd.img bs=512 count=2880
2880+0 records in
2880+0 records out
/usr/src/debian/fd # wc -c fd.img
1474560 fd.img

毎度お馴染みの dd コマンドを用いる。UNIX に初めて触れたとき、「なんやねん、これ?」という強烈な印象をもったコマンドが、この dd である。DOS の世界しか知らなかった当時の私には、しばらくこのコマンドが意味するところが理解できなかったのだが、今は一番のお気に入りと化している。

ブランクFDイメージが出来たところで、SYSLINUX をインストールするが、その前にFDイメージに対して昔懐かしの「format」を実行しておく必要がある。

Linux 上で、DOS format を実行するためには、2つの方法がある。ひとつは、mkdosfs コマンドを用いる場合(dosfstools パッケージ)、もうひとつはMTOOLS パッケージ中の mformat コマンドを用いる場合である。一般的には、後者が好んで使われているようだ。

ただし、MTOOLS コマンド群に対して、このようなファイルイメージを操作対象に指定する場合は、ちょっとしたテクニックが必要となる。具体的な方法は、4月号の GCC プログラミング工房中で述べているが、結果だけを紹介すると /usr/local/etc/mtools.conf (MTOOLS の設定ファイル)に次のような内容を用意する。

drive l:
  file="fd.img"
  cylinders=80 heads=2 sectors=18
  filter

これで、MTOOLS コマンド群に、l: ドライブ(Loop の頭文字とした)を指定できるようになる。早速、その効果を体験してみよう(以下、MTOOLS がインストールされている必要がある)。

/usr/src/debian/fd # mformat -v rescue.bin l:
/usr/src/debian/fd # mdir l:
 Volume in drive L is rescue.bin (abbr=RESCUE~BIN )
 Volume Serial Number is 048C-DD87
Directory for L:/

No files
                          1 457 664 bytes free

まず最初に mformat コマンドで、FAT 型式の mkfs (いわゆる DOS フォーマット)を行う。-v はボリューム名を指定するためのオプションだが、mdir コマンドで確認すると、確かに RESCUE.BIN というボリューム名が付いている。

それでは、SYSLINUX を fd.img 上にインストールしてみよう。SYSLINUX もほとんどのディストリビューションにおいて、あらかじめインストールされていると思うが、見当たらない場合はソースターボールに同梱されている実行可能ファイル syslinux を使うと良いだろう(興味があれば、今月の記事をナビゲーター役として、是非そのソースリスト syslinux.c に挑戦してみて欲しい)。

/usr/src/debian/fd # syslinux fd.img 
/usr/src/debian/fd # mdir l:
 Volume in drive L is rescue.bin (abbr=RESCUE~BIN )
 Volume Serial Number is 048C-DD87
Directory for L:/

ldlinux  sys      8104 2004-03-03  23:28  ldlinux.sys
        1 file                8 104 bytes
                          1 449 472 bytes free

ブランクFDイメージに SYSLINUX 本体である、ldlinux.sys が転送されていることが分かる。この時点で、dd if=fd.img of=/dev/fd0 を実行すれば、SYSLINUX 起動ディスクの一丁上がりである。