落穂拾い

Gleanings in my life

【Gentoo】LaVie Z へのインストール (その4)、grub2 編

2013年09月05日 01時14分45秒 | Linux
続いては boot loader の設定である。
LaVie Z というか、最近のパソコンに Linux をインストールする際に注意が必要なのはここであろう。
以前の感覚で作業しちゃうと起動しなくなってしまう。

LaVie Z は、いわゆる BIOS 形式ではなく UEFI である。
そのため boot loader は grub2 を使う必要がある。grub のバージョン1系列では対応していないのだ。

参考にするウェブページは Gentoo の wiki

というわけで、/etc/portage/package.accept_keywords に下記を追記。grub2 と efibootmgr である。

sys-boot/grub:2
sys-boot/efibootmgr
続いて /etc/portage/make.conf に下記を追記。
GRUB_PLATFORMS="emu efi-64 gentoo_platforms_efi-32 gentoo_platforms_efi-64 pc"
そして grub2 のインストール。ここでは grub2 が X とかに依存してしまって emerge 祭が発生するのを防ぐため、 USEフラグを下記のように仮設定してインストールする。
USE="-gtk3 -gtk -X" emerge --ask sys-boot/grub:2
ここから grub2 のインストールに入るわけだが、まずはファイルシステム。
efi は dos filesystem でなければならないので、こいつを入れる。
emerge -av sys-fs/dosfstools
そして予め用意してある efi 用のパーティション /dev/sda5 をフォーマット。
mkdosfs -F 32 -n efi-boot /dev/sda5
このパーティションを /boot/efi にマウントすることにする。
mkdir /boot/efi
echo 'LABEL=efi-boot /boot/efi vfat defaults 0 2' >> /etc/fstab
mount /dev/sda5 /boot/efi
そしてこの中にディレクトリを掘る。
mkdir -p /boot/efi/{EFI/BOOT,GRUB2}
さぁ、準備オッケー。grub2 のインストール!
grub2-install --target=x86_64-efi
しかし、エラーが発生。エラーの内容は下記の通り。
Fatal: Couldn't open either sysfs or procfs directories for accessing EFI variables.
Try 'modprobe efivars' as root.
Fatal: Couldn't open either sysfs or procfs directories for accessing EFI variables.
Try 'modprobe efivars' as root.
Installation finished. No error reported.
Fatal error の続きで「No error reported」とか、全く意味が分からないが、とにかく「致命的なエラー」が発生している。

どうやら、現時点で EFI が有効になっていないのが問題で、インストールは無理っぽい。
そこで USB メモリにブートローダーを入れておくことにする。

USBメモリを挿すと /dev/sdb として認識された。こいつに grub2 を入れてみる。

mkdosfs -F 32 -n efi-boot /dev/sdb1
mount /dev/sdb1 /mnt
grub2-install --target=x86_64-efi --efi-directory=/mnt --removable --modules=part_gpt
すると、
Installation finished. No error reported.
こんどは出力が減って、なんとなくうまく行ったっぽい。 そこで reboot することにする。しかし、その前に無線LANに接続できるように忘れていた wpa_supplicant を入れる。
USE="-qt4" emerge -av wpa_supplicant
上記で USE フラグを設定しているが、これをすると wpa_supplicant 単独でインストールできる。これをしないと qt4 を含め130個もインストールしようとするので、ここでは止めた方がいいだろう。

そして reboot。

うまく行くはずだった…

しかし、起動しない…、secure boot policy に違反ということで…

そこで、grub2 のメニューから必死こいて起動する。
grub2 のマニュアルを別パソコンで見ながらの作業だ。
要は、boot manager から手動で USB 上の grub2 を呼び出すようにし、そこから grub2 で Linux を起動するという作業だ。

そして起動後、

grub2-install --target=x86_64-efi
を実行。今度は boot manager 経由で起動しているので、これで内蔵 SSD 内に grub2 が無事入った。

efibootmgr コマンドで調べると、以前にインストールした sabayon の efi も残っていたので efibootmgr で消しておく。

Gentoo の efi をインストールしたりするのは下記の通り。

grub2-mkimage -p /grub2 -o /boot/efi/GRUB2/grub.efi -O x86_64-efi ext2 fat part_gpt normal
cp /boot/efi/GRUB2/grub.efi /boot/efi/EFI/BOOT/BOOTX64.EFI
grub2-mkconfig -o /boot/grub2/grub.cfg
efibootmgr --create --gpt --disk /dev/sda --part 5 --write-signature --label "Gentoo" --loader "\\EFI\\GRUB2\\grub.efi"
これで grub2 が無事インストールでき、Linux が起動できるようになった。
しかし、Windows 8 を起動するには EFI イメージを Gentoo のものから Windows 用に切り替えねばならない(BIOSの画面でちょいと面倒なことをしないといけない)。デュアルとブートとしては失格である。

そこで grub2 から Windows 8 も起動できるように設定する。

まず、grub2 のメニューに Windows 8 が出てこないのは os-prober が認識してくれないから。os-prober をアップデートしてみたりしたが役に立たず。仕方がないので、手動で設定する方向で考えることにする。

まず、Windows 8 用の EFI イメージを調べる。Windows 8 用の EFI が入っているをディレクトリをマウント。

mount /dev/sda2 /mnt
そして efi イメージを調べてみる。
grub-probe --target=fs_uuid /mnt/efi/EFI/Microsoft/Boot/bootmgfw.efi
結果は、
A82E-E847
ということだ。この efi を grub2 から呼び出すようにすれば Windows 8が起動する。
そこで、/etc/grub.d/40_custom に下記を追記して、
menuentry "Windows8" --class windows {
    insmod part_gpt
    insmod fat
    insmod search_fs_uuid
    insmod chain
    search --fs-uuid --set=root --hint-bios=hd0,gpt2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,gpt2 A82E-E847
    chainloader /efi/Microsoft/Boot/bootmgfw.efi
}

menuentry "reboot" --class redo {
    reboot
}
そして mkconfig により grub.cfg ファイルを生成する。
grub2-mkconfig -o /boot/grub2/grub.cfg 
これで grub2 の選択画面に Windows 8 も登場し、起動できるようになった。

コメントを投稿