From a1beca7b44a788dc627a210550ab2d96714f391c Mon Sep 17 00:00:00 2001 From: Lucas Alvares Gomes Date: Fri, 12 Jul 2013 17:50:39 +0100 Subject: [PATCH] EFI hosts If you have an EFI host but the image doesn't have the EFI modules installed the grub-install command will fail in case the --target argument is not set. The problem is that the grub-install script will check whether the /sys/firmware/efi file exists or not to determine if it's an EFI installation, but this value comes from the host, so this patch will look for the /sys/firmware/efi file and will also check if the EFI modules are installed in the image, if not set the --target to a non-efi platform. Change-Id: I4481b43e4a8fe4144be9c7eb9d9c618bbb2df21e --- elements/vm/finalise.d/51-grub | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/elements/vm/finalise.d/51-grub b/elements/vm/finalise.d/51-grub index 4880f4d1..cdb32b99 100755 --- a/elements/vm/finalise.d/51-grub +++ b/elements/vm/finalise.d/51-grub @@ -27,7 +27,40 @@ GRUB_OPTS=${GRUB_OPTS:""} # - --target=i386-pc is invalid for non-i386/amd64 architectures # - and for UEFI too. # GRUB_OPTS="$GRUB_OPTS --target=i386-pc" +if [[ ! $GRUB_OPTS == *--target* ]]; then + # /sys/ comes from the host machine. If the host machine is using EFI + # but the image being built doesn't have EFI boot-images installed we + # should set the --target to use a BIOS-based boot-image. + # + # * --target tells grub what's the target platform + # * the boot images are placed in /usr/lib/grub/- + # * i386-pc is used for BIOS-based machines + # http://www.gnu.org/software/grub/manual/grub.html#Installation + # + if [ -d /sys/firmware/efi ]; then + if [ ! -d /usr/lib/grub/*-efi ]; then + case $ARCH in + "x86_64"|"amd64") + GRUB_OPTS="$GRUB_OPTS --target=i386-pc" + ;; + "i386") + target=i386-pc + if [ -e /proc/device-tree ]; then + for x in /proc/device-tree/*; do + if [ -e "$x" ]; then + target="i386-ieee1275" + fi + done + fi + GRUB_OPTS="$GRUB_OPTS --target=$target" + ;; + esac + fi + fi +fi + $GRUBNAME --modules="biosdisk part_msdos" $GRUB_OPTS $BOOT_DEV + # This might be better factored out into a per-distro 'install-bootblock' # helper. if [ -f "/boot/grub/grub.cfg" ] ; then