CentOSのインストールCD/DVDのstage2.img

CentOSのインストールDVDイメージには、images/stage2.imgというファイルがある。ネットワークインストールをすると最初にstage2.imgをHTTPなどで取得するが、stage2.imgの中にインストーラが格納されているようだ。stage2.imgの中がどうなっているのか、調べてみた。

stage2.imgはsquashfsのイメージだ。

% file stage2.img
stage2.img: Squashfs filesystem, little endian, version 3.0, 115222725 bytes, 9837 inodes, blocksize: 65536 bytes, created: Tue Sep  6 07:32:59 2011

以下のようにして、squashfsのイメージをマウントすることができる。

# mount -t squashfs -o ro,loop stage2.img /mnt

そのsquashfsイメージがマウントされることを想定しているディストリビューション以外でマウントしようとすると、マウントに失敗してdmesgに以下のメッセージが記録されることもある。

SQUASHFS error: Major/Minor mismatch, older Squashfs 3.0 filesystems are unsupported

中を覗くと、Linuxのroot filesystem相当のイメージが含まれていて、システムのメンテナンスに必要そうな最低限のファイルは含まれているようだ。一部のコマンドにはbusyboxが使われている。

しかし、この中のどのコマンドから実行が始まるのかは調べきれなかった。インストーラのinitrdを読む必要がありそうだった。ちなみにインストーラのanaconda関係のファイルはusr/lib/anacondaの下に格納されている。

grub-0.97のメモ

メモ

  • GRUB Legacyは、stage1, stage1.5, stage2のモジュールに分かれている。
  • ファイルシステムを処理するルーチンはstage1.5に、メニューなどを提供するルーチンはstage2に入っている。
  • stage1はセクタ0に、stage1.5かstage2はセクタ1〜nに書き込まれる。そして、stage1.5かstage2の位置がstage1の中に埋め込まれる。grub-installなどでstage1, stage1.5, stage2を書き込む時にstage1にセクタ番号を埋め込んでいる。
  • grubバイナリに埋め込まれている変数の一覧が、info grubのD.2に載っている。
  • printf debugをするには、char_io.c内で定義されているgrub_printf(), grub_putchar(), grub_putstr()を使う。出力のバッファリングはしていないので、適当にprintfしても大丈夫のはず。
  • GRUBの内蔵コマンドと関数の対応は、builtins.c内で定義されている。”boot”ならboot_func()に対応している。
  • grubのシリアルコンソールは、フロー制御の設定ができない。
  • GRUBのパッケージをインストールしただけでは、GRUBはboot loaderとしてインストールされない。(rpm -q grub –scripts を参照)

grubのsetupコマンド
grubのsetupコマンドは、embedコマンドとinstallコマンドのラッパーである。

embed /grub/e2fs_stage1_5 (hd1)
install /grub/stage1 d (hd1) (hd1)1+15 p (hd0,0)/grub/stage2 /grub/menu.lst

のように展開される。

USBメモリへのgrubインストール

USBメモリが/dev/sdbである時にUSBにgrub-0.97を書き込む時の例。
以下を実行する前に/dev/sdb1をext2で初期化して、/bootの中身をrsyncか何かで適当にコピーしておく。

# grub --no-floppy
Probing devices to guess BIOS drives. This may take a long time.


    GNU GRUB  version 0.97-4vl6  (640K lower / 3072K upper memory)

 [ Minimal BASH-like line editing is supported.  For the first word, TAB
   lists possible command completions.  Anywhere else TAB lists the possible
   completions of a device/filename.]
grub> device (hd0) /dev/sdb
device (hd0) /dev/sdb
grub> root (hd0,0)
root (hd0,0)
 Filesystem type is ext2fs, partition type 0x83
grub> setup (hd0)
setup (hd0)
 Checking if "/boot/grub/stage1" exists... no
 Checking if "/grub/stage1" exists... yes
 Checking if "/grub/stage2" exists... yes
 Checking if "/grub/e2fs_stage1_5" exists... yes
 Running "embed /grub/e2fs_stage1_5 (hd0)"...  27 sectors are embedded.
succeeded
 Running "install /grub/stage1 (hd0) (hd0)1+27 p (hd0,0)/grub/stage2 /grub/grub.conf"... succeeded
Done.
grub> quit
quit

boot floppyの作り方

cd /usr/share/grub/i386-redhat
dd if=stage1 of=/dev/sda
dd if=stage2 of=/dev/sda bs=512 seek=1