Import EFI patch by cjwatson
This commit is contained in:
parent
6c2111e96c
commit
861d5b5c72
1 changed files with 132 additions and 0 deletions
|
@ -24,6 +24,7 @@ exec_prefix=@exec_prefix@
|
||||||
sbindir=@sbindir@
|
sbindir=@sbindir@
|
||||||
bindir=@bindir@
|
bindir=@bindir@
|
||||||
libdir=@libdir@
|
libdir=@libdir@
|
||||||
|
sysconfdir=@sysconfdir@
|
||||||
PACKAGE_NAME=@PACKAGE_NAME@
|
PACKAGE_NAME=@PACKAGE_NAME@
|
||||||
PACKAGE_TARNAME=@PACKAGE_TARNAME@
|
PACKAGE_TARNAME=@PACKAGE_TARNAME@
|
||||||
PACKAGE_VERSION=@PACKAGE_VERSION@
|
PACKAGE_VERSION=@PACKAGE_VERSION@
|
||||||
|
@ -56,6 +57,9 @@ update_nvram=yes
|
||||||
|
|
||||||
ofpathname=`which ofpathname`
|
ofpathname=`which ofpathname`
|
||||||
nvsetenv=`which nvsetenv`
|
nvsetenv=`which nvsetenv`
|
||||||
|
efibootmgr=`which efibootmgr 2>/dev/null || true`
|
||||||
|
removable=no
|
||||||
|
efi_quiet=
|
||||||
|
|
||||||
if [ "${target_cpu}-${platform}" = "i386-pc" ] ; then
|
if [ "${target_cpu}-${platform}" = "i386-pc" ] ; then
|
||||||
disk_module=biosdisk
|
disk_module=biosdisk
|
||||||
|
@ -103,6 +107,11 @@ if [ "${target_cpu}-${platform}" = "i386-ieee1275" ] || [ "${target_cpu}-${platf
|
||||||
cat <<EOF
|
cat <<EOF
|
||||||
--no-nvram don't update the boot-device NVRAM variable
|
--no-nvram don't update the boot-device NVRAM variable
|
||||||
EOF
|
EOF
|
||||||
|
fi
|
||||||
|
if [ "${platform}" = "efi" ]; then
|
||||||
|
cat <<EOF
|
||||||
|
--removable the installation device is removable
|
||||||
|
EOF
|
||||||
fi
|
fi
|
||||||
cat <<EOF
|
cat <<EOF
|
||||||
|
|
||||||
|
@ -188,6 +197,8 @@ do
|
||||||
no_floppy="--no-floppy" ;;
|
no_floppy="--no-floppy" ;;
|
||||||
--recheck)
|
--recheck)
|
||||||
recheck=yes ;;
|
recheck=yes ;;
|
||||||
|
--removable)
|
||||||
|
removable=yes ;;
|
||||||
|
|
||||||
--disk-module)
|
--disk-module)
|
||||||
if [ "${target_cpu}-${platform}" = "i386-pc" ] ; then
|
if [ "${target_cpu}-${platform}" = "i386-pc" ] ; then
|
||||||
|
@ -241,6 +252,7 @@ setup_verbose=
|
||||||
if test $debug = yes; then
|
if test $debug = yes; then
|
||||||
set -x
|
set -x
|
||||||
setup_verbose="--verbose"
|
setup_verbose="--verbose"
|
||||||
|
efi_quiet=-q
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Initialize these directories here, since ROOTDIR was initialized.
|
# Initialize these directories here, since ROOTDIR was initialized.
|
||||||
|
@ -488,6 +500,126 @@ elif [ "${target_cpu}-${platform}" = "i386-ieee1275" ] || [ "${target_cpu}-${pla
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
fi
|
fi
|
||||||
|
elif [ x"$platform" = xefi ]; then
|
||||||
|
# Get GRUB_DISTRIBUTOR.
|
||||||
|
if test -f ${sysconfdir}/default/grub ; then
|
||||||
|
. ${sysconfdir}/default/grub
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Find the EFI System Partition.
|
||||||
|
efidir=
|
||||||
|
if test -d ${bootdir}/efi; then
|
||||||
|
install_device=`$grub_mkdevicemap --device-map=/dev/stdout | $grub_probe --target=device --device-map=/dev/stdin ${bootdir}/efi`
|
||||||
|
# Is it a mount point?
|
||||||
|
if test "x$install_device" != "x`$grub_mkdevicemap --device-map=/dev/stdout | $grub_probe --target=device --device-map=/dev/stdin ${bootdir}`"; then
|
||||||
|
efidir=${bootdir}/efi
|
||||||
|
fi
|
||||||
|
elif test -n "$rootdir" && test "x$rootdir" != "x/"; then
|
||||||
|
# The EFI System Partition may have been given directly using
|
||||||
|
# --root-directory.
|
||||||
|
install_device=`$grub_mkdevicemap --device-map=/dev/stdout | $grub_probe --target=device --device-map=/dev/stdin ${rootdir}`
|
||||||
|
# Is it a mount point?
|
||||||
|
if test "x$install_device" != "x`$grub_mkdevicemap --device-map=/dev/stdout | $grub_probe --target=device --device-map=/dev/stdin ${rootdir}/..`"; then
|
||||||
|
efidir=${rootdir}
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -n "$efidir"; then
|
||||||
|
efi_fs=`$grub_probe --target=fs --device-map=${device_map} ${efidir}`
|
||||||
|
if test "x$efi_fs" = xfat; then :; else
|
||||||
|
echo "${efidir} doesn't look like an EFI partition." 1>&2
|
||||||
|
efidir=
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -n "$efidir"; then
|
||||||
|
# The EFI specification requires that an EFI System Partition must
|
||||||
|
# contain an "EFI" subdirectory, and that OS loaders are stored in
|
||||||
|
# subdirectories below EFI. Vendors are expected to pick names that do
|
||||||
|
# not collide with other vendors. To minimise collisions, we use the
|
||||||
|
# name of our distributor if possible.
|
||||||
|
if test $removable = yes; then
|
||||||
|
# The specification makes stricter requirements of removable
|
||||||
|
# devices, in order that only one image can be automatically loaded
|
||||||
|
# from them. The image must always reside under /EFI/BOOT, and it
|
||||||
|
# must have a specific file name depending on the architecture.
|
||||||
|
efi_distributor=BOOT
|
||||||
|
case "$target_cpu" in
|
||||||
|
i386)
|
||||||
|
efi_file=BOOTIA32.EFI ;;
|
||||||
|
x86-64)
|
||||||
|
efi_file=BOOTX64.EFI ;;
|
||||||
|
# GRUB does not yet support these architectures, but they're defined
|
||||||
|
# by the specification so we include them here to ease future
|
||||||
|
# expansion.
|
||||||
|
ia64)
|
||||||
|
efi_file=BOOTIA64.EFI ;;
|
||||||
|
esac
|
||||||
|
else
|
||||||
|
efi_distributor="$(echo "$GRUB_DISTRIBUTOR" | tr '[A-Z]' '[a-z]' | cut -d' ' -f1)"
|
||||||
|
if test -z "$efi_distributor"; then
|
||||||
|
efi_distributor=grub
|
||||||
|
fi
|
||||||
|
# It is convenient for each architecture to have a different
|
||||||
|
# efi_file, so that different versions can be installed in parallel.
|
||||||
|
case "$target_cpu" in
|
||||||
|
i386)
|
||||||
|
efi_file=grubia32.efi ;;
|
||||||
|
x86-64)
|
||||||
|
efi_file=grubx64.efi ;;
|
||||||
|
# GRUB does not yet support these architectures, but they're defined
|
||||||
|
# by the specification so we include them here to ease future
|
||||||
|
# expansion.
|
||||||
|
ia64)
|
||||||
|
efi_file=grubia64.efi ;;
|
||||||
|
*)
|
||||||
|
efi_file=grub.efi ;;
|
||||||
|
esac
|
||||||
|
# TODO: We should also use efibootmgr, if available, to add a Boot
|
||||||
|
# entry for ourselves.
|
||||||
|
fi
|
||||||
|
efidir="$efidir/EFI/$efi_distributor"
|
||||||
|
mkdir -p "$efidir" || exit 1
|
||||||
|
else
|
||||||
|
# We don't know what's going on. Fall back to traditional
|
||||||
|
# (non-specification-compliant) behaviour.
|
||||||
|
efidir="$grubdir"
|
||||||
|
efi_distributor=
|
||||||
|
efi_file=grub.efi
|
||||||
|
fi
|
||||||
|
cp ${grubdir}/core.${imgext} ${efidir}/${efi_file}
|
||||||
|
# Try to make this image bootable using the EFI Boot Manager, if available.
|
||||||
|
if test "$removable" = no && test -n "$efi_distributor" && \
|
||||||
|
test -n "$efibootmgr"; then
|
||||||
|
# On Linux, we need the efivars kernel modules.
|
||||||
|
case "$host_os" in
|
||||||
|
linux*)
|
||||||
|
modprobe -q efivars 2>/dev/null || true ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Delete old entries from the same distributor.
|
||||||
|
for bootnum in `efibootmgr | grep '^Boot[0-9]' | \
|
||||||
|
fgrep " $efi_distributor" | cut -b5-8`; do
|
||||||
|
efibootmgr $efi_quiet -b "$bootnum" -B
|
||||||
|
done
|
||||||
|
|
||||||
|
# Add a new entry for the image we just created. efibootmgr needs to be
|
||||||
|
# given the disk device and partition number separately, so we have to
|
||||||
|
# fiddle about with grub-probe to get hold of this reasonably reliably.
|
||||||
|
# Use fresh device map text to avoid any problems with stale data, since
|
||||||
|
# all we need here is a one-to-one mapping.
|
||||||
|
clean_devmap="$($grub_mkdevicemap --device-map=/dev/stdout)"
|
||||||
|
efidir_drive="$(echo "$clean_devmap" | $grub_probe --target=drive --device-map=/dev/stdin "$efidir")"
|
||||||
|
if test -z "$efidir_drive"; then
|
||||||
|
echo "Can't find GRUB drive for $efidir; unable to create EFI Boot Manager entry." >&2
|
||||||
|
else
|
||||||
|
efidir_disk="$(echo "$clean_devmap" | grep "^$(echo "$efidir_drive" | sed 's/,[^)]*//')" | cut -f2)"
|
||||||
|
efidir_part="$(echo "$efidir_drive" | sed 's/^([^,]*,[^0-9]*//; s/[^0-9].*//')"
|
||||||
|
efibootmgr $efi_quiet -c -d "$efidir_disk" -p "$efidir_part" -w \
|
||||||
|
-L "$GRUB_DISTRIBUTOR" -l "\\EFI\\$efi_distributor\\$efi_file"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Installation finished. No error reported."
|
echo "Installation finished. No error reported."
|
||||||
|
|
Loading…
Reference in a new issue