GNU GRUB クイックハック

このページでは、「前提条件」が成り立っている状況で 以下のことを行うノウハウを紹介しています。

  1. GNU GRUB を FreeBSD でコンパイルする。
  2. GNU GRUB で NetBSD パーティションを認識させる。
FreeBSD しか利用していない人は前者しか役に立たない場合が多いでしょうし、 NetBSD を利用してる人は、後者のパッチは役に立つでしょうが、 そもそも NetBSD を使ってる人間がこれくらいのパッチを作るくらいの クイックハックができないとは思えないのと、 NetBSD で GNU GRUB をコンパイルするのは FreeBSD 以上に面倒くさそうな気がするので、 このページはあまり参考にならないでしょう。 なお、利用してるツールは生モノですので、 すぐに obsolete する可能性が非常に高いです。 前提条件に注意して利用してください。

注意:全てのパッチは、派生した元ソースのモノに従います。 このページで紹介されているパッチは binutils と GNU GRUB に対するパッチですから、両方とも GPL に従います。


注意

ブートローダのインストールは非常に危険な部類に入る作業です。 各自の責任で行ってください。 このページは私が行った作業のメモの域を超えておらず、 また、その作業の危険さゆえ、このページの直接的な「やり方」を 参照するのではなく、その根底に流れている「エッセンス」を 理解するためにこのページを利用するべきです。

前提条件

そもそも、このページのような作業が必要になる理由は、 私が作業した時点でのツール自体の不備によるところが大きいので、 以下のような前提条件のもとで通用する話となります:

そのほかに、私の環境固有の問題として、stage2 をディスク先頭にある 63 セクタ分の空きエリアにインストールしないと stage2 が 読めないというのがあって、 そのため stage2 を 512*63 = 32256 バイト以内に収めないといけない、 という事情があり、そのための作業が混在しています。

binutils と GNU GRUB の入手

GNU GRUB は FreeBSD-3.2R に入っている binutils-2.9.1 では コンパイルできません。よって、新しい binutils が必要で、 私は binutils-2.9.1.0.25 というのを拾って来ました。 ftp.kernel.org の /pub/linux/devel/gcc に置いてあります。 日本からなら ftp.jp.kernel.org が良いでしょう。

GNU GRUB は 本家のページ に書いてある通り、FTP サイト alpha.gnu.org の /gnu/hurd/src から落せます。私は grub-0.5.91 を利用しました。

binutils のコンパイル

まず始めに。 binutils というのは普通のプラットフォームでは 自分で入れるべきものではないので、 いろいろと不都合が起こる可能性があります。 実際、FreeBSD で binutils を入れ換えるとカーネルのコンパイルが できなくなるようです。 よって、以下のようにして必ずバックアップを取りましょう。

cd /usr/libexec/elf
su
mkdir 2.9.1
mv * 2.9.1/
ln -s 2.9.1/* .
cd 2.9.1

次に、binutils をコンパイルします。 普通ならば GNU のツールは configure スクリプトで 一発なのですが、binutils-2.9.1.0.25.tar.gz は そのまま configure をかけると a.out 版のツールを生成してしまいます。

note:近々直るでしょう。もう直ってるかもしれません。

これを解決する方法はいくつかありますが、 私は簡単に、FreeBSD のソースを使いました。 まず、こんな感じで展開します:

tar zxf binutils-2.9.1.0.25.tar.gz
cd binutils-2.9.1.0.25
cat /cdrom/src/sgnu.?? | tar zxf - gnu/usr.bin/binutils
このままだとコンパイルできないので、 こういうふうな変更 を行います。そして、gnu/usr.bin/binutils へと移動して make します。FreeBSD システムのソースと同様な Makefile が 使われるため、gmake ではなく、標準の make (BSD pmake) を 使用する必要があります。

つぎに、これをインストールするのですが、バイナリだけが 必要なので、make install せずに手動でコピーしました。 このほうが間違いが少ないです。

su
mkdir /usr/libexec/elf/2.9.1.0.25
cp addr2line/addr2line ar/ar as/as_i386/as ld/ld nm/nm \
   objcopy/objcopy objdump/objdump ranlib/ranlib size/size \
   strings/strings strip/strip \
   /usr/libexec/elf/2.9.1.0.25/
cd /usr/libexec/elf
rm *
ln -s 2.9.1.0.25/* .

これで binutils が入れ替わったはずです。 適当なプログラムを gcc でコンパイルして実行できるか確かめてください。

note: この方法は正攻法ではありません。非常に ad hoc です。 本来なら、"grub-tools" なるディレクトリを作り、 そこを prefix とした binutils を構築し、 GRUB の構築時だけにそれを利用するようにするのが美しい。 しかしながら、 FreeBSD-3.2R 付属の gcc は、コマンドパスにある as や ld を 使うのではなく、常に /usr/libexec/elf 以下にある as や ld を 使います。gcc のコンパイルが簡単に行えるなら、 gcc も "grub-tools" の下にインストールして利用すれば 良いのですが、FreeBSD-3.2R で gcc をコンパイルするのは 非常に面倒くさいです。もし、GRUB の最新版を おっかけたいなら、それを行う価値があるかもしれませんが、 私はそこまでする気は無いので、一時的な方法に逃げました。

note: NetBSD では、もともと a.out なのでよくわかりません。 少なくとも、ELF である必要はないようにも思えますので、 適当にやってください (^^;

GNU GRUB の変更と構築

次に GNU GRUB を変更します。具体的には このような変更です。 これは、

という二つのことを行っています。 後者は、前述した 63 セクタしばりのために、stage2 のサイズを 削減する必要があるために切り捨てています。

note: fsys_* には手を入れる必要もない気がします。 が、いちいち考えたりテストしたりしたくないので 変更しました。

ソースを展開し、このパッチをあてたあとにコンパイルします。 ここで、

PATH=/usr/libexec/elf:$PATH
などとして、/usr/libexec/elf の binutils が優先的に 使われるようにしておくほうが無難でしょう。

インストール

あとは、適当にインストールしてください。私は、

dd if=stage1/stage1 of=/dev/fd0
dd if=stage2/stage2 of=/dev/fd0 bs=512 seek=1
でブートフロッピーを作り、stage2 を
dd if=stage2/stage2 of=/dev/wd0 bs=512 seek=1
でハードディスクの頭にインストール、そして、 /grub に menu.lst を書きます。 そして、GNU GRUB のブートフロッピーを起動して、
install= (fd0)+1 (hd0) (hd0)1+63 0x8000 p (hd0,1,a)/grub/menu.lst
としてインストールしました。

note: ハードディスクの頭に stage2 をインストールする場合には、 GNU GRUB のコンパイル後、stage2 のサイズが 32256 バイト以下であることを確認してから インストールしないと痛い目に遭いますので注意してください。

後始末

binutils を元に戻します:

su
cd /usr/libexec/elf
rm *
ln -s 2.9.1/* .


塩崎に対する誹謗中傷・御意見・御感想・バグ情報・告白(?)は、
AoiMoe@imou.to
まで。
Original Copyright (c)1996-1999 T.Shiozaki, all rights reserved.