試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

GRUB 2(1.96)のインストール時の覚え書き

バージョン1.96のebuildでは、x86_64上でビルドができない?

2008/5/9現在のebuildでは、「dev-libs/lzo」パッケージがインストールされている状態であっても

checking size of long... 4
checking for __lzo_init_v2 in -llzo2... no
checking for __lzo_init_v2 in -llzo... no
checking for __lzo_init2 in -llzo... no
configure: error: LZO library version 1.02 or later is required

のように、configureスクリプトが失敗してしまう。
調べたところ、「use amd64 && multilib_toolchain_setup x86」の記述が原因と判明し、これを消したところ、問題なく進めた。バージョン1系(GRUB Legacy)*1では必要だったのかもしれないが、バージョン2系では、x86_32向けの実行ファイルのビルド部分では自動的に-m32オプションが付くようになっていて、記述を外すことによる問題はなかった。

genkernelが作成するカーネルと初期RAMディスク(initrd/initramfs)を認識させる

GRUB 2では、update-grubコマンドを実行することで、/etc/default/grub/etc/grub.d/以下のファイル群の内容をもとに設定ファイル/boot/grub/grub.cfgを生成する。*2
カーネルやinitrdは、update-grub/boot/からファイル名により自動検出・設定することになっているのだが、genkernelが生成するカーネルは、通常のファイル名(vmlinuz-[バージョン])と異なるため、検出されない。initrdも同様に名前が一部異なるため検出されない。
そこで、genkernel

というルール*3に合わせて自動検出させるための修正を
http://cid-3f9be5b1cd4a806c.skydrive.live.com/self.aspx/%e5%85%ac%e9%96%8b/Gentoo%20Linux%20ebuild/sys-boot/grub/files/grub-1.96-genkernel.patch.txt
に作成・アップロードした。
ただし、これは検出を行えるようにするようにはできるものの、util/grub.d/10_linux.in内のバージョン文字列比較関数に関係した部分は変更していない。

何故か強制的にレスキューモードに落ちてしまう件について

grub-install*4ブートローダをインストールし、update-grubで設定ファイル/boot/grub/grub.cfgを生成することで起動ができるはずなのだが、BIOSからハードディスクに起動処理が渡されると、いきなりレスキューモードのシェルに入ってしまった。ここでは何もできず、CDから起動後、Gentooのインストールと同じ要領で復旧する*5はめになった。
この原因を調べたところ、GentooPortageが行うstrip処理によって、ブートローダの動作に必要な一部ファイルのシンボルを消してしまっているのがいけないようだ。
「RESTRICT="strip"」をebuildに指定してやり直したところ、正常に動作した。
(2008/5/10)この記事中のebuildの修正に加えて、フォントに関する処理を追加した修正ebuildを作成・アップロードした。関連記事を参照。

使用したバージョン:

関連記事:

参考URL:

*1:正式リリースされずに開発は打ち切られた

*2:もちろん直接設定ファイルを記述することも可能だが、恐らくは非推奨

*3:バージョン部分は/usr/src/linux-[バージョン]/のバージョン文字列と同じ

*4:このコマンドの使用法は以前と同じで、例えば、「/dev/sda」を指定すると、「/dev/sda」で示されるディスクのMBRに初期段階プログラムが、/boot/以下に後期段階プログラムがインストールされる。「/dev/sda5」のようにパーティションを指定すると、MBRの代わりにパーティションの先頭に初期段階プログラムが入る

*5:システムにchrootして/proc/mounts/etc/mtabとしてコピー後、古いGRUB 1を入れ直した