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