丸山です。

その後少し試してみて、様子がわかってきたので報告します。

まず混乱を防ぐため、内臓ディスクの 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]

Reply via email to