Add UEFI support to os-prober
authorSteve McIntyre <steve@einval.com>
Thu, 25 Apr 2013 14:30:14 +0000 (15:30 +0100)
committerSteve McIntyre <steve@einval.com>
Thu, 25 Apr 2013 14:30:14 +0000 (15:30 +0100)
patch from Andrey Borzenkov:

+ skip legacy MS loader detection on UEFI platform
+ add framework for searching EFI System Partition
+ add scripts that detect Microsoft bootloader and ELILO.

debian/changelog
os-probes/mounted/x86/05efi [new file with mode: 0755]
os-probes/mounted/x86/20microsoft
os-probes/mounted/x86/efi/10elilo [new file with mode: 0755]
os-probes/mounted/x86/efi/20microsoft [new file with mode: 0755]

index c32551a..e8e70d6 100644 (file)
@@ -1,3 +1,13 @@
+os-prober (1.58) unstable; urgency=low
+
+  [ Steve McIntyre ]
+  * add UEFI support, patch from Andrey Borzenkov:
+    + skip legacy MS loader detection on UEFI platform
+    + add framework for searching EFI System Partition
+    + add scripts that detect Microsoft bootloader and ELILO.
+
+ -- Steve McIntyre <93sam@debian.org>  Thu, 25 Apr 2013 00:55:53 +0100
+
 os-prober (1.57) unstable; urgency=low
 
   [ Christian Perrier ]
diff --git a/os-probes/mounted/x86/05efi b/os-probes/mounted/x86/05efi
new file mode 100755 (executable)
index 0000000..1e506fc
--- /dev/null
@@ -0,0 +1,70 @@
+#!/bin/sh
+# Detects all Microsoft OSes on a collection of partitions.
+
+. /usr/share/os-prober/common.sh
+
+partition="$1"
+mpoint="$2"
+type="$3"
+
+# This file is for UEFI platform only
+if [ ! -d /sys/firmware/efi ]; then
+       debug "Not on UEFI platform"
+       exit 1
+fi
+
+# Weed out stuff that doesn't apply to us
+case "$type" in
+       vfat) debug "$1 is a FAT32 partition" ;;
+       msdos) debug "$1 is a FAT16 partition" ;;
+       *) debug "$1 is $type partition: exiting"; exit 1 ;;
+esac
+
+if type udevadm > /dev/null 2>&1; then
+       udevinfo () {
+               udevadm info "$@"
+       }
+fi
+
+if type udevinfo > /dev/null 2>&1; then
+       # Skip virtual devices
+       if udevinfo -q path -n $partition | grep -q /virtual/; then
+               debug "$1 is virtual device: exiting"
+               exit 1
+       fi
+
+       eval "$(udevinfo -q property -n "$partition" | grep -E '^ID_PART_ENTRY_(TYPE|SCHEME)=')"
+       debug "$partition partition scheme is $ID_PART_ENTRY_SCHEME"
+       debug "$partition partition type is $ID_PART_ENTRY_TYPE"
+
+       if [ -z "$ID_PART_ENTRY_TYPE" -o -z "$ID_PART_ENTRY_SCHEME" -o \
+               \( "$ID_PART_ENTRY_SCHEME" != gpt -a "$ID_PART_ENTRY_SCHEME" != msdos \) -o \
+               \( "$ID_PART_ENTRY_SCHEME" = gpt -a "$ID_PART_ENTRY_TYPE" != c12a7328-f81f-11d2-ba4b-00a0c93ec93b \) -o \
+               \( "$ID_PART_ENTRY_SCHEME" = msdos -a "$ID_PART_ENTRY_TYPE" != 0xef \) ]; then
+               debug "$partition is not a ESP partition: exiting"
+               exit 1
+       fi
+else
+       debug "udevinfo and udevadm missing - cannot check partition type"
+fi
+
+efi=$(item_in_dir efi "$mpoint")
+if [ -z "$efi" ]; then
+       debug "$mpoint does not have /EFI directory: exiting"
+       exit 1
+fi
+
+ret=1
+for test in /usr/lib/os-probes/mounted/efi/*; do
+       debug "running subtest $test"
+       if [ -f "$test" ] && [ -x "$test" ]; then
+               entry=$("$test" "$mpoint/$efi")
+               if [ -n "$entry" ]; then
+                       debug "bootloader $entry found by subtest $test"
+                       ret=0
+                       result "${partition}@/$efi/${entry}:efi"
+               fi
+       fi
+done
+
+exit $ret
index 644d63c..bf829d9 100755 (executable)
@@ -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" ;;
diff --git a/os-probes/mounted/x86/efi/10elilo b/os-probes/mounted/x86/efi/10elilo
new file mode 100755 (executable)
index 0000000..72dc462
--- /dev/null
@@ -0,0 +1,24 @@
+#!/bin/sh
+# Detects ELILO bootloader on a EFI System Partition
+
+. /usr/share/os-prober/common.sh
+
+efi="$1"
+
+found=
+
+elilo=`find $1 -name "elilo.efi"`
+if [ -n "$elilo" ]; then
+       bdir=`dirname $elilo`
+       bdir=`basename $bdir`
+       long="ELILO Boot Manager"
+       short="ELILO"
+       path=${bdir}/elilo.efi
+       found=true
+fi  
+
+if [ -n "$found" ]; then
+       label="$(count_next_label "$short")"
+       result "${path}:${long}:${label}"
+fi
+exit 0
diff --git a/os-probes/mounted/x86/efi/20microsoft b/os-probes/mounted/x86/efi/20microsoft
new file mode 100755 (executable)
index 0000000..9532081
--- /dev/null
@@ -0,0 +1,28 @@
+#!/bin/sh
+# Detects Microsoft bootloader on a EFI System Partition
+
+. /usr/share/os-prober/common.sh
+
+efi="$1"
+
+found=
+for microsoft in $(item_in_dir microsoft "$efi"); do
+       for boot in $(item_in_dir boot "$efi/$microsoft"); do
+               bcd=$(item_in_dir bcd "$efi/$microsoft/$boot")
+               bootmgfw=$(item_in_dir bootmgfw.efi "$efi/$microsoft/$boot")
+               if [ -n "$bcd" -a -n "$bootmgfw" ]; then
+                       long="Windows Boot Manager"
+                       short=Windows
+                       path="$microsoft/$boot/$bootmgfw"
+                       found=true
+                       break
+               fi
+       done
+done
+
+
+if [ -n "$found" ]; then
+       label="$(count_next_label "$short")"
+       result "${path}:${long}:${label}"
+fi
+exit 0