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

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


2004-03-01 (Mon)

[Linux] Debian インストール工程の解析

Red Hat サーバー乗っ取り計画

Hello, world! 物語も無事終了したことであるし、しばらく備忘録を兼ねて「Debian インストール」の技術背景を解析しておこうと思う。事の発端は、先日も書いたように Red Hat 9 で稼働中のサーバーシステムを Debian にエイヤッと切り替えてしまいたいことにある。

Debian のインストール本や解説資料は数多いが、このような不埒な行動を起こすためのノウハウは、世界広しと言えどもなかなか見つかりはしない。世の中、そんなものである。道がなければ、自力で切り開くしかないのだ。

ということで、stable 版のレスキューディスク(いわゆるブートディスク)の解析から、順を追って進めていきたいと思う。

Debian stable 版のFDディスクイメージはこちらに用意されている。この中の rescue.bin が目指すブートディスク・イメージファイルである。早速、ダウンロードしてみよう。

/usr/src/debian/fd # wget http://ftp.jp.debian.org/debian/dists/stable/main/disks-i386/current/images-1.44/rescue.bin
/usr/src/debian/fd # wc -c rescue.bin 
1474560 rescue.bin
/usr/src/debian/fd # file rescue.bin 
rescue.bin: x86 boot sector, system SYSLINUX, FAT (12 bit)

最近の file コマンドは大層賢くなっており、このように rescue.bin が「12bit FAT 型式でフォーマットされた SYSLINUX ブートディスク」であることを教えてくれる。ちなみに、私が使っている file コマンドのバージョンは 3.37 である(Debian では同コマンドは file パッケージに含まれている)。

/usr/src/debian/fd # file -v
file-3.37-3.1
magic data from /etc/magic:/usr/share/misc/magic
/usr/src/debian/fd # which file
/usr/bin/file

確かに、書籍やオンライン上の文書には rescue.bin の入手方法や、レスキューディスクの作り方が懇切丁寧に書かれてはいる。しかし、一歩踏み込んで「rescue.bin の中身はどうなってんのよ?」という問いを発するとどうだろうか?私の経験上、ほとんどの場合は、虚しく自分の問いかけがこだまするだけである。

他力本願では生きてはいけぬ。ここからが、腕の見せ所だ。まずは、rescue.bin の中身を確認してみよう。このためには、Linux お得意の「ループバック型ブロックデバイス」を活用する。make menuconfig 中では、同デバイスを「ループバックデバイス」と呼称しているが、これではユーザーがネットワークデバイスのループバックと混同してしまう恐れがある。よって、私は「ループバック型ブロックデバイス」と記述するようにしている。

/usr/src/debian/fd # mount -o loop rescue.bin /mnt
/usr/src/debian/fd # mount
...
/usr/src/debian/fd/rescue.bin on /mnt type msdos (rw,loop=/dev/loop1)
/usr/src/debian/fd # df /mnt
Filesystem           1k-blocks      Used Available Use% Mounted on
/usr/src/debian/hd-media/initrd
                          1423      1093       330  77% /mnt
/usr/src/debian/fd # ls -l /mnt
total 1093
-rwxrwxr-x    1 root     root         3952 May 15  2002 config.gz
-rwxrwxr-x    1 root     root         1139 May 15  2002 debian.txt
-rwxrwxr-x    1 root     root          804 May 15  2002 f1.txt
-rwxrwxr-x    1 root     root          763 May 15  2002 f10.txt
-rwxrwxr-x    1 root     root          752 May 15  2002 f2.txt
-rwxrwxr-x    1 root     root         1071 May 15  2002 f3.txt
-rwxrwxr-x    1 root     root         1209 May 15  2002 f4.txt
-rwxrwxr-x    1 root     root         1214 May 15  2002 f5.txt
-rwxrwxr-x    1 root     root         1337 May 15  2002 f6.txt
-rwxrwxr-x    1 root     root          899 May 15  2002 f7.txt
-rwxrwxr-x    1 root     root         1348 May 15  2002 f8.txt
-rwxrwxr-x    1 root     root         1269 May 15  2002 f9.txt
-rwxrwxr-x    1 root     root         1520 May 15  2002 install.sh
-r-xr-xr-x    1 root     root         7060 May 15  2002 ldlinux.sys
-rwxrwxr-x    1 root     root      1005181 May 15  2002 linux.bin
-rwxrwxr-x    1 root     root          650 May 15  2002 rdev.sh
-rwxrwxr-x    1 root     root          902 May 15  2002 readme.txt
-rwxrwxr-x    1 root     root        81847 May 15  2002 sys_map.gz
-rwxrwxr-x    1 root     root         1402 May 15  2002 syslinux.cfg
-rwxrwxr-x    1 root     root            7 May 15  2002 type.txt

一般ファイルをループバック型ブロックデバイスとしてマウントするためには、-o loop オプションを忘れないように。

マウント結果を見ると、確かに SYSLINUX がインストールされた FAT ディレクトリであることが分かる。本ディレクトリ中、SYSLINUX の本体は ldlinux.sys という名前のファイルである。その詳細については、今月発売の GCC プログラミング工房で解析しているので、興味のある方は参照して欲しい。

Linux 上で SYSLINUX のインストールを行うためには、syslinux /dev/fd0 のように実行するが、ldlinux.sys やブートセクタープログラムは一体どこからやって来るのか?その謎をソースレベルから解析してみた。SYSLINUX の作者である Peter Anvin 氏は、シビレルようなテクニックを使い、このマジックを実現しており、ソースは一見の価値がある。

さて、ズラズラと並ぶファイルの中で、重要なものは数えるほどしかない。それは、linux.bin と syslinux.cfg のふたつである。その他のファイルについても、次回チェックしてみよう。