diff options
author | Adrian Gibanel Lopez <adrian.gibanel@btactic.com> | 2016-01-18 03:21:39 +0000 |
---|---|---|
committer | Adrian Gibanel Lopez <adrian.gibanel@btactic.com> | 2016-07-31 15:09:13 +0200 |
commit | 7becd08e4d721ee2c187e82fba8168d76dfb33aa (patch) | |
tree | be4431f9e343b1e81cc4a32606471f760c03f19a /scripts/build/binary_grub-efi | |
parent | 9cebad25f98976d9bb0a42fcbf76392a26503d6a (diff) | |
download | vyos-live-build-7becd08e4d721ee2c187e82fba8168d76dfb33aa.tar.gz vyos-live-build-7becd08e4d721ee2c187e82fba8168d76dfb33aa.zip |
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.
Diffstat (limited to 'scripts/build/binary_grub-efi')
-rwxr-xr-x | scripts/build/binary_grub-efi | 255 |
1 files changed, 255 insertions, 0 deletions
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 <adrian15sgd@gmail.com> +## +## 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 <<END +#!/bin/sh + +set -e + +PRE_EFI_IMAGE_PATH="${PATH}" +if [ ! -e "${LIVE_BUILD}" ] ; then + LIVE_BUILD_PATH="/usr/lib/live/build" +else + LIVE_BUILD_PATH="${LIVE_BUILD}/scripts/build" +fi + +PATH="${PATH}:\${LIVE_BUILD_PATH}" # Make sure grub-cpmodules is used as if it was installed in the system + +"\${LIVE_BUILD_PATH}/efi-image" "${_CHROOT_DIR}/grub-efi-temp-x86_64-efi/" "x86_64-efi" "x64" "debian-live/amd64" +mkdir -p ${_CHROOT_DIR}/grub-efi-temp/efi/boot +mcopy -n -i ${_CHROOT_DIR}/grub-efi-temp-x86_64-efi/efi.img '::efi/boot/boot*.efi' ${_CHROOT_DIR}/grub-efi-temp/efi/boot +cp -r "${_CHROOT_DIR}"/grub-efi-temp-x86_64-efi/* "${_CHROOT_DIR}/grub-efi-temp/" + +"\${LIVE_BUILD_PATH}/efi-image" "${_CHROOT_DIR}/grub-efi-temp-i386-efi/" "i386-efi" "ia32" "debian-live/i386" +PATH="\${PRE_EFI_IMAGE_PATH}" +mkdir -p ${_CHROOT_DIR}/grub-efi-temp/efi/boot +mcopy -n -i ${_CHROOT_DIR}/grub-efi-temp-i386-efi/efi.img '::efi/boot/boot*.efi' ${_CHROOT_DIR}/grub-efi-temp/efi/boot +cp -r "${_CHROOT_DIR}"/grub-efi-temp-i386-efi/* "${_CHROOT_DIR}/grub-efi-temp/" + +# The code below is adapted from tools/boot/jessie/boot-x86 +# in debian-cd + +# Stuff the EFI boot files into a FAT filesystem, making it as +# small as possible. 24KiB headroom seems to be enough; +# (x+31)/32*32 rounds up to multiple of 32. +# This is the same as in efi-image, but we need to redo it here in +# the case of a multi-arch amd64/i386 image + +size=0 +for file in ${_CHROOT_DIR}/grub-efi-temp/efi/boot/boot*.efi; do + size=\$((\$size + \$(stat -c %s "\$file"))) +done + +blocks=\$(((\$size / 1024 + 55) / 32 * 32 )) + +rm -f ${_CHROOT_DIR}/grub-efi-temp/boot/grub/efi.img +mkfs.msdos -C "${_CHROOT_DIR}/grub-efi-temp/boot/grub/efi.img" \$blocks >/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 |