Re: Review D58990: freebsd-update: automatically update EFI and BIOS bootloaders on install

From: Ronald Pagani Jr (ronald.pagani.jr) <ronald.pagani.jr_at_dev.us.com>
Date: Thu, 20 Aug 2026 16:08:18 UTC
On Thu, Aug 20, 2026 at 8:51 AM Mark Millard <marklmi@yahoo.com> wrote:

> On 8/20/26 01:08, Ronald Pagani Jr (ronald.pagani.jr) wrote:
> >
> >
> > On Thu, Aug 20, 2026 at 12:37 AM Stefan Esser <se@freebsd.org
> > <mailto:se@freebsd.org>> wrote:
> >
> >     Am 19.08.26 um 18:30 schrieb Ronald Pagani Jr (ronald.pagani.jr):
> >     > I've submitted a patch to automatically update the EFI bootloader
> >     on the ESP
> >     > during freebsd-update install:
> >     >
> >     > https://reviews.freebsd.org/D58990 <https://reviews.freebsd.org/
> >     D58990> <https://reviews.freebsd.org/D58990 <https://
> >     reviews.freebsd.org/D58990>>
> >     >
> >     > The problem: freebsd-update updates /boot/loader.efi on the root
> >     filesystem,
> >     > but the UEFI firmware boots from loader.efi on the EFI System
> >     Partition — a
> >     > separate FAT32 partition that freebsd-update never touches. After
> >     a major
> >     > version upgrade the ESP loader can be left several versions stale.
> >     Since 14.1
> >     > removed the lua_path==nil compatibility shim from core.lua, this
> >     mismatch
> >     > produces a hard boot failure. If the user also ran zpool upgrade,
> >     the system is
> >     > completely unbootable without external media.
> >     >
> >     > The patch hooks efi_bootloader_update.sh into install_run() in
> >     freebsd-
> >     > update.sh. It auto-detects the ESP via gpart, fingerprints
> /EFI/BOOT/
> >     > BOOTx64.efi before touching it (multi-OS safe), creates /EFI/
> >     FreeBSD/loader.efi
> >     > if absent, updates NVRAM, and handles BIOS GPT bootcode as well.
> >     Opt-out via
> >     > UpdateBootloader=no in freebsd-update.conf.
> >     >
> >     > Tested on FreeBSD 14.0-RELEASE-p11 amd64 (UEFI, ZFS, NVMe). 197
> unit/
> >     > integration/error tests available at:
> >     >
> >     > https://github.com/RZA-SF/freebsd-patch-for-bug279829 <https://
> >     github.com/RZA-SF/freebsd-patch-for-bug279829> <https://github.com/
> >     RZA- <https://github.com/RZA->
> >     > SF/freebsd-patch-for-bug279829>
> >
> >     I'm using a much simpler version that just covers my setup, and would
> >     like to replace it by a more general version.
> >
> >     This fails for me in lines 231 to 236 since device names are
> expected,
> >     but zpool status returns a diskid based path:
> >
> >     $ zpool status zroot
> >        pool: zroot
> >       state: ONLINE
> >     config:
> >
> >             NAME                          STATE     READ WRITE CKSUM
> >             zroot                         ONLINE       0     0     0
> >               diskid/DISK-8ESKF03YZ0EAp2  ONLINE       0     0     0
> >
> >     errors: No known data errors
> >
> >     $ sh efi_bootloader_update.sh --dry-run
> >     freebsd-update: [bootloader] INFO:  Boot method detected: UEFI
> >     freebsd-update: [bootloader] WARN:  No boot disks found
> >     freebsd-update: [bootloader] WARN:  Boot disk discovery failed
> >     freebsd-update: [bootloader] WARN:  If using hardware RAID or an
> exotic
> >     topology, update the bootloader manually
> >
> >     My version uses "gpart show -p" to list boot partitions and to fetch
> >     the corresponding device names:
> >
> >     $ gpart show -p | grep -w efi
> >              2048      522240  diskid/DISK-8ESKF03YZ0EAp1  efi  (255M)
> >              2048      522240  diskid/DISK-81S0A0K7FJDHp1  efi  (255M)
> >              2048      522240  diskid/DISK-81S0A0L1FJDHp1  efi  (255M)
> >
> >     > This is complementary to Warner Losh's D45890 (loader version-
> >     check warnings).
> >     > Feedback welcome.
> >     Regards
> >     STefan
> >
> >
> >
> > I've just pushed a kern.disks implementation following recent review
> > comments, and I'm wondering if that works for you?
> >
> > https://github.com/RZA-SF/freebsd-patch-for-bug279829/blob/revision-2/
> > src/efi_bootloader_update.sh <https://github.com/RZA-SF/freebsd-patch-
> > for-bug279829/blob/revision-2/src/efi_bootloader_update.sh>
> >
> >
> > Best,
> > Ron
> >
>
> On an amd64 system it appears it would mount and update every ESP, not
> just the booted one. Even the Windows 11 Pro one:
>
> # gpart show -p nda0
> =>        34  3907029101    nda0  GPT  (1.8T)
>           34        2014          - free -  (1007K)
>         2048      204800  nda0p1  efi  (100M)
>       206848       32768  nda0p2  ms-reserved  (16M)
>       239616  3904946176  nda0p3  ms-basic-data  (1.8T)
>   3905185792     1843200  nda0p4  ms-recovery  (900M)
>   3907028992         143          - free -  (72K)
>
> is listed by the --dry-run use.
>
> This is not appropriate for this system. It has various boot media for
> booting various OS's, mostly various  FreeBSD versions, some zfs, some
> ufs, some rather old. (I select which media/ESP at to boot in the UEFI UI.)
>
> # sh efi_bootloader_update.sh --dry-run 2>&1 | grep -e Would -e Adding
> freebsd-update: [bootloader] INFO:  [DRY RUN] Would mount /dev/da1p1 at
> /tmp/tmp.upwzASjlJK
> freebsd-update: [bootloader] INFO:  [DRY RUN] Would update:
> /tmp/tmp.upwzASjlJK/EFI/FreeBSD/loader.efi
> freebsd-update: [bootloader] INFO:  [DRY RUN] Would update:
> /tmp/tmp.upwzASjlJK/EFI/BOOT/BOOTx64.efi
> freebsd-update: [bootloader] INFO:  Adding NVRAM boot entry: FreeBSD →
> \EFI\FreeBSD\loader.efi
> freebsd-update: [bootloader] INFO:  [DRY RUN] Would mount /dev/da0p2 at
> /tmp/tmp.LwKBxYDbgh
> freebsd-update: [bootloader] INFO:  [DRY RUN] Would update:
> /tmp/tmp.LwKBxYDbgh/EFI/FreeBSD/loader.efi
> freebsd-update: [bootloader] INFO:  [DRY RUN] Would update:
> /tmp/tmp.LwKBxYDbgh/EFI/BOOT/BOOTx64.efi
> freebsd-update: [bootloader] INFO:  Adding NVRAM boot entry: FreeBSD →
> \EFI\FreeBSD\loader.efi
> freebsd-update: [bootloader] INFO:  [DRY RUN] Would mount /dev/nda4p1 at
> /tmp/tmp.yJYQH8a2Cz
> freebsd-update: [bootloader] INFO:  [DRY RUN] Would update:
> /tmp/tmp.yJYQH8a2Cz/EFI/FreeBSD/loader.efi
> freebsd-update: [bootloader] INFO:  [DRY RUN] Would update:
> /tmp/tmp.yJYQH8a2Cz/EFI/BOOT/BOOTx64.efi
> freebsd-update: [bootloader] INFO:  Adding NVRAM boot entry: FreeBSD →
> \EFI\FreeBSD\loader.efi
> freebsd-update: [bootloader] INFO:  [DRY RUN] Would mount /dev/nda2p1 at
> /tmp/tmp.9MqfM1GtZ9
> freebsd-update: [bootloader] INFO:  [DRY RUN] Would update:
> /tmp/tmp.9MqfM1GtZ9/EFI/FreeBSD/loader.efi
> freebsd-update: [bootloader] INFO:  [DRY RUN] Would update:
> /tmp/tmp.9MqfM1GtZ9/EFI/BOOT/BOOTx64.efi
> freebsd-update: [bootloader] INFO:  Adding NVRAM boot entry: FreeBSD →
> \EFI\FreeBSD\loader.efi
> freebsd-update: [bootloader] INFO:  [DRY RUN] Would mount /dev/nda1p1 at
> /tmp/tmp.xtfvCG9SJQ
> freebsd-update: [bootloader] INFO:  [DRY RUN] Would update:
> /tmp/tmp.xtfvCG9SJQ/EFI/FreeBSD/loader.efi
> freebsd-update: [bootloader] INFO:  [DRY RUN] Would update:
> /tmp/tmp.xtfvCG9SJQ/EFI/BOOT/BOOTx64.efi
> freebsd-update: [bootloader] INFO:  Adding NVRAM boot entry: FreeBSD →
> \EFI\FreeBSD\loader.efi
> freebsd-update: [bootloader] INFO:  [DRY RUN] Would mount /dev/nda0p1 at
> /tmp/tmp.oCz0FRiFcZ
> freebsd-update: [bootloader] INFO:  [DRY RUN] Would update:
> /tmp/tmp.oCz0FRiFcZ/EFI/FreeBSD/loader.efi
> freebsd-update: [bootloader] INFO:  [DRY RUN] Would update:
> /tmp/tmp.oCz0FRiFcZ/EFI/BOOT/BOOTx64.efi
> freebsd-update: [bootloader] INFO:  Adding NVRAM boot entry: FreeBSD →
> \EFI\FreeBSD\loader.efi
>
> It did skip media with no ESP:
>
> =>        34  4000797293    nda3  GPT  (1.9T)
>           34      262144  nda3p1  ms-reserved  (128M)
>       262178        2014          - free -  (1007K)
>       264192  3600451584  nda3p2  ms-basic-data  (1.7T)
>   3600715776    62914560  nda3p3  freebsd-swap  (30G)
>   3663630336   337166991          - free -  (161G)
>
>
> --
> ===
> Mark Millard
> marklmi at yahoo.com



Mark,

Interesting configuration.  I'll take a further look, and update you
shortly.

Thank You very much for your reports and the feedback you've provided.

Best,
Ron