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 18:17:40 UTC
Mark,

Would you be able to try this latest commit?

https://github.com/RZA-SF/freebsd-patch-for-bug279829/blob/revision-2/src/efi_bootloader_update.sh

Best,
Ron

On Thu, Aug 20, 2026 at 10:26 AM Mark Millard <marklmi@yahoo.com> wrote:

> On 8/20/26 08:26, Mark Millard 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 a Windows Dev Kit 2023 (with UFS) it gets: "freebsd-update:
> > [bootloader] INFO:  Boot method detected: unknown"
> >
> > # sh -x efi_bootloader_update.sh --dry-run --verbose
> > + [ -n '' ]
> > + _EFI_BOOTLOADER_UPDATE_SH=1
> > + : /boot/loader.efi
> > + : 0
> > + : 0
> > + : 1
> > + : /boot/pmbr
> > + : /boot/gptzfsboot
> > + : /boot/gptboot
> > + _EFI_FINGERPRINT_THRESHOLD=2
> > + _efi_esp_mp=''
> > + _efi_esp_did_mount=0
> > + _efi_tmp_mounts=''
> > + _efi_script_name=efi_bootloader_update.sh
> > + [ efi_bootloader_update.sh '=' efi_bootloader_update.sh ]
> > + [ 2 -gt 0 ]
> > + EFI_DRY_RUN=1
> > + shift
> > + [ 1 -gt 0 ]
> > + EFI_VERBOSE=1
> > + shift
> > + [ 0 -gt 0 ]
> > + update_bootloaders
> > + local 'total_errors=0'
> > + local rc
> > + efi_check_prerequisites
> > + local 'ok=0'
> > + id -u
> > + [ 0 '!=' 0 ]
> > + sysctl -n security.jail.jailed
> > + [ 0 '=' 1 ]
> > + [ ! -f /boot/loader.efi ]
> > + [ ! -s /boot/loader.efi ]
> > + return 0
> > + rc=0
> > + local boot_method 'fallback_binary='
> > + efi_boot_method
> > + local m
> > + sysctl -n machdep.bootmethod
> > + m=''
> > + echo unknown
> > + return
> > + boot_method=unknown
> > + _efi_info 'Boot method detected: unknown'
> > + _efi_log 'INFO:  Boot method detected: unknown'
> > + echo 'freebsd-update: [bootloader] INFO:  Boot method detected:
> unknown'
> > freebsd-update: [bootloader] INFO:  Boot method detected: unknown
> > + [ unknown '=' UEFI ]
> > + trap efi_cleanup_mounts EXIT INT TERM
> > + [ unknown '=' UEFI ]
> > + local bios_list
> > + efi_discover_all_bios_parts
> > + local disks
> > + sysctl -n kern.disks
> > + tr ' ' '\n'
> > + disks='da0
> > nda0'
> > + local disk 'found=0'
> > + [ -z da0 ]
> > + local parts
> > + gpart show da0
> > + awk -v 'd=da0' '$4 == "freebsd-boot" { print d, $3 }'
> > + parts=''
> > + [ -n '' ]
> > + [ -z nda0 ]
> > + local parts
> > + gpart show nda0
> > + awk -v 'd=nda0' '$4 == "freebsd-boot" { print d, $3 }'
> > + parts=''
> > + [ -n '' ]
> > + [ 0 -eq 0 ]
> > + return 1
> > + bios_list=''
> > + true
> > + [ -n '' ]
> > + [ 0 -gt 0 ]
> > + [ 1 '=' 1 ]
> > + _efi_info '[DRY RUN] Bootloader update complete (no changes made)'
> > + _efi_log 'INFO:  [DRY RUN] Bootloader update complete (no changes
> made)'
> > + echo 'freebsd-update: [bootloader] INFO:  [DRY RUN] Bootloader update
> > complete (no changes made)'
> > freebsd-update: [bootloader] INFO:  [DRY RUN] Bootloader update complete
> > (no changes made)
> > + return 0
> > + exit 0
> > + efi_cleanup_mounts
> > + local mp
> > + _efi_tmp_mounts=''
> >
> > (I had reported the empty sysctl -n machdep.bootmethod result for the
> > context in the review, violating an assumption of the scripting. I've no
> > clue how common the empty result might be overall.)
> >
>
> I tried another (but unofficial) context: Booting a RPi5B via a
> draft/partial EDK2 on a microsd card and the FreeBSD materials
> (including ESP) on the internal NVMe. So, another UEFI/ACPI aarch64
> context:
>
> # sh -x efi_bootloader_update.sh --dry-run
> . . .
> + efi_boot_method
> + local m
> + sysctl -n machdep.bootmethod
> + m=''
> + echo unknown
> + return
> + boot_method=unknown
> + _efi_info 'Boot method detected: unknown'
> + _efi_log 'INFO:  Boot method detected: unknown'
> + echo 'freebsd-update: [bootloader] INFO:  Boot method detected: unknown'
> freebsd-update: [bootloader] INFO:  Boot method detected: unknown
> . . .
>
> So the same issue. (There is no U-Boot context for that RPi5 context
> that I know of for FreeBSD.)
>
>
> I'll note (both aarch64):
>
> WinDevKit23:
> # efibootmgr
> BootCurrent: 0000
>
> RPi5:
> # efibootmgr
> Boot to FW : false
> BootCurrent: 0002
> Timeout    : 5 seconds
> BootOrder  : 0000, 0001, 0002, 0003
>  Boot0000* UiApp
>  Boot0001* UEFI SanDisk SE32G 4412AC09 SD Device
> +Boot0002* UEFI Timetec 35TTTN2242GE3P-1TB YS240913B1T0242 1
>  Boot0003  UEFI Shell
>
> I do not know if the efibootmgr behavior intended always works. There is
> a notable difference in the default outputs above, WInDevKit23 possibly
> being odd.
>
> As for the amd64 system, just for reference:
>
> # efibootmgr
> Boot to FW : false
> BootCurrent: 0004
> Timeout    : 1 seconds
> BootOrder  : 0000, 0002, 0004, 0006, 0005, 0007, 0008
>  Boot0000* Windows Boot Manager
>  Boot0002* UEFI OS
> +Boot0004* UEFI OS
>  Boot0006* UEFI OS
>  Boot0005* UEFI OS
>  Boot0007* UEFI OS
>  Boot0008* UEFI OS
>
> (It actually boots Windows 11 Pro by default, even though that is
> normally not what I boot.)
>
> I'm avoiding touching the systems that I have access to.
>
>
> I may later see about trying an official U-boot based UEFI boot context
> on, say, an RPi4B.
>
>
> --
> ===
> Mark Millard
> marklmi at yahoo.com
>