MBPのApple EFIが自動的に認識するブートEFIファイルについて

この記事はUEFI Advent Calendar 2014 - Qiitaの第9日目として書かれました。
以下の内容はMacBook Pro Retina 13inch (late 2013)を使って検証しました。おそらく、最近のMacBook Pro/Airであれば同様の結果になると思われます。
私はMBP買ったらすぐにGentoo Linuxでシングルブートするマンであり、OS Xに関する部分は以前のメモに頼っている部分もあるため、検証が甘いと思われます(いちおう、SDカード上にOS X Yosemiteを入れて確かめています)。

MacBook Pro(以下MBP)の起動時にジャーンと鳴っている間に[Option]キーを押しておくと、グラフィカルなメニューが表示され、起動させるOSを選択することができます。この起動メニューはApple的にはStartup Managerと言うらしいですね。このStartup Managerに表示される項目について調べました。

Startup Managerに表示される条件

Startup Managerにエントリが表示される条件は、内蔵SSDUSBメモリ・SDカードを問わず、以下の条件を満たすファイルが存在することです。

パーティションテーブルはGPT、MBRパーティションテーブルのいずれでも可です。

上記のEFI起動ファイルが存在していればStartup Managerの起動エントリとして表示されます。複数のファイルが存在していれば優先順位は上記の順番通りです。

更に、ディスクがMBRパーティションテーブルである場合、ブートセクタが起動可能か否かにかかわらず、Windowsというラベルでエントリが表示されます。

このチェックは全てのディスク上のHFS+またはvfatパーティションに対して行われます。GPTのパーティション数は一般に最大128ですので、とてもたくさんのエントリを表示させることができますね(実際に幾つまで表示されるかは確認していません)。

外付け光学ディスクドライブの手持ちが無かったのでそれに関しては検証していません。ごめんなさい。
また、BootCampも使ったことが無いので全くわかりません。ごめんなさい。

Startup Managerの表示について

エントリのアイコンは対象パーティションのルートに/.VolumeIcon.icnsというMacアイコンファイルが存在すれば、それが使われます。GNU/Linuxではpng2icnsというコマンドでMacアイコンファイルを作成できます(Gentooではmedia-libs/libicnsに含まれます)。無ければデバイスに応じたデフォルトアイコンになります。

アイコンの下に表示されるテキストラベルは、HFS+上のブートファイルに対してOSXのbless(8)コマンドのFolder Modeで--labelオプションを指定した場合、その文字列が使われます。ラベルの本体は"blessed"ディレクトリ下にある._disk_label, .disk_label_2xという謎フォーマットのファイルで、--labelで指定したテキストをフォントでレンダリングした謎フォーマットの画像ファイルと思われます。
blessしていない場合またはvfatファイルシステムの場合(当然vfat上のファイルはblessできません)は、"EFI Boot"というラベルになります。

まとめ

ここまででわかる通り、Startup ManagerはEFI変数のBoot Entryとは無関係です。また、当然ながらOSXのエントリはStartup Managerに表示されることが保証されています。OSX 10.9(Marverics)のブートファイルはOSXインストールHFS+上の/System/Library/CoreServices/boot.efiであり、OSX 10.10(Yosemite)のブートファイルはOSX復元パーティションのHFS+上の同じパスにあり、StartupManagerに表示されます。

EFI Stub KernelまたはGNU grubやrEFIndなどの汎用ブートローダ、はたまたEFI Shellなどをインストールする場合、上記のデフォルトエントリに置くか、HFS+上に置いてblessするだけで、Startup Managerから起動できます。EFI変数(NVRAM)を変更する必要すらありません(blessコマンドは--setBootオプションを指定しない限りNVRAMを変更しません)。これはEFI非対応の環境からLinux等をインストールする場合にも便利です。

私がどう利用しているかというと、EFI Stub KernelのBoot Entryを作り、BootOrderの先頭に設定して(vfat上に置いていますがデフォルトパスではないのでStartup Managerからは選択できない)普段はこれを起動しつつ、更に小さなvfatパーティションを2つ用意してそれぞれのEFIデフォルトブートパスにGNU grubEFI Shellを置いてStartup Managerから選択できるようにしてあります。
EFI Shellに(rEFIndパッケージから持ってきた)ファイルシステムドライバを読み込ませることで、EFI ShellからExt4やbtrfsにアクセスできるのは大変便利です。

おまけ

BootOrderの設定されていない状態では何が起動するか。
efibootmanager --delete-bootorderしてBootOrderを空にしてからMBPを起動させると、単純にSSD上の先頭パーティションから順に検索して起動可能なEFIファイルを起動します。この際、自動的に、発見されたEFI起動ファイルをEFI変数のBoot EntryとしてBoot0080とBootFFFFに保存し、更にBootOrderにBoot0080を設定します。
この挙動の通り、購入直後のMBPにはOSXのboot.efiを指すBoot0080とBootFFFFが登録されていて、BootOrderも0080が設定されていました。