====== FreeBSDのboot1.efiがもう使われていなかった件 ====== UEFI環境でのFreeBSD (x64)のブートは、下表の手順で行われるとされている。manにも書かれている由緒正しい手順だ。 - UEFI:/EFI/BOOT/BOOTX64.EFI * UEFIシステム起動時に実行されるブートローダ - ファーストステージ: boot1.efi ([[https://www.freebsd.org/cgi/man.cgi?query=uefi&apropos=0&sektion=8&manpath=FreeBSD+12.2-RELEASE&arch=default&format=html|man]]) * freebsd-zfs, freebsd-ufsパーティションを探し、次のステージを起動するブートローダ。パーティション探索は、自身が読み込まれたストレージ→UEFIのブートオーダーに沿ったストレージの順に行われる。 - ファイナルステージ: loader.efi ([[https://www.freebsd.org/cgi/man.cgi?query=loader&sektion=8&apropos=0&manpath=FreeBSD+12.2-RELEASE|man]]) * 環境変数currdev, loaddevで指定されたストレージからカーネルを起動する。 - カーネル ファームウェア(UEFI)がEFIシステムパーティションのBOOTX64.EFIを起動し、それがboot1.efiを起動し、さらにloader.efiに処理が移り、最終的にカーネルが立ち上がる流れとなっている。スタンドアローンなFreeBSD環境では、boot1.efiがBOOTX64.EFIとしてコピーされるので、実際はBOOTX64.EFI→loader.efi→カーネルの順で起動、、、ということになっている。 言葉を濁してるのは、まぁお察しのとおり、manの説明と現状の実装が異なってるから。どうやらFreeBSD 12.0-RELEASEあたりで、BOOTX64.EFIとしてloader.efiが使われるようになったらしい([[https://github.com/freebsd/freebsd-src/commit/d050cd6b99c0a2056d4d07468b481206a31a5407|当該コミット]])。この辺は現在絶賛過渡期のようで、ESP生成まわりを[[https://github.com/freebsd/freebsd-src/commit/db8b56134506840832bec2d1ce07b9e00d4d6d71|大きく作り変えたパッチ]]も存在している。 試しにFreeBSD 12.2-RELEASEのインストーラが作ったESPをマウントし、BOOTX64.EFIとloader.efiのハッシュを比較すると見事に同じということが分かる。 {{ :blog:2021:sha1_loader_efi_and_bootx64_efi.png |}} というわけで、現実はファーストステージをすっ飛ばし、ファイナルステージブートローダがいきなり動き出す。 これでも大抵の環境では問題ない一方、現状、loader.efiは別ディスクのFreeBSDパーティションの探索を行わないようなので、そのようなストレージ構成だとFreeBSDのブートができない。こいつぁ困ったぜ。 回避策としては、手動でBOOTX64.EFIをboot1.efiにするか、あるいはloader.efiのままプロンプトでcurrdevを手動で指定し、zfs.koをカーネルを手動で読み込んでやればいい。前者の方が明らかに簡単ですな。 loader.efiのソースを見てたら、まだmanに載ってない方法が使えそうな気がするので、[[blog:2021:2021-01-09|後日試す]]予定。 ===== 参考サイト ===== * [[https://qiita.com/mzaki/items/76acac14c16ac6789e68|FreeBSDのブートプロセス - Qiita]] * [[https://www.babagnu.sh/freebsd-boot-process/|The FreeBSD Boot Process | babaGNU.sh]] * [[https://www.ish.org/blog/?p=958|aio boot(その3:rEFIndによるFreeBSDのマルチブート) – Welcome to ish.org]] * [[https://github.com/freebsd/freebsd-src/commit/d050cd6b99c0a2056d4d07468b481206a31a5407|Switch to creating UEFI ESPs using loader.efi instead of boot1.efi. · freebsd/freebsd-src@d050cd6]] * [[https://github.com/freebsd/freebsd-src/commit/db8b56134506840832bec2d1ce07b9e00d4d6d71|Rework UEFI ESP generation · freebsd/freebsd-src@db8b561]]