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=

Attachment: 05efi
Description: application/shellscript

Attachment: 20microsoft
Description: application/shellscript

_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to