Intel macでrEFItとGRUB2 EFIを使ってLinuxを起動する

Intel macでMacOS X以外のOSを起動する場合、 Boot Campを使う方法が一般的です。Boot Campを用いると、旧来のBIOSを持ちい た方法でOSを起動できるため、今までのPC/ATなやり方でWindowsやLinuxといっ たOSを起動することができます。

しかし、Intel macでは古くさいBIOSと決別し、新しいEFIが標準の起動方法に なっています。いまさらBIOSを持ち込むBoot Campを使うのではなく、EFI を用 いてLinuxを起動する方法を説明します。(要は単なる潔癖)

例として用いるのは、Mac mini Core2Duo 2GHz (MB463J/A, Early 2009)で、 64bit modeで起動させます。

参考

用意するもの

上記のものを用意します。rEFItなしでいきなりGRUB2から起動することも可能 ですが、GRUB2を書き損じたりすると復旧に手間がかかるので、まずは実績のあ るrEFItを経由して、rEFIt → GRUB2 → Linux kernelの順で起動する ことにします。

EFI仕様のLinux kernel

まず、How to test GRUB 2 on Macbookでもふれられているように、linux-2.6.27と linux-2.6.28の64bit EFIはbugっているらしいです。 試してみましたが、kernelの起動すらできません。 そのため、64bitで使うためには、linux-2.6.29以降を用意します。

EFIを使って起動できるように、以下の設定をしたkernelを用意します。

makeしてarch/x86/boot/bzImageを作ります。これを通常どおり/bootに移します。

rEFItの準備

MacOS Xを起動してrEFItをinstallします。 rEFItのweb pageから rEFIt-0.xx.dmgを取ってきて、clickしていくだけです。

GRUB2の準備

GRUB2は、まだbinary配布されていません(2009年11月時点)。 そのため、source codeから自分で作る必要があります。 なお、MacのEFIから起動できるのはgrub-1.97以降の様です。

$ tar xfvz /somewhere/grub-1.97.tar.gz
...
$ cd grub-1.97
$ ./configure --with-platform=efi --target=x86_64
...
$ make
...
$ ./grub-mkimage -d . -o grub.efi \
    boot chain configfile echo ext2 fat fs_uuid part_gpt help \
    hfsplus linux minicmd normal search sh

以上の操作で、grub.efiが出来上がります。 続けて設定fileであるgrub.cfgを作ります。 その際に、blkidを使って、root filesystemのUUIDをあらかじめ調べておきます。

# blkid /dev/sda4
/dev/sda4: LABEL="openSUSE11.1" UUID="dd51a4f9-595e-49f8-a88d-54703703e1fc" TYPE="ext3"
#

UUIDがわかったので、以下の様な内容をgrub.cfgに書きます。

# grub.cfg for Mac mini early 2009

set timeout=2
set default=0
set fallback=1

menuentry "Linux" {
  search --set --fs-uuid dd51a4f9-595e-49f8-a88d-54703703e1fc
  linux /boot/bzImage root=/dev/sda4 ro showopts video=efifb
  initrd /boot/initrd
}

menuentry "Failsafe" {
  search --set --fs-uuid dd51a4f9-595e-49f8-a88d-54703703e1fc
  linux /boot/bzImage.backup root=/dev/sda4 showopts video=efifb single
  initrd /boot/initrd
}

できあがった、grub.efiとgrub.cfgをMacOS Xのpartitionに写します。 rEFItをinstallすると、MacOS Xのpartitionに/efiができているので、 mkdir /efi/grubして/efi/grub/grub.efiと/efi/grub/grub.cfgになるようにします。

おさらいすると、以下の3つのfileを用意できたはずです。

これで再起動するとrEFItが起動し、grub.efiを選べば、GRUB2→Linux kernelを起動できるはずです。

補足

grub.cfgにおけるpartitionの指定方法について

上記のgrub.cfgでは、"search --set --fs-uuid"を用いて vmlinuzのあるpartitionを指定しています。 代わりに、"root"を用いて次のようにすることもできます。

menuentry "Linux at (hd0,4)" {
  root (hd0,4)
  linux /boot/bzImage root=/dev/sda4 showopts video=efifb single
  initrd /boot/initrd.img
}

(hd0,4)は最初のHDDの4番目のpartitionのことです。 一見、うまく動くように見えますし、Linuxを起動することもできます。 ただし、起動時に外付けHDDを挿してあると、Mac miniのEFIは外付けHDDを (hd0)、内蔵HDDを(hd1)に割り付けてくれます。 そのため、外付けHDDがある場合は、"root (hd1,4)"にする必要があ ります。 外付けHDDが常についていいないか、常についている場合には "root"を用いた書き方でも構いませんが、つけたり外したりする場 合には、"search --set --fs-uuid"を使った方が良いでしょう。

ちなみに、この動作を逆手にとってUSB flash memoryを挿した時だけ別の kernelで起動するといった技も使えます。。。

Video BIOSについて

rEFItMyths and Factsでは、 EFI使って起動すると、IntelとATIのvideo adapterでH/W acceleration が使えないと書かれています。 これは、X.orgやXFree86のvideo driverがVideo BIOS を用いていたための制限です。

しかしIntel製video adapterに関してはこの記述はやや古く、X.org 7.3 以降で導入された"intel" driverはVideoBIOSを使用しません。 そのため、これ以降のX.orgを使うならEFIで起動しても問題なくH/W accelerationが効きます。

また、Early 2009のMac miniで採用されたGeForce 9400Mの場合、 NVIDIA製のdriverで X.orgを走らせることができます(以下のCONFIG_X86_PATに注意)。

CONFIG_X86_PATについて

EFI仕様のLinux kernelを作るところで、CONFIG_X86_PAT=N とするように説明しました。 BIOS経由の場合はCONFIG_X86_PAT=Yになっていても問題ないのですが、 EFI経由で起動した場合に限ってNVIDIAのX.org driverが "Failed to allocate video memory"といってこけるためです。 ちゃんと原因を追いかけていないので詳細は不明です。

NVIDIAのdriverを使わないとか、そもそもXを使わないというのであれば、 CONFIG_X86_PAT=Yになっていても構いません。


ご意見、ご感想は、花房 真広 <webmaster@hanabusa.net>まで。メールする前にtop pageの注意書を読んでください。