丸山です。
その後少し試してみて、様子がわかってきたので報告します。
まず混乱を防ぐため、内臓ディスクの NEWPOOLNAME/ROOT/default の中の
/boot/zfs/zpool.cache は消しておきました。/boot/etc/zpool.cache もありま
せん。(初めから無かったような気がするのですが、思い違いか?)
で、今朝(9月1日)以下の実験をしてみたところ、内臓ディスクの NEWPOOLNAME
の zfs にある 13.1が起動できました。
(9/1実験)インストール済みディスクを外付けとして接続してパソコンを起動し、
「Welcome to FreeBSD」が表示されたところ(画面右には例の角が二つ出た赤い
頭のFreeBSDロゴが表示された状態)でスペースキーでも押してboot の進行を止
めて
3. Escape to loader prompt
を選ぶと、 loader プロンプトの OK が出ます。この状態から
OK set currdev=zfs:NEWPOOLNAME/ROOT/default:
OK boot
これで起動できます。
ここでもし set currdev をやらずに単に boot とすれば、勿論外付けになって
いるインストール済みディスクの方の 13.1が起動します。以下簡単のため、こ
の OKプロンプトの状況をloader.efi の「正常状態」と呼ぶことにします。
一方、先日31日の当初ポストに書いた状況で現れた OK プロンプトの状況を「異
常状態」ということにします。
同じように 13.1 の /boot/loader.efi を efi/boot/bootx64.efi として起動し
ているのに、このように正常状態と異常状態が現れるのは何故なのでしょうか。
一応異常状態が発生する状況を再掲しておきます。
>3. 内臓ディスク(ada0, gptスキーム)の空きパーティション(私の場合
> ada0p13)を type freebsd-zfs にして、そこにda0p4のzrootをコピーする。
>
> zpool create NEWPOOLNAME ada0p13
> zfs send -R zroot@SNAPSHOT | zfs recv -F NEWPOOLNAME
>
> 4. (ada0からのbootの準備)
> zpool set bootfs=NEWPOOLNAME/ROOT/default NEWPOOLNAME
> (安全のため) ada0 の efi パーティション(私の場合 ada0p4)の
> EFI/Boot/bootx64.efi を退避
> /boot/loader.efi を ada0 の efi パーティションの
> EFI/Boot/bootx64.efi にコピー
> zpool export NEWPOOLNAME
> halt -p
>
> 以上の準備の元、すべての外付けデバイスを外して、内臓ディスクから起動してみます。
>
> Consoles: EFI console
> Reading loader vars from /efi/freebsd/loadef.env
> Setting currdev disk0p4:
> FreeBSD/amd64 EFI loader, Revision 1.1
>
> Command line arguments:
> Image base: 0xd0998000
> EFI version: 2.31
>
> 等と表示されます。続いてさらに画面半分ほどのメッセージが表示された後、
>
> ERROR: cannot open /boot/lua/loader.lua: no such file or directory.
>
> Type '?' for a list of commands,'help' for more detailed help.
> OK
この異常状態に至る過程で「Welcome to FreeBSD」画面は現れません。どのキー
に触れることも無しに、OK プロンプト状態になります。それぞれの状態でshow
コマンドを使って変数の状態を見てみます。画面に出ることをコピーペーストで
きないので、関係ありそうな部分を手動入力してお伝えするしかありまんが、以
下のようになっています。
(正常状態での show コマンドの出力の一部)
bootenv_autolist=YES
bootenvs[0]=zfs:zroot/ROOT/default
bootenvs_count=1
currdev=zfs:zroot/ROOT/default:
loaddev=zfs:zroot/ROOT/default:
zfs_be_active=zfs:zroot/ROOT/default
zfs_be_currpage=1
zfs_be_root=zroot/ROOT
(異常状態での show コマンドの出力の一部)
currdev=disk0p8:
loaddev=disk0p8:
ここまで書いて私は重要な事を皆さんにお伝えしていなかったことに気が付きま
した。
# gpart show ada0
=> 34 1000215149 ada0 GPT (477G)
34 1600 1 bios-boot (800K)
1634 414 2 freebsd-boot (207K)
2048 921600 3 !de94bba4-06d1-4d40-a16a-bfd50179d6ac (450M)
923648 204800 4 efi (100M)
1128448 32768 5 ms-reserved (16M)
1161216 195081904 6 ms-basic-data (93G)
196243120 336 - free - (168K)
196243456 1685504 7 !de94bba4-06d1-4d40-a16a-bfd50179d6ac (823M)
197928960 4096 - free - (2.0M)
197933056 10485760 8 freebsd-ufs (5.0G)
208418816 10485760 9 freebsd-ufs (5.0G)
218904576 16777216 10 freebsd-swap (8.0G)
235681792 83886080 11 freebsd-ufs (40G)
319567872 83886080 12 freebsd-zfs (40G)
403453952 83886080 13 freebsd-zfs (40G)
487340032 83886080 14 freebsd-ufs (40G)
571226112 83886080 15 freebsd-ufs (40G)
655112192 345102991 16 ms-basic-data (165G)
であって、 ada0p8 には UEFIブート可能な FreeBSD10.3を入れてあったのでし
た。で実際「異常状態」から
OK boot
とやると、その10.3が起動できました。また「正常状態」から
OK set currdev=disk1p8:
OK boot
とやるとやはり ada0p8の10.3が起動できました。(正常状態は外付けUSBディス
クから起動しているので、外付け(da0)が disk0, 内臓(ada0)が disk1 となって
いる。)
以上の結果から、私は以下のように推理します。
いずれの状態でも、 OK プロンプトが出る前(正常状態の場合「Welcome to
FreeBSD」が出る前)までに「どこか」から「何か」を読み込んでいる。「どこか」
は正常状態の場合は zfs:zroot/ROOT/default: 、異常状態の場合にはada0p8 の
ufs で、このために loader.efi の挙動に違いが生じる。内臓ディスクから起動
した場合でもloader.efi が 「何か」を ada0p8 ではなく、 ada0p13 にある
zfs:NEWPOOLNAME/ROOT/default の方から読み込んでくれれば問題解決できるだ
ろう。
解決法ですが、「正常状態」の showコマンドで表示される
bootenvs[0]=zfs:zroot/ROOT/default
bootenvs_count=1
が気になります。ひょっとして /efi/freebsd/loader.env に何か書いておくと
bootenvs[0]=zfs:NEWPOOLNAME/ROOT/default
に設定できて「何か」をこっちから読んでくれるのでないかな?と期待したくな
ります。
loader.efi も loader.conf もドキュメント化されていないので、最早コードを
読んで解読するしかなさそうですが、私の手には余ります。
何かわかったらお知らせください。
--------
丸山 直昌 まるやま なおまさ
メールアドレス: [email protected]