河豚板のUEFI/GPT対応†
Twitterでのこのtweetがきっかけ。
このやりとりが発端となり、河豚板のUEFI対応を開始する。
UEFIとGPT†
- UEFI (Unified Extensible Firmware Interface)
- OSとファームウェアとの間のソフトウェアインタフェースを定義する仕様(Wikipedia)
従来のBIOS (Legacy BIOS)による起動方法からの置換えを意図している。
・UEFI用のパーティション(ファイルシステムとしてはFAT)を持つ。
・そのパーティション内に起動用の実行バイナリが格納されている。このバイナリファイルは*.EFIの拡張子を持ち、UEFIアプリケーションと呼ばれる。
- GPT (GUID (Globally Unique Identifier) Partition Table)
- ストレージデバイス上のパーティションテーブルの配置に関する標準規格(Wikipedia)
Legacy BIOSで用いられてきたMBR (Master Boot Record)に替わるものとしてUEFIの一部として定義されている。
・MBRが扱えるのは最大2TBのディスクを4区画まで
・GPTでは最大8ZBを128区画までパーティショニング可能
OpenBSDの場合に現状で考えられる起動方法とパーティショニングのパターンを以下に示す。
Legacy BIOS / MBR (参考)†
#ref(): File not found: "MBR2.png" at page "EBUG勉強会/20190223_UEFI_GPT"
UEFI登場以前から用いられてきた方法
- ハードウェア上のファームウェアがHDDのセクタ0にあるMBRブートコードを実行する。
- MBRブートコードは、ブートフラグがONになっているパーティションの先頭セクタにあるPBR (Partition Boot Record)に実行を移す。
- OpenBSDでは、PBRは/usr/mdec/biosbootが用いられる。
- PBRはOpenBSDのルートファイルシステム上にある/bootを実行する。
- この/bootが「boot>」プロンプトを表示し、カーネル起動に関するユーザからの指定を受け付ける。
- bootは指定にしたがって、該当するカーネルを起動する。
- なお、OpenBSD用と設定された区画(右図の例ではentry 3)は、同時にdisklabelユティリティによる管理範囲(OpenBSD Area)として設定される。
OpenBSD Areaの中にdisklabelによるBSDパーティションが作成され、ファイルシステムやスワップ領域として使われる(参考:他のBSDユーザのためのOpenBSD管理入門)。
#img(): File not found:
UEFI / GPT†
#ref(): File not found: "GPT2.png" at page "EBUG勉強会/20190223_UEFI_GPT"
起動にUEFI、ディスクパーテショニングにGPTを用いるパターン
- ハードウェア上のファームウェアがGPT内でGUID=xxxxxxxxx-xxxxxxxx-xxxxxxxxx-xxxxxxxxxxxxxxx (EFI Sys)となっているパーティションを探し、この中に \efi\BOOT\BOOT*.EFIという実行ファイル(EFIアプリケーション)があれば実行する。
このファイル名は、
- i386ではBOOTIA32.EFI
- amd64はBOOTX64.EFI
- arm64はBOOTAA64.EFI
となっている。
- OpenBSDのEFIアプリケーションは、「boot>」プロンプトを表示し、カーネル起動に関するユーザからの指定を受け付ける。
これは、MBR起動の場合の/bootに相当する。
- EFIアプリケーションは指定にしたがって、該当するカーネルを起動する。
- なお、GPTの場合にも先頭セクタの部分に、従来のMBRとの互換性を考慮してprotective MBR (保護MBR)というものが書き込まれている。これはfdiskなどのMBRを扱うユティリティが誤ってMBRを書き換えないようにするためのものである。
- OpenBSD Area内の管理については、MBRの場合と同じ。
#img(): File not found:
UEFI / MBR†
UEFIとしてEFIアプリケーションがロードされるが、パーテショニングとしてMBRが使われるパターン。GPTは存在しない。
amd64のインストールメディアやarm64で使われている。
amd64のインストールメディアとarm64とでは細かい箇所で異なっている部分がある(右図はarm64)。
- arm64ではUEFI用のパーティションIDは0C (FAT32L)、amd64インストーラではEF (EFI Sys)。
- arm64ではUEFI用のパーティション内にはU-BOOTも書き込まれている。
- amd64インストーラではMBR boot code、PBR、/bootもセットアップされる。
#img(): File not found:
Hybrid MBR†
#ref(): File not found: "Hyb2.png" at page "EBUG勉強会/20190223_UEFI_GPT"
MBRとGPTの両方に同じパーテショニング情報を書込み、ブートローダもLegacy BIOS, UEFI共にセットアップしたもの。
- MBRとGPTとを同時に変更するツールが現状ではないため、パーテショニングを後で変更することが困難。
#img(): File not found:
2015年にIIJの安岡さんにより実装された。
fdisk†
installboot†
usbfadm†