このページでは、「前提条件」が成り立っている状況で 以下のことを行うノウハウを紹介しています。
注意:全てのパッチは、派生した元ソースのモノに従います。 このページで紹介されているパッチは binutils と GNU GRUB に対するパッチですから、両方とも GPL に従います。
ブートローダのインストールは非常に危険な部類に入る作業です。 各自の責任で行ってください。 このページは私が行った作業のメモの域を超えておらず、 また、その作業の危険さゆえ、このページの直接的な「やり方」を 参照するのではなく、その根底に流れている「エッセンス」を 理解するためにこのページを利用するべきです。
そもそも、このページのような作業が必要になる理由は、 私が作業した時点でのツール自体の不備によるところが大きいので、 以下のような前提条件のもとで通用する話となります:
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 というのは普通のプラットフォームでは 自分で入れるべきものではないので、 いろいろと不都合が起こる可能性があります。 実際、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
つぎに、これをインストールするのですが、バイナリだけが 必要なので、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 を変更します。具体的には このような変更です。 これは、
note: fsys_* には手を入れる必要もない気がします。 が、いちいち考えたりテストしたりしたくないので 変更しました。
ソースを展開し、このパッチをあてたあとにコンパイルします。 ここで、
PATH=/usr/libexec/elf:$PATH
あとは、適当にインストールしてください。私は、
dd if=stage1/stage1 of=/dev/fd0 dd if=stage2/stage2 of=/dev/fd0 bs=512 seek=1
dd if=stage2/stage2 of=/dev/wd0 bs=512 seek=1
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/* .