Attached are suggested implementation for UEFI support. Because ESP can contain arbitrary number of boot entries, it is itself implemented as extensible framework.
1. /usr/lib/os-prober/mounted/05efi Makes basic plausibility checks (FAT and /EFI exists) and calls scripts from /usr/lib/os-prober/mounted/efi/* to perform OS detection. Returns detected bootladers in the form ${device}@${path}:${long}:${short}:efi 2. patch for /etc/grub.d/30_os-prober creates "chainloader ${path}" entry from the above 3. Patch for /usr/lib/os-prober/mounted/20microsoft It seems that on UEFI systems Windows sometimes installs both legacy and UEFI bootloader. In this case os-prober adds menu entries for legacy Windows boot which do not work from within UEFI GRUB bootloader. Patch detects UEFI platform and skips running there. 4. /usr/lib/os-prober/mounted/efi/20microsoft Suggested implementation for Microsoft bootloader. We have no way to create entries for individual OSes here (this would involve parsing BCD store at the very least), so entry is titled as "Windows Boot Manager", the same as is automatically added to UEFI boot menu. This is successfully tested on VM with Windows 7/openSUSE 12.2 dual boot. As openSUSE 12.2 comes with GRUB2 as default bootloader, this issue seems to be hit by quite a number of users. Comments? -andrey
Index: b/os-probes/mounted/x86/20microsoft =================================================================== --- a/os-probes/mounted/x86/20microsoft +++ b/os-probes/mounted/x86/20microsoft @@ -7,6 +7,12 @@ partition="$1" mpoint="$2" type="$3" +# This script looks for legacy BIOS bootloaders only. Skip if running UEFI +if [ -d /sys/firmware/efi ]; then + debug "Skipping legacy bootloaders on UEFI system" + exit 1 +fi + # Weed out stuff that doesn't apply to us case "$type" in ntfs|ntfs-3g) debug "$1 is a NTFS partition" ;;
--- /etc/grub.d/30_os-prober.orig 2012-09-28 22:12:51.047085849 +0400 +++ /etc/grub.d/30_os-prober 2012-09-29 18:35:25.949036128 +0400 @@ -144,6 +144,22 @@ EOF } EOF ;; + efi) + + EFIPATH=${DEVICE#*@} + DEVICE=${DEVICE%@*} + onstr="$(gettext_printf "(on %s)" "${DEVICE}")" + cat << EOF +menuentry '$(echo "${LONGNAME} $onstr" | grub_quote)' --class windows --class os \$menuentry_id_option 'osprober-efi-$(grub_get_device_id "${DEVICE}")' { +EOF + save_default_entry | sed -e "s/^/\t/" + prepare_grub_to_access_device ${DEVICE} | sed -e "s/^/\t/" + + cat <<EOF + chainloader ${EFIPATH} +} +EOF + ;; linux) LINUXPROBED="`linux-boot-prober ${DEVICE} 2> /dev/null | tr ' ' '^' | paste -s -d ' '`" prepare_boot_cache=
05efi
Description: application/shellscript
20microsoft
Description: application/shellscript
_______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel