・Plamo LinuxのUEFI対応について(メモ)
伝統的な(DOS時代から使っていた)MBRは、HDDの最初のセクタ(512B)にブートローダとパーティションテーブルを収める必要があったためさまざまな制限があった。
liloやgrubがMBRにはジャンプテーブルしか置かなかったり、拡張パーティションを作ったり等々
HDDの容量増大に合わせて、パーティションの管理をCHS方式からLBA方式に変えたりして頑張ってきたけど、LBA方式でも32ビット(4GB)x512B=2TBが上限で、最近の2TB超えのHDDには対応できない。
そこで生まれたのがGPT(GUID Partition Table)と呼ばれるパーティション管理方式と、それを含んだEFI(Extensible Firmware Interface)という規格。
EFIは元々、IntelとHPが開発した64ビットなItanium用に考案された規格らしいけど、後にUnified EFI Forumに移管され、"UEFI"という名称で伝統的なBIOS/MBRモデルに変わる仕様としてPC環境でも広く使われていくことになった。
基本的にUEFIはマザーボードに乗ったfirmwareなんで、OSの側から操作することはあまりないのだけれど、どの順でブートローダを呼び出すか、といった情報はメモリに記録されていて、そのあたりはOSからも設定できるらしい。
UEFIは任意のHDDを起動対象にできるけど、対象となるHDDには FAT32形式でフォーマットされた、"EFI System"というタイプのパーティションが必要になる。 UEFIは、起動対象のHDDのEFI Systemなパーティションを調べ、そこにEFI対応のブートローダがあればそれを起動する。
どんなブートローダが起動対象になるかはUEFIの実装依存(マザーボード依存)みたいだけど、最悪でも\EFI\BOOT\bootx64.efi はブートローダとして認識する(例えばVirtualBox)ことになっているので、EFI対応のgrubをインストールして、\EFI\grub\grubx64.efi なんてのを作っても、そのファイルを\EFI\BOOT\bootx64.efi にコピーしてやるのが吉。
EFI Systemなパーティションは512MBが推奨されているそうだけど、通常はそんなにたくさんいらない。でも、あまり小さくしすぎると mkfs.vfat -F32 /dev/XXXX したときに、 WARNING: Not enough clusters for a 32 bit FAT! などと言われるハメになる。このエラーになったパーティションはUEFIシステムから正しいEFI Systemパーティションと認識されず、起動対象から外される。
512MBもEFI Systemに割りあてたくない、という場合、mkfs.vfatではなく、 mkfs.fat -s2 -F32 /dev/XXXX か mkfs.fat -s1 -F32 /dev/XXXX のように、 FAT32なDOS FSとして作ってやるのが吉らしい(-s[12]は1クラスタあたりのセクタ数)
マザーボード上のUEFIシステムは、MBRは一切見ずに、指定したHDDにEFI Systemなパーティションがあるか、そのパーティション上に\EFI\BOOT\bootx64.efi等のブートローダがあるかのみを調べて、存在すればそれらに処理を委ねる。EFI Systemなパーティション上には複数のブートローダを置くことも可能で、どのブートローダを使うかはUEFIのメニューから指定できる(cont.)