ArchLinuxをGPTなUEFIのGRUBで起動する

# みんなやってるのに、つまづいた
今まで、あまりに古い、BIOSのPCばかりだった。
初めてUEFIにArchLinuxを入れた時に、つまづいたことを思い出して、メモ。

# つまづいたポイント
ArchLinux Wikiには、[UEFI](https://wiki.archlinuxjp.org/index.php/Unified_Extensible_Firmware_Interface)も[ESP](https://wiki.archlinuxjp.org/index.php/EFI_%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3)も[GPT](https://wiki.archlinuxjp.org/index.php/GUID_Partition_Table)も[GRUB](https://wiki.archlinuxjp.org/index.php/GRUB)も[パーティショニング](https://wiki.archlinuxjp.org/index.php/%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8B%E3%83%B3%E3%82%B0)も[インストールガイド](https://wiki.archlinuxjp.org/index.php/%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%AC%E3%82%A4%E3%83%89)も、情報が盛りだくさんだが、

- GPTのパーティションツールに、何を使えばいいかわからない
- ESPと/bootが、何だかわからない
- ブートローダーに何を使えばいいかわからない
- インストール時のmount手順がわからない

いずれも、今思えば、なんでわからなかったんだろう…。

# パーティションツール
[パーティションユーティリティ](https://wiki.archlinuxjp.org/index.php/GUID_Partition_Table#.E3.83.91.E3.83.BC.E3.83.86.E3.82.A3.E3.82.B7.E3.83.A7.E3.83.B3.E3.83.A6.E3.83.BC.E3.83.86.E3.82.A3.E3.83.AA.E3.83.86.E3.82.A3)を読むと、fdiskに慣れているならgdiskか。

[パーティション](https://wiki.archlinuxjp.org/index.php/%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%AC%E3%82%A4%E3%83%89#.E3.83.91.E3.83.BC.E3.83.86.E3.82.A3.E3.82.B7.E3.83.A7.E3.83.B3)では、UEFI用にはgdiskではなくGNU Partedが紹介されているが、gdiskでも特に困らなかった。
インストーラーisoには、gdiskもGNU Partedも両方入っていた。
ちなみに、[GParted](https://wiki.archlinuxjp.org/index.php/GParted)はGUIで、[GNU Parted](https://wiki.archlinuxjp.org/index.php/GNU_Parted)がCUIなのか。混同。

# ESPと/boot
## ESP
[ESP](https://wiki.archlinuxjp.org/index.php/EFI_%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3)の説明そのまんま。
ブートローダーが含まれる、ファイルシステムがFAT32のパーティション。

### ESPのサイズ
ArchLinuxでは[512MiBが推奨](https://wiki.archlinuxjp.org/index.php/EFI_%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3#.E3.83.91.E3.83.BC.E3.83.86.E3.82.A3.E3.82.B7.E3.83.A7.E3.83.B3.E3.81.AE.E4.BD.9C.E6.88.90)とある。Windowsでは[最小100MB](https://msdn.microsoft.com/ja-jp/library/hh824839.aspx)、Ubuntuでは[200MiBが推奨](https://help.ubuntu.com/community/UEFI#Creating_an_EFI_System_Partition)らしい。4Kセクタなら最小256MB?
どちらにせよ512MiBあれば十分ということだな。

### ESPの場所

ESPはどの順番に置いてもよい。
[パーティションのフォーマット](https://wiki.archlinuxjp.org/index.php/インストールガイド#.E3.83.91.E3.83.BC.E3.83.86.E3.82.A3.E3.82.B7.E3.83.A7.E3.83.B3.E3.81.AE.E3.83.95.E3.82.A9.E3.83.BC.E3.83.9E.E3.83.83.E3.83.88)の例では、ESPは/dev/sda2にあるが、最初に置きたくなるのが人情なので、/dev/sda1に置いた。

### ESPのbootフラグ

GNU Partedではbootフラグの設定があるのに、gdiskにはないのが不安だった。
[こちら](http://d.hatena.ne.jp/syuu1228/20130103/1357165915)によると、ESPはGUIDで識別されるようだ。
gdiskでは、Typeにef00を設定することで、ESP用のGUIDが設定されるものと思われる。
GNU Partedでは、GPTでbootフラグを設定すると、ESP用のGUIDが設定されるのかな。(未確認)

## /boot
systemd-bootでは、ESPは/bootにmountされることが[強く推奨](https://wiki.archlinuxjp.org/index.php/Systemd-boot#.E3.82.A4.E3.83.B3.E3.82.B9.E3.83.88.E3.83.BC.E3.83.AB)されるそうだし、GRUBでも[通常ESPは/boot](https://wiki.archlinuxjp.org/index.php/GRUB#.E3.82.A4.E3.83.B3.E3.82.B9.E3.83.88.E3.83.BC.E3.83.AB_2)だそうなので、ESPは/bootにmountすることにする。

[バインドマウント](https://wiki.archlinuxjp.org/index.php/EFI_%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3#.E3.83.90.E3.82.A4.E3.83.B3.E3.83.89.E3.83.9E.E3.82.A6.E3.83.B3.E3.83.88.E3.82.92.E4.BD.BF.E3.81.86)で「ESPを自由に扱えるようにする」メリットがいまいちわからないが、[他のディストリビューション](https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Installation_Guide/s2-grub-whatis-booting-uefi.html)では/boot/efiなどにmountされたりするらしい。

# ブートローダー
[ブートローダー](https://wiki.archlinuxjp.org/index.php/%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%AC%E3%82%A4%E3%83%89#.E3.83.96.E3.83.BC.E3.83.88.E3.83.AD.E3.83.BC.E3.83.80.E3.83.BC)ではUEFI用に[systemd-boot](https://wiki.archlinuxjp.org/index.php/Systemd-boot)が紹介されているが、GRUBもUEFIで[使える](https://wiki.archlinuxjp.org/index.php/GRUB#UEFI_.E3.82.B7.E3.82.B9.E3.83.86.E3.83.A0)。
GRUBは、設定ファイルを`grub-mkconfig`で自動生成できるので、UUIDなどを手書きしなくてよく、個人的には楽だと思った。

UEFIでのGRUBは、あらかじめefibootmgrも入れておく必要があるようだ。
でないと、`grub-install`の時に、`grub-install: error: efibootmgr: not found.`と怒られる。

# インストール時のmount手順
個人的には、これがいちばんはまった。今見ると、単に[インストールガイド](https://wiki.archlinuxjp.org/index.php/%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%AC%E3%82%A4%E3%83%89)の通り。

1. (ESPとルートの)パーティションを切る
2. (ESPとルートの)フォーマットをする
3. ルートパーティションをmountする
4. ルートパーティション上に、マウントポイント/bootを`mkdir`で作る
5. ルートパーティションの/bootに、ESPをmountする
6. `pacstrap`する
7. ルートパーティションに`arch-chroot`する
8. `pacman`でGRUBとefibootmgrをインストールする
9. `grub-install`と`grub-mkconfig`する

これでよさそうだが、インストールガイドのページそのものには、ESPのフォーマットが記載されていないので、[ESPのフォーマット](https://wiki.archlinuxjp.org/index.php/EFI_システムパーティション#.E3.83.91.E3.83.BC.E3.83.86.E3.82.A3.E3.82.B7.E3.83.A7.E3.83.B3.E3.81.AE.E3.83.95.E3.82.A9.E3.83.BC.E3.83.9E.E3.83.83.E3.83.88)を見て、`mkfs.fat -F32 /dev/sdxY`してからmount。

`pacstrap`の前にESPが/bootにmountされているのもポイントで、後から/bootにmountしてしまうと、/bootにあるkernelが見えなくなり、GRUBがkernelを検知できないままgrub.cfgを作ることになり、起動できなくなる。
何でこんなことをしてしまったのかわからないが、わからない時は変なことをするものだ。(言い訳)

# 最後に、ちょっと実験

試しに、ESPを/bootでなく/espにmountして、`grub-install --efi-directory=/esp`したら、ESPには`/efi/EFI/grub/grubx64.efi`のみが生成され、grub.cfgなどは`/boot/grub/`以下に生成された。
しかもext4上の`/boot/grub/grub.cfg`が読まれて起動したので、ESP上のgrubx64.efiは、例えESPにgrub.cfgが無くても探すのかな。
これで、GRUBとESPと/bootの関係が分かった気がした。

# その他
いずれもググればいくらでも出てくるが、どれもひと手間必要で、はまった。

- VMwareで仮想マシンをUEFIにする
    - .vmxに`firmware = "efi"`を追記
- VirtualBoxで仮想マシンをUEFIにして、GRUBから起動する
    - UEFIにするのは、GUI操作で簡単
    - ブートローダーの設定は、何種類か方法があるが、`grubx64.efi`の場所(区切りは`¥`)を書いた`startup.nsh`を、ESP直下に置く
- 素のext4からLVMに引っ越して起動する　←UEFIは関係ないが、ちょーはまった!

# 参考文献
[こちら](http://qiita.com/niwatolli3/items/926563abb65e1a9a8d4b)にほとんど同じ環境でもっと詳しい手順が!