丸山です。 loader.efi の挙動を理解するために行った「大袈裟な」実験とその結果を以下 に書きます。ちょっと長いです。 loader.efi の挙動に興味が無い人は読む必要 はないでしょう。
確実に再現できる実験を行うために、他にマシン(pc06)に次のような環境を作り ました。 % gpart show ada0 => 34 1953525101 ada0 GPT (932G) 34 1600 1 bios-boot (800K) 1634 414 2 freebsd-boot (207K) 2048 204800 3 efi (100M) 206848 12582912 4 freebsd-ufs (6.0G) 12789760 8388608 5 freebsd-zfs (4.0G) 21178368 8388608 6 freebsd-ufs (4.0G) 29566976 8388608 7 freebsd-zfs (4.0G) 37955584 16777216 - free - (8.0G) 54732800 209715200 16 freebsd-zfs (100G) 264448000 209715200 17 freebsd-zfs (100G) 474163200 209715200 18 freebsd-zfs (100G) 683878400 10485760 21 freebsd-ufs (5.0G) 694364160 20971520 22 freebsd-ufs (10G) 715335680 10485760 23 freebsd-ufs (5.0G) 725821440 167772160 - free - (80G) 893593600 1059931528 30 freebsd-ufs (505G) 1953525128 7 - free - (3.5K) ここに ada0p4 〜 ada0p7 は基本的にすべて FreeBSD13.1のインストーラー FreeBSD-13.1-RELEASE-amd64-dvd1.iso の中身のコピーですが、後に述べる修正 をしてあります。 それぞれのパーティションの内容は ada0p4 FreeBSD13.1 インストーラー ada0p5 FreeBSD13.1 インストーラー、プール名 zboot1 ada0p6 FreeBSD13.1 インストーラー(偽ロゴ、後述) ada0p7 FreeBSD13.1 インストーラー、プール名 zboot2(偽ロゴ、後述) ada0p16 古い FreeBSD(zfs) ada0p17 FreeBSD13.1、プール名 fbsd131pc06 ada0p18 中身空 ada0p21 古い FreeBSD(ufs) ada0p22 ada0p4 とほぼ同じ内容 ada0p23 作業領域として使っている ada0p30 データ領域 となっています。 ada0p4 〜 ada0p7 に行った修正は以下です。 修正1. /etc/fstab をそれぞれに合うように修正 修正2. /boot/loader.conf に zfs_load="YES" を追加。 修正3. ada0p6 と ada0p7 の /boot/images/freebsd-logo-rev.png を偽者のロ ゴ画像ファイルに差し替える 修正4. /usr/share/vi/catalog/ や /usr/share/nls/ の sub-directory 等にあ るsymbolic link は iso 形式ではうまく保存されていないので、インス トール済の13.1 からコピー。 修正5. /packages/FreeBSD:13:amd64/All にあるファイルを削除(単にスペース 節約のため) 修正1 は、 ada0p4 〜 ada0p7 がそれぞれ単独で起動できるために重要です。修 正2 は、 loader.efi が zfs 上にあるシステムを boot できるために省けませ ん。FreeBSD-13.1-RELEASE-amd64-dvd1.iso は isoファイルシステムなので、こ れが無くてもisoメディア上の13.1のインストーラーは動きます。 この状態で - /boot/loader.efi を ESP の /EFI/BOOT/BOOTX64.EFI にコピーして - ada0p4 〜 ada0p7 のうち一個だけ残して他は gpart delete -i n ada0 で消す ということをしてマシンを起動すると、それぞれのパーティション上の 13.1 の インストーラーが起動できます。と言っても、インストールすることが目的では ないので、画面上で shell mode を選んで、 df とか kldstat とか sysctl を 使って色々調べるわけです。 起動の途中でローダーの 「Welcome to FreeBSD」画面が現れますが、タイムア ウト前に3のキーを押せば、ローダーの OK プロンプトが現れ、show コマンドで 様子がわかります。なお、修正3 をしてあるので、 ada0p6 と ada0p7 の場合に はこの「Welcome to FreeBSD」画面で偽ロゴが表示されます。 修正4と5は実験の遂行には関係ないでしょう。 なお、gpart delete -i 4 ada0 などでパーティションを削除しても、データそ のものを上書きするわけではないので、 gpart add -t freebsd-ufs -i 4 -b 206848 -s 12582912 ada0 などで簡単に復活できます。 実験1 ada0p5 を delete し、 ada0p4(ufs, 純正ロゴ) ada0p6(ufs, 偽ロゴ) ada0p7(zfs, 偽ロゴ) の3つある状態で loader.efi を起動する。するとWelcome画面には純正ロゴが表示され、 1.0 何もせず、Welcome 画面でタイムアウトさせる ==> ada0p4上のシステムが起動 1.1 OK boot ==> ada0p4上のシステムが起動 1.2 OK set currdev=disk2p6: OK boot ==> ada0p6上のシステムが起動 なお、この pc06 には外付け USBディスクが二つ接続されているので、 ada0 をローダーは disk2 と認識しています。 1.3 OK set currdev=zfs:zboot2/ROOT/default: OK boot ==> ada0p7上のシステムが起動 1.4 OK set currdev=zfs:fbsd131pc06/ROOT/default: OK boot ==> ada0p17上のシステムが起動 OK プロンプトから show コマンドで見ると、 loaddev と currdev の値は disk2p4: となっている。rootdev という変数は見当たらない。 実験2 ada0p4 を delete し、 ada0p5(zfs, 純正ロゴ) ada0p6(ufs, 偽ロゴ) ada0p7(zfs, 偽ロゴ) の3つある状態で loader.efi を起動する。するとWelcome画面には純正ロゴが表示され、 2.0 何もせず、Welcome 画面でタイムアウトさせる ==> ada0p5上のシステムが起動 2.1 OK boot ==> ada0p5上のシステムが起動 2.2 OK set currdev=disk2p6: OK boot ==> ada0p6上のシステムが起動 2.3 OK set currdev=zfs:zboot2/ROOT/default: OK boot ==> ada0p7上のシステムが起動 2.4 OK set currdev=zfs:fbsd131pc06/ROOT/default: OK boot ==> ada0p17上のシステムが起動 OK プロンプトから show コマンドで見ると、 loaddev と currdev の値は zfs:zboot1/ROOT/default: となっている。rootdev という変数は見当たらな い。 ここまで、あまり驚くような結果はないと思います。後の方の実験結果との関連で ここに書いておきますが、以上すべての場合に、起動後に kldstat の出力を見ると、 最初の3行は Id Refs Address Size Name 1 43 0xffffffff80200000 1f30590 kernel 2 1 0xffffffff82131000 5b93a0 zfs.ko となっています。 長すぎるのでこのメールはここまでにして、続きは別のメールに書きます。 -------- 丸山 直昌 まるやま なおまさ メールアドレス: m...@amogha.jp