====== loader.efiで任意のパーティションのFreeBSDをブートする ====== FreeBSD 12.0-RELEASEあたりから、UEFIのブートローダとして従来のboot1.efiに代わりloader.efiが使われるようになった。 どちらもZFSまたはUFSからシステムを起動する役割を持つが、boot1.efiは複数のストレージからファイルシステムを探すのに対し、loader.efiは自身が読み込まれたストレージのみが対象となる。簡単に言えば、loader.efiだと別HDDのFreeBSDシステムを起動できないというわけ。まぁ、ブートローダのプロンプトで手動で起動デバイスを指定してやれば出来るんだけど、毎度行うのは現実的ではないよね。 どうにか自動化できないかと各種文献あさりとGooglingをしてみるも、それらしい情報はなく…。仕方なく[[https://github.com/freebsd/freebsd-src/tree/master/stand/efi/loader|ソースコード]]を眺めてみると、loader.envで''rootdev''変数を指定してやれば行けそうと分かった。 loader.efiにせよboot1.efiにせよ、最終的に起動対象は''currdev''変数の値が使われるが、loader.efiの場合[[https://github.com/freebsd/freebsd-src/blob/de1aa3dab23c06fec962a14da3e7b4755c5880cf/stand/efi/loader/main.c#L509|rootdev変数の値が問答無用でcurrdevとして採用]]される。 でもって、''rootdev''の設定はEFIシステムパーティションの''/efi/freebsd/loader.env''ファイルで行う。これは[[https://github.com/freebsd/freebsd-src/commit/8ac2d6f5d65afd9ae3d25141a39d63cdc0b39898|比較的最近作られた機能]]で、[[https://github.com/freebsd/freebsd-src/commit/54f346e543c2b223125c28773cd2059aece9559b|12.2-RELEASEから使える]]ようだ。 同ファイルに以下の一行を追加。ルートディレクトリとなるファイルシステムを指定する。UFSならdisk0p1という具合。末尾のコロンは誤字じゃないのでござる。 rootdev=zfs:zroot/ROOT/default: 2021-01-09現在、これらはドキュメント化されてないので、将来変わるかもしれないし動作の保証も致しかねる。 ま、こんな面倒なことしなくても、従来どおりboot1.efi使えばいいんだけどね! ===== 参考サイト ===== * [[https://www.ish.org/blog/?p=963|aio boot(その4:rEFIndによるFreeBSDのマルチブートの続き) – Welcome to ish.org]] * [[https://www.ish.org/blog/?p=949|その2]], [[https://www.ish.org/blog/?p=958|その3]], [[https://www.ish.org/blog/?p=968|その5]], [[https://www.ish.org/blog/?p=984|その6]], [[https://www.ish.org/blog/?p=993|その7]], [[https://www.ish.org/blog/?p=997|その8]], [[https://www.ish.org/blog/?p=1010|その9]],