Re: Review D58990: freebsd-update: automatically update EFI and BIOS bootloaders on install
Mark Millard <[email protected]>
| Newsgroups | gmane.os.freebsd.devel.hackers |
|---|---|
| Message-ID | <[email protected]> |
On 8/20/26 01:08, Ronald Pagani Jr (ronald.pagani.jr) wrote: > > > On Thu, Aug 20, 2026 at 12:37 AM Stefan Esser <[email protected] > <mailto:[email protected]>> 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.) -- === Mark Millard marklmi at yahoo.com