Re: loader.efi of 13.1

From: Tomoaki AOKI <junchoon_at_dec.sakura.ne.jp>
Date: Thu, 01 Sep 2022 23:50:39 UTC
青木@名古屋です。

ドキュメント化されていないのですが、loader.envで対処できそうな
気配です。 下記の記事を見つけました。

 https://nofu.jp/wiki/blog/2021/2021-01-09

上記が現状も正確なら、loader promptでの作業からすると、
ESPのefi/boot/freebsd/loader.env に

 rootdev=zfs:NEWPOOLNAME/ROOT/default:

を入力しておけばいけそうです。
もしかすると、efi/boot/freebsd/loader.efiをefibootmgrで
登録してデフォルトで起動するようにしているのではなく
loader.efiをefi/boot/bootx64.efiにコピーしている場合、
efi/boot/loader.efiでないと駄目な可能性もあります。

 ※loader.envという設定ファイルがあり得ることは
  boot1.efiのデバッグに協力していた際に気づいては
  いましたが、loader.confとの棲み分けや設定できる
  内容までは把握していませんでした。

もしかしてですが、既にこのファイルを作ってあり(デフォルト
では存在しません)、rootdevにada0p8のUFSが指定してあると
いうことはありませんか? もしそうであれば、loader.efiの
lua対応(従来のforthと排他)は12系からだったと思いますので、
この10.3のUFSを見に行ってエラーになっていた可能性が高いです。

 ※loader.efiのサーチ順が標準のboot1.efiと同じなら、UFSの
  10.3が優先されることは【デフォルトでは】あり得ません。
  悪さするとしたらada0p12のpoolです。 が、既にloader.envが
  あってada0p8のUFSを使うように設定されていればその限りでは
  なくなります。

On Fri, 02 Sep 2022 01:05:51 +0900
masa@amogha.jp (丸山直昌) wrote:

> 丸山です。
> 
> その後少し試してみて、様子がわかってきたので報告します。
> 
> まず混乱を防ぐため、内臓ディスクの 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 もドキュメント化されていないので、最早コードを
> 読んで解読するしかなさそうですが、私の手には余ります。
> 
> 何かわかったらお知らせください。
> 
> --------
> 丸山 直昌 まるやま なおまさ
> メールアドレス: masa@amogha.jp
> 


-- 
青木 知明  [Tomoaki AOKI]    <junchoon@dec.sakura.ne.jp>