From 7becd08e4d721ee2c187e82fba8168d76dfb33aa Mon Sep 17 00:00:00 2001 From: Adrian Gibanel Lopez Date: Mon, 18 Jan 2016 03:21:39 +0000 Subject: Added EFI support by the means of grub-efi This work is based on debian-cd team work and uses, as much as possible, the same mkisofs options than the Debian Installation CD disk does. It assumes that /boot/grub/grub.cfg (and other design items) is generated by: binary_loopback_cfg . It relies on efi-image and grub-cpmodules being setup as build scripts on live-build package. In the future event of these two files being moved to a binary package (they are originally from: src: live-installer) the binary_grub-efi script would have to be rewritten to take the new paths into account. --- scripts/build/binary | 1 + scripts/build/binary_grub-efi | 255 ++++++++++++++++++++++++++++++++++++++++++ scripts/build/binary_iso | 9 ++ 3 files changed, 265 insertions(+) create mode 100755 scripts/build/binary_grub-efi (limited to 'scripts') diff --git a/scripts/build/binary b/scripts/build/binary index 56c7bf83a..7b0d74379 100755 --- a/scripts/build/binary +++ b/scripts/build/binary @@ -69,6 +69,7 @@ lb binary_loadlin ${@} lb binary_win32-loader ${@} lb binary_includes ${@} lb binary_hooks ${@} +lb binary_grub-efi ${@} lb binary_checksums ${@} if [ "${LB_BUILD_WITH_CHROOT}" != "true" ] diff --git a/scripts/build/binary_grub-efi b/scripts/build/binary_grub-efi new file mode 100755 index 000000000..384135b15 --- /dev/null +++ b/scripts/build/binary_grub-efi @@ -0,0 +1,255 @@ +#!/bin/sh + +## live-build(7) - System Build Scripts +## Copyright (C) 2016 Adrian Gibanel Lopez +## +## This program comes with ABSOLUTELY NO WARRANTY; for details see COPYING. +## This is free software, and you are welcome to redistribute it +## under certain conditions; see COPYING for details. + + +set -e + +# Including common functions +[ -e "${LIVE_BUILD}/scripts/build.sh" ] && . "${LIVE_BUILD}/scripts/build.sh" || . /usr/lib/live/build.sh + +# Setting static variables +DESCRIPTION="$(Echo 'prepares and installs Grub based EFI support into binary')" +HELP="" +USAGE="${PROGRAM} [--force]" + +Arguments "${@}" + +# Reading configuration files +Read_conffiles config/all config/common config/bootstrap config/chroot config/binary config/source +Set_defaults + +Check_Any_Bootloader_Role "grub-efi" + +Echo_message "Begin preparing Grub based EFI support..." + +# Requiring stage file +Require_stagefile .build/config .build/bootstrap + +# Checking stage file +Check_stagefile .build/binary_grub-efi + +# Checking lock file +Check_lockfile .lock + +# Creating lock file +Create_lockfile .lock + +# Check architecture +Check_architectures amd64 i386 +Check_crossarchitectures + +case "${LB_ARCHITECTURES}" in + amd64) + _EFI_TYPE=efi64 + ;; + i386) + _EFI_TYPE=efi32 + ;; + *) + echo "ERROR: can't provide EFI boot support to architecture ${LB_ARCHITECTURES}" >&2 + exit 1 + ;; +esac + + +# Checking depends +case "${LB_BUILD_WITH_CHROOT}" in + true) + _CHROOT_DIR="" + _SYSLINUX_EFI_DIR="chroot/usr/lib/SYSLINUX.EFI/$_EFI_TYPE" + _SYSLINUX_COMMON_DIR="chroot/usr/lib/syslinux/modules/$_EFI_TYPE" + + Check_package chroot /usr/lib/grub/x86_64-efi/configfile.mod grub-efi-amd64-bin + Check_package chroot /usr/lib/grub/i386-efi/configfile.mod grub-efi-ia32-bin + Check_package chroot /usr/bin/grub-mkimage grub-common + Check_package chroot /usr/bin/mcopy mtools + Check_package chroot /sbin/mkfs.msdos dosfstools + ;; + + false) + _CHROOT_DIR="chroot" + + if [ ! -e /usr/lib/grub/x86_64-efi ] + then + # grub-efi-amd64-bin + Echo_error "/usr/lib/grub/x86_64-efi - no such directory" + exit 1 + fi + + if [ ! -e /usr/lib/grub/i386-efi ] + then + # grub-efi-ia32-bin + Echo_error "/usr/lib/grub/i386-efi - no such directory" + exit 1 + fi + + if [ ! -e /usr/bin/grub-mkimage ] + then + # grub-common + Echo_error "/usr/bin/grub-mkimage - no such file." + exit 1 + fi + + if [ ! -e /usr/bin/mcopy ] + then + # mtools + Echo_error "/usr/bin/mcopy - no such file." + exit 1 + fi + + if [ ! -e /sbin/mkfs.msdos ] + then + # dosfstools + Echo_error "/sbin/mkfs.msdos - no such file." + exit 1 + fi + ;; +esac + + + + +case "${LB_INITRAMFS}" in + live-boot) + INITFS="live" + ;; + + *) + INITFS="" + ;; +esac + +# Setting destination directory +case "${LIVE_IMAGE_TYPE}" in + iso*|tar) + case "${LB_INITRAMFS}" in + live-boot) + DESTDIR_LIVE="binary/live" + ;; + + *) + DESTDIR_LIVE="binary/live" + ;; + esac + + DESTDIR_INSTALL="binary/install" + ;; + + hdd*|netboot) + Echo_warning "Bootloader in this image type not yet supported by live-build." + Echo_warning "This would produce a not bootable image, aborting (FIXME)." + exit 1 + ;; +esac + +# Restoring cache +Restore_cache cache/packages.binary + +# Installing depends +Install_package + +# Cleanup files that we generate +rm -rf binary/boot/efi.img binary/boot/grub/i386-efi/ binary/boot/grub/x86_64-efi + +# This is workaround till both efi-image and grub-cpmodules are put into a binary package +case "${LB_BUILD_WITH_CHROOT}" in + true) + if [ ! -e "${LIVE_BUILD}" ] ; then + LIVE_BUILD_PATH="/usr/lib/live/build" + else + LIVE_BUILD_PATH="${LIVE_BUILD}/scripts/build" + fi + mkdir -p chroot/${LIVE_BUILD_PATH} + cp "${LIVE_BUILD_PATH}/efi-image" "chroot/${LIVE_BUILD_PATH}" + cp "${LIVE_BUILD_PATH}/grub-cpmodules" "chroot/${LIVE_BUILD_PATH}" + ;; +esac +##### +cat >binary.sh </dev/null +mmd -i "${_CHROOT_DIR}/grub-efi-temp/boot/grub/efi.img" ::efi +mmd -i "${_CHROOT_DIR}/grub-efi-temp/boot/grub/efi.img" ::efi/boot +mcopy -o -i "${_CHROOT_DIR}/grub-efi-temp/boot/grub/efi.img" ${_CHROOT_DIR}/grub-efi-temp/efi/boot/boot*.efi \ + "::efi/boot" +END + +case "${LB_BUILD_WITH_CHROOT}" in + true) + mv binary.sh chroot/ + Chroot chroot "sh binary.sh" + rm -f chroot/binary.sh + + # Saving cache + Save_cache cache/packages.binary + + # Removing depends + Remove_package + ;; + + false) + sh binary.sh + rm -f binary.sh + ;; +esac + +# Remove unnecessary files +rm -f chroot/grub-efi-temp/bootnetia32.efi +rm -f chroot/grub-efi-temp/bootnetx64.efi + +mkdir -p binary +cp -r chroot/grub-efi-temp/* binary/ +rm -rf chroot/grub-efi-temp-x86_64-efi +rm -rf chroot/grub-efi-temp-i386-efi +rm -rf chroot/grub-efi-temp + +# We rely on: binary_loopback_cfg to generate grub.cfg and other configuration files + +# Creating stage file +Create_stagefile .build/binary_grub-efi diff --git a/scripts/build/binary_iso b/scripts/build/binary_iso index c063c703a..d4a872eb2 100755 --- a/scripts/build/binary_iso +++ b/scripts/build/binary_iso @@ -151,6 +151,15 @@ do XORRISO_OPTIONS="${XORRISO_OPTIONS} -no-emul-boot -boot-load-size 4 -boot-info-table" ;; + grub-efi) + if [ -e binary/boot/grub/efi.img ] + then + XORRISO_OPTIONS="${XORRISO_OPTIONS} -e boot/grub/efi.img -no-emul-boot" + XORRISO_OPTIONS="${XORRISO_OPTIONS} -isohybrid-gpt-basdat -isohybrid-apm-hfsplus" + else + Echo "No EFI boot code to include in the ISO" + fi + ;; *) Echo_warning "Bootloader on your architecture not yet supported by live-build." -- cgit v1.2.3