From 81111d8d75e3fc4faba3bd92a1110321ecf2794d49c53b2ec7226081aa6d67e7 Mon Sep 17 00:00:00 2001 From: Marcus Meissner Date: Sat, 5 Jan 2013 14:42:18 +0000 Subject: [PATCH] Accepting request 147193 from home:arvidjaar:bnc775610 - add support for chainloading another UEFI bootloader (bnc#775610) * 05efi - top level driver to search ESP * efi-20microsoft - support Microsoft UEFI bootloader * efi-10elilo - support ELILO UEFI bootloader (Agnelo de la Crotche) - skip legacy Microsoft bootloader on UEFI (bnc#775610) OBS-URL: https://build.opensuse.org/request/show/147193 OBS-URL: https://build.opensuse.org/package/show/Base:System/os-prober?expand=0&rev=9 --- 05efi | 70 ++++++++++++++++++++++++++ efi-10elilo | 25 +++++++++ efi-20microsoft | 28 +++++++++++ os-prober-skip-MS-legacy-on-UEFI.patch | 31 ++++++++++++ os-prober.changes | 9 ++++ os-prober.spec | 15 +++++- 6 files changed, 176 insertions(+), 2 deletions(-) create mode 100644 05efi create mode 100644 efi-10elilo create mode 100644 efi-20microsoft create mode 100644 os-prober-skip-MS-legacy-on-UEFI.patch diff --git a/05efi b/05efi new file mode 100644 index 0000000..7e88062 --- /dev/null +++ b/05efi @@ -0,0 +1,70 @@ +#!/bin/sh +# Detects all UEFI bootloaders on EFI System Partition + +. /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 diff --git a/efi-10elilo b/efi-10elilo new file mode 100644 index 0000000..c73267e --- /dev/null +++ b/efi-10elilo @@ -0,0 +1,25 @@ +#!/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` + vendor=$(echo $bdir | sed 's|SuSE|SUSE|') + long="${vendor} 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/efi-20microsoft b/efi-20microsoft new file mode 100644 index 0000000..5ee4cc0 --- /dev/null +++ b/efi-20microsoft @@ -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 diff --git a/os-prober-skip-MS-legacy-on-UEFI.patch b/os-prober-skip-MS-legacy-on-UEFI.patch new file mode 100644 index 0000000..f3e303d --- /dev/null +++ b/os-prober-skip-MS-legacy-on-UEFI.patch @@ -0,0 +1,31 @@ +From: Andrey Borzenkov +Date: Fri Jan 4 09:46:56 UTC 2013 +Subject: skip legacy Microsoft bootloader on UEFI system + +References: bnc#775610 +Patch-Mainline: no + +Sometimes Windows installs both legacy BIOS and UEFI bootloaders. +Attempt to chainload legacy bootloader on UEFI system fails. Skip +adding legacy bootloader in this case. + +TODO: this probably should be implemented as runtime check. But it +does the right thing in majority of cases. If mixed legacy/UEFI +boot will be used frequently, it can be revisited. +Index: os-prober/os-probes/mounted/x86/20microsoft +=================================================================== +--- os-prober.orig/os-probes/mounted/x86/20microsoft ++++ os-prober/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" ;; diff --git a/os-prober.changes b/os-prober.changes index a346cea..0b65402 100644 --- a/os-prober.changes +++ b/os-prober.changes @@ -1,3 +1,12 @@ +------------------------------------------------------------------- +Fri Jan 4 11:18:01 UTC 2013 - arvidjaar@gmail.com + +- add support for chainloading another UEFI bootloader (bnc#775610) + * 05efi - top level driver to search ESP + * efi-20microsoft - support Microsoft UEFI bootloader + * efi-10elilo - support ELILO UEFI bootloader (Agnelo de la Crotche) +- skip legacy Microsoft bootloader on UEFI (bnc#775610) + ------------------------------------------------------------------- Mon Dec 19 11:13:44 UTC 2011 - aj@suse.de diff --git a/os-prober.spec b/os-prober.spec index 454c600..2074480 100644 --- a/os-prober.spec +++ b/os-prober.spec @@ -1,7 +1,7 @@ # # spec file for package os-prober # -# Copyright (c) 2011 SUSE LINUX Products GmbH, Nuernberg, Germany. +# Copyright (c) 2013 SUSE LINUX Products GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -16,7 +16,6 @@ # - Name: os-prober Version: 1.49 Release: 0 @@ -27,11 +26,16 @@ Group: System/Boot Url: http://kitenet.net/~joey/code/os-prober/ Source0: http://ftp.de.debian.org/debian/pool/main/o/os-prober/%{name}_%{version}.tar.gz Source1: COPYING-note.txt +Source2: 05efi +Source3: efi-20microsoft +Source4: efi-10elilo # move newns binary outside of os-prober subdirectory, so that debuginfo # can be automatically generated for it Patch0: os-prober-newnsdirfix.patch # PATCH-FIX-OPENSUSE: Fix spelling of SUSE aj@suse.de Patch1: os-prober-SUSE.patch +# PATCH-FIX-OPENSUSE: Skip legacy Microsoft bootloader on UEFI [bnc#775610] +Patch2: os-prober-skip-MS-legacy-on-UEFI.patch Requires: /bin/grep Requires: /bin/sed @@ -52,6 +56,7 @@ distributions can be added easily. cp %SOURCE1 . %patch0 -p1 %patch1 -p1 +%patch2 -p1 %build make %{?_smp_mflags} CC="%__cc" CFLAGS="%{optflags}" @@ -88,6 +93,12 @@ done if [ "$ARCH" = x86 ]; then install -m 755 -p os-probes/mounted/powerpc/20macosx \ %{buildroot}%{_libexecdir}/os-probes/mounted + install -m 755 -p %SOURCE2 %{buildroot}%{_libexecdir}/os-probes/mounted + install -m 755 -d %{buildroot}%{_libexecdir}/os-probes/mounted/efi + install -m 755 -p %SOURCE3 \ + %{buildroot}%{_libexecdir}/os-probes/mounted/efi/20microsoft + install -m 755 -p %SOURCE4 \ + %{buildroot}%{_libexecdir}/os-probes/mounted/efi/10elilo fi %files