Re: rEFInd - a UEFI boot selector

From: Tomoaki AOKI <junchoon_at_dec.sakura.ne.jp>
Date: Sun, 02 Oct 2022 08:31:45 UTC
On Sat, 24 Sep 2022 18:23:11 +0900
masa@amogha.jp (丸山直昌) wrote:

> 年金生活者 丸山です。
> 
> Subject を変えて、私が抱えている問題を説明し、お知恵をお借りしたいと思い
> ます。絶滅危惧種の legacy BIOSのみのマシンのことは無視して、話を UEFI マ
> シンに限定したいと思います。
> 
> 困っていることを手短に書くと
> 
>         https://efi.akeo.ie/downloads/efifs-1.9/x64/zfs_x64.efi
> 
> を rEFInd のドライバとして使っても動かない
> 
> という事です。ufs2_x64.efi の方は期待通りに動くのですが、、、。
> 
> 以下ちょっと長くなりますが、誰にでもわかるように詳しく説明したいと思いま
> す。
> 
> 欲しいのは gpt スキーム上にある複数の FreeBSD を選択的に起動する仕組みで
> す。いわゆる multi-bootの話の一環です。世の中には一つのディスク上に
> Windows, Linux, Ubunstu, Debian など、何種類ものOSを載せて、「どれでも起
> 動できる」と威張っている人がいますが、ここで話題にするのはそれとはちょっ
> と違っています。「複数の FreeBSD を選択的に起動する」というのは、複数の
> OSを、各OS一個ずつのパーティションがある中から選択的に起動することに比べ
> て意外なほど面倒なのです。
> 
> https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=207940
> https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=229770
> 
> などを見ると、野中さん、青木さん、Masachika ISHIZUKAさん等が長い年月に渡っ
> てこの問題に関心をお持ちのことがわかります。ですが、これら諸先輩方のよう
> にboot1.efi や loader.efi にパッチを当てるやり方は、私の手に余ります。と
> ても真似はできません。
> 
> 私は長い間この問題への対処として仕方なく gnu grub2 を使っていましたが、
> 本当のところこの方法は気に入りません。その理由は別途説明したいと思います
> が、最近試しているrEFIndを使う方法について、わかったことを以下に少し説明
> したいと思います。rEFIndは FreeBSD外のソフトウェアなので恐縮ですが、、、。
> 
> ESP の/EFI/BOOT/REFIND.CONF に
> 
> menuentry "loader.efi of FreeBSD13.1" {
>     loader /EFI/Boot/loader.efi
>     icon /EFI/Boot/ICONS/os_freebsd.png
>   options "rootdev=zfs:fbsd131/ROOT/default:"
> }
> 
> のように options を指定するやり方は、先日のメールに書いた通り、何故か成
> 功しませんでした。
> 
> https://www.ish.org/blog/?p=2271 には
> 
>     P.P.S. refind 0.12.0が不調な原因が判りました。optionsでloader.efiに
>     parameterを渡す際に、最初のパラメータが正常に渡らないようです。optionsの
>     2番目以降のパラメータは正常に渡りますので、optionsの最初にdummyのパラメー
>     タを追加すれば一応0.12.0も動きます。
> 
> という話が書いてありますが、
> 
>   options "rootdev=zfs:fbsd131/ROOT/default: rootdev=zfs:fbsd131/ROOT/default:"
> 
> と書いてもダメでした。
> 
> 次に試したのは
> 
> https://www.starlink.jp/freebsd/boot-from-another-fbsd-partition/
> 
> にある volume を指定する方法です。私がやった実験の状況は以下の通りです。
> 
> % 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     6291456     4  freebsd-ufs  (3.0G)
>      6498304     6291456     5  freebsd-zfs  (3.0G)
>     12789760     6291456     6  freebsd-ufs  (3.0G)
>     (以下略)
> 
> となっている状況で、 REFIND.CONF には
> 
> menuentry "ufs2 driver test ada0p6" {
>     volume 521461b8-3b05-11ed-9405-3417eb9e0b90
>     loader /boot/loader.efi
>     icon /boot/images/freebsd-logo-rev.png
> }
> 
> というエントリを作っておきます。ここに volume の行にある長い数字の羅列は
> ada0p6 の rawuuid で、gpart list で調べることができます。
> 
> 14. Name: ada0p6
>    Mediasize: 3221225472 (3.0G)
>    Sectorsize: 512
>    Stripesize: 4096
>    Stripeoffset: 0
>    Mode: r1w1e1
>    efimedia: HD(6,GPT,521461b8-3b05-11ed-9405-3417eb9e0b90,0xc32800,0x600000)
>    rawuuid: 521461b8-3b05-11ed-9405-3417eb9e0b90
>    rawtype: 516e7cb6-6ecf-11d6-8ff8-00022d09712b
>    label: (null)
>    length: 3221225472
>    offset: 6548357120
>    type: freebsd-ufs
>    index: 6
>    end: 19081215
>    start: 12789760
> 
> 更に、 ESP に /EFI/BOOT/drivers というディレクトリを作って、
> 
> https://efi.akeo.ie/downloads/efifs-1.9/x64/
> 
> から取ってきた ufs2_x64.efi を入れておきます。これで rEFInd を起動して選
> 択メニューから "ufs2 driver test ada0p6" を選びますと、ちゃんと「Welcome
> to FreeBSD」が表示されます。そこで メニューエントリ3を選んで
> 
> OK show
> 
> とやると、 currdev, loaddev ともに値が disk2p6: になっています(外付け
> USB disk を2台接続しているために disk2がada0)。rootdev はありません。こ
> の結果に私は小躍りしました。rEFInd は ada0p6 の /boot/loader.efi を起動
> しているわけで、OK bootとやるか、或いは「Welcome to FreeBSD」画面をその
> ままタイムアウトさせると ada0p6 からカーネルをロードしてスタートさせます。
> ada0p4にある /boot/loadef.efi が ada0p6にあるカーネルをロードするわけで
> ないのです。これにより、バージョンが異なる FreeBSD をいくつか持っている
> gptスキームのディスクで、loader.efi の挙動も含めて各バージョンの動きを再
> 現できることになります。
> 
> しかし喜んだのもつかの間。 zfs のパーティションで同じことをしようと同じ
> サイトから zfs_x64.efi を持ってきて /EFI/BOOT/drivers に入れてみましたが、
> 成功しませんでした。
> 
> 困った。
> 
> --------
> 丸山 直昌 まるやま なおまさ
> メールアドレス: masa@amogha.jp

青木@名古屋です。

rEFIndは全く経験が無く、現在新たに調べて試してみる余力がないの
ですが、ご入用ならBug 207940のパッチ適用済のboot1.efiをお送り
しますよ。

最新の野中さんのパッチを適用したものは、`gpart list`で表示される
rawuuidを見て選択する形、
私のパッチ(アップロードしていませんが、野中さんのものに倣って
proto.cだけにパッチを当てれば良いように微修正したもの)は
インターフェース毎にUEFIファームウェアが何番のディスクと
認識しているかの番号とその中のパーティション番号との組合せから
選択する形です。

いずれも0がデフォルトで起動されるパーティションを受け入れる
場合で、それ以外は1~9とA~Zで計35個以内の候補から選択、
一旦停止してよく見たければスペースを押せばタイマーが停止
します。 何もしなければ10秒後に0を押したのと同様に起動します。

両方とも、stable/13でビルドし、loader.envが存在しない状態で
stable/13もmainも起動できます。

但し、
 ・最後にzpool upgradeを行ったのは、stable/13が作成された
  直後(mainとstable/13のZFS関係のコードが100%一致している
  状況)にmainとstable/13(stable/12から移行)双方のpoolを
  upgrade。

 ・テストしたのは、stable/13のドライブはZFSのみ、mainのドライブは
  UFSの後ろにZFSがあり、UFSの方はZFSのROOTFSをrootとして
  マウントしようとするようにしてあるものの、あえてエラーに
  なるよう古いままにしてある状態の環境です。
 ・NVMeのドライブは、FreeBSDのsrcに取り込まれているUEFI関係の
  ヘッダが古いためNVMe(NVM Express namespace messaging
  device path node)の定義が存在せず、私のものでは表示上
  diskにフォールバックし、番号も通常とかけ離れた番号が出る。 
 ・野中さんの方だと、どのrawuuidがどのドライブか覚えておく
  必要がある。
ので、それでもよろしければ。


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