Mac EFIの挙動とBoot可能なArch Linux SDの作成

##はじめに
この記事はMacBook Pro 13inch Late2013を使って書かれました。他の機種ではうまくいかない可能性があります。  

##Mac EFIとは
Macに搭載されているEFIはEFI 1.xでもなくUEFI 2.xでもなく、両方を混ぜあわせたものです。したがってWindowsマシンなどに搭載されているUEFIとは少々違います。

##通常のUEFIとの相違点 
とりあえずLinuxをインストールするのに必要な知識は  

 - 読み込めるファイルシステムはFAT32とHFS+
 - エントリ登録はefibootmgrを使わずblessというコマンドを使う
 - リムーバブルメディアは所定の場所・名前でファイルを置けばブートメニューに現れる
 - ブートエントリにカーネルパラメータを指定できない？
  
です。一つ一つ見て行きましょう。  

####対応ファイルシステム
MacだけあってHFS+に対応しています。EFI自体は対応すべきファイルシステムについて特に言及していないそうなので拡張の範疇だと思われます。  

####efibootmgrではなくbless  
Windowsマシンではブートエントリ登録にefibootmgrを使用しますが、Macで使うとNVRAMのリセットが必要になる可能性があるそうです<sup><a href="#1" name="#1-ret">1</a></sup>。代わりにblessというコマンドを使います。  
またblessはOSXのコマンドですがFedoraの開発者によって作られたmactel-bootというユーティリティを使えばLinuxからでもエントリ登録できるようです(今回は両方共使用しません。理由は後述)  

####リムーバブルメディアなら所定の位置・名前ならばブートメニューに現れる

<strike>当たり前といえば当たり前ですが、USBメモリやSDカードの場合blessでエントリ登録しなくても、</strike>

```
{リムーバブルメディアのroot}/System/Library/CoreServices/boot.efi
```

<strike>というファイルが有ればブートメニューに現れます。その為今回のようにSDカードにインストールする場合はblessなどを考える必要がなくなります。</strike>

追記　リムーバブルメディアでなくとも可能なようです。下記のURLに私より詳しい解説があります…
[MBPのApple EFIが自動的に認識するブートEFIファイルについて](http://d.hatena.ne.jp/ichelm/20141209)
####ブートエントリにカーネルに渡すパラメータを登録できない？
<strike>efibootmgrでは-uオプションでカーネルに渡すパラメータを記述できましたがblessでそれに当たるオプションはないと思われます(情報求む)</strike>

追記
--optionsがそれに該当するとのこと。
http://twitter.com/trickart4121/status/541831445950394370

これらを踏まえてインストールしてみましょう。

##必要なもの

 - Mac
 - Arch Linuxインストールディスク
 - SDカード
 - **根気**

##手順

1. インストールディスクを起動する
    電源をいれるときにoption(alt)キーを押すことでOSXではなくブートメニューが表示されます。
2. gdiskやmkfsでSDカードにパーティションを作る
    /dev/sdbをSDカードとした時、
    
    /dev/sdb1 EFIパーティション　FAT32(128MB～)
    /dev/sdb2 rootfs お好みのfs
    
    となるようにパーティションを作ります(swapとか/home分けるとかはお好みで)
3. rootfsをマウントしてArchをインストールする
    [Wikiのインストール手順](https://wiki.archlinux.org/index.php/Installation_Guide_(%E6%97%A5%E6%9C%AC%E8%AA%9E) "Installation Guide (日本語)")を見て適当にやります。rootfsをマウントしてpacstrapを実行するところからブートローダーの前までやってください。(内蔵WiFiは使えないので有線LANアダプタが必要になります)
    fstabはUUIDで指定した方がいいかもしれません
4. /boot/efi/を作成しEFIパーティションをマウントする
    
    ```
    # mkdir /mnt/boot/efi
    # mount /dev/sdb1 /mnt/boot/efi
    ```
    
5. arch-chrootでchrootし、grubをpacmanでインストールする
    
    ```
    # arch-chroot /mnt /bin/bash
    # pacman -S grub
    ```
    
6. boot.efiを置くディレクトリを生成する
    
    ```
    # mkdir -p /boot/efi/System/Library/CoreServices
    ```
    
7. grub.cfgを生成し、grub-install **ではなく** grub-mkstandaloneを実行する
    (ちなみにgrub-installはインストールするファイルシステムをチェックしてFAT32でなかった場合インストールを中止してしまいます。今回はFAT32ですが)
    
    ```
    # grub-mkconfig -o /boot/grub/grub.cfg
    # grub-mkstandalone -o /boot/efi/System/Library/CoreServices/boot.efi -O x86_64-efi /boot/grub/grub.cfg

    ```
    
完成！optionキーを押しながら起動すればSDカードのアイコンが選べるようになるはずです。

##備考
勘の言い方はこう思ったことでしょう「GRUBいらなくね？」と。  
確かにブートエントリにパラメータを仕込めなかったり、ブートローダーがなくてもカーネルコンフィグにて「CONFIG_CMDLINE」などを駆使すれば出来なくはないかもしれません。しかし、仮に出来たとしてもカーネル更新の度に自分でコンパイルやファイルの設置をしなければならないため現実的ではないでしょう。(Gentooユーザーはお帰りください)  
それでも気になるという方は頑張ってください。  
また手前味噌ではありますが、SDではなく内蔵SSDにインストールする方法について気になる方はこちらをご覧ください。
[Arch Linux on MacBook Pro without rEFIt/rEFInd](http://gametricks.blog40.fc2.com/blog-entry-85.html)  
また参考URL2つめは面白いので必見です。ハードリンクを使うためにEFIパーティションにHFS+を使い、grub-installのファイルシステムがFAT32かのチェックをスクリプトを直接編集してなくしたり(今はバイナリになっているので出来ませんが。)となかなかクレイジーです。

##参考
[Unified Extensible Firmware Interface (日本語) - ArchWiki](https://wiki.archlinux.org/index.php/Unified_Extensible_Firmware_Interface_%28%E6%97%A5%E6%9C%AC%E8%AA%9E%29)
[glandium.org » Blog Archive » Debian EFI mode boot on a Macbook Pro, without rEFIt](http://glandium.org/blog/?p=2830)
[MacBookPro11,x - ArchWiki](https://wiki.archlinux.org/index.php/MacBookPro11,x)
[bless(8) Mac OS X Manual Page](https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man8/bless.8.html)

##脚注

1. [Unified Extensible Firmware Interface (日本語) - ArchWiki](https://wiki.archlinux.org/index.php/Unified_Extensible_Firmware_Interface_%28%E6%97%A5%E6%9C%AC%E8%AA%9E%29) <a href="#1-ret" name="1">↩</a>