丸山です。

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

Reply via email to