Package: libdebian-installer Version: 0.102 Severity: normal Tags: patch User: ubuntu-de...@lists.ubuntu.com Usertags: origin-ubuntu yakkety ubuntu-patch
Dear Maintainer, EFI detection in libd-i can in some cases pass while efibootmgr will fail to set BootEntry due to efivar's checks actually looking for efivars or vars instead of just the existence of /sys/firmware/efi. In Ubuntu; I'm applying the following patch to libdebian-installer's detection code: * src/system/efi.c: validate the presence of efivars *or* vars under /sys/firmware/efi to decide whether we should show the system as running in EFI mode; either of these paths is required for efibootmgr to set a BootEntry at the end of installation. Admittedly, this can still fail if for some reason efivars or vars are present but empty, but this isn't any different than for /sys/firmware/efi itself. /sys/firmware/efi/vars should mostly always be around, as it appears to come straight from the kernel; /sys/firmware/efi/efivars is typically to be mounted by the init system (this happens at least in systemd src/core/mount-setup.c). In Ubuntu this is bug: https://bugs.launchpad.net/ubuntu/+source/libdebian-installer/+bug/1582320 Thanks for considering the patch. -- System Information: Debian Release: stretch/sid APT prefers yakkety APT policy: (500, 'yakkety'), (99, 'yakkety-proposed') Architecture: amd64 (x86_64) Foreign Architectures: i386 Kernel: Linux 4.4.0-23-generic (SMP w/4 CPU cores) Locale: LANG=fr_CA.UTF-8, LC_CTYPE=fr_CA.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash Init: systemd (via /run/systemd/system)
diff -Nru libdebian-installer-0.102ubuntu1/src/system/efi.c libdebian-installer-0.102ubuntu2/src/system/efi.c --- libdebian-installer-0.102ubuntu1/src/system/efi.c 2015-12-23 19:24:26.000000000 -0500 +++ libdebian-installer-0.102ubuntu2/src/system/efi.c 2016-06-03 21:22:39.000000000 -0400 @@ -26,8 +26,9 @@ * exists */ int di_system_is_efi(void) { - int ret = access("/sys/firmware/efi", R_OK); - if (ret == 0) + int efivars_access = access("/sys/firmware/efi/efivars", R_OK); + int vars_access = access("/sys/firmware/efi/vars", R_OK); + if (efivars_access == 0 || vars_access == 0) { /* Have we been told to ignore EFI in partman-efi? */ ret = access("/var/lib/partman/ignore_uefi", R_OK);