################################################################################
set -e
+set -u
BOOTX64="${target}/boot/bootx64.efi"
+BOOTX32="${target}/boot/bootia32.efi"
EFI_IMG="${target}/boot/efi.img"
TMP_CONFIG="${target}/tmp/grub_config_efi"
EOF
BOOTX64="${BOOTX64##${target}}"
+BOOTX32="${BOOTX32##${target}}"
EFI_IMG="${EFI_IMG##${target}}"
TMP_CONFIG="${TMP_CONFIG##${target}}"
echo "/usr/lib/grub/x86_64-efi/moddep.lst could not be found, skipping."
echo "NOTE: grub-efi-amd64-bin not installed?"
fi
+elif ifclass I386 ; then
+ if [ -r "${target}"/usr/lib/grub/i386-efi/moddep.lst ] ; then
+ ARCHS+=(i386-efi)
+ ADDITIONAL_MODULES[i386-efi]="efi_gop efi_uga"
+ else
+ echo "/usr/lib/grub/i386-efi/moddep.lst could not be found, skipping."
+ echo "NOTE: grub-efi-ia32 not installed?"
+ fi
fi
-BOOTX64="${BOOTX64##${target}}"
-EFI_IMG="${EFI_IMG##${target}}"
-TMP_CONFIG="${TMP_CONFIG##${target}}"
-
for arch in ${ARCHS[@]} ; do
-$ROOTCMD grub-mkimage -O $arch -o /boot/$arch.img --prefix=/boot/grub/ --config="$TMP_CONFIG" \
- echo iso9660 part_msdos search_fs_file test \
- fat ext2 reiserfs xfs btrfs squash4 part_gpt lvm \
- ${ADDITIONAL_MODULES[$arch]}
+ $ROOTCMD grub-mkimage -O $arch -o /boot/$arch.img --prefix=/boot/grub/ --config="$TMP_CONFIG" \
+ echo iso9660 part_msdos search_fs_file test \
+ fat ext2 reiserfs xfs btrfs squash4 part_gpt lvm \
+ ${ADDITIONAL_MODULES[$arch]}
done
if [ -f "${target}/boot/i386-pc.img" ] ; then
mv "${target}/boot/x86_64-efi.img" "${target}/${BOOTX64}"
fi
+if [ -f "${target}/boot/i386-efi.img" ] ; then
+ mv "${target}/boot/i386-efi.img" "${target}/${BOOTX32}"
+fi
+
if ifclass AMD64 ; then
if ! [ -r "${target}/${BOOTX64}" ] ; then
- echo "Can not access grub efi image." >&2
+ echo "Can not access grub efi image ${BOOTX64}." >&2
exit 1
fi
- SIZE=$(du --apparent-size -sk "${target}/${BOOTX64}" | awk -F" " '{print $1}')
- SIZE=$(((($SIZE / 32 )+2)*32))
-
- dd if=/dev/zero of="${target}/${EFI_IMG}" bs=1k count="$SIZE" 2>/dev/null
+ dd if=/dev/zero of="${target}/${EFI_IMG}" bs=4M count=1 2>/dev/null
$ROOTCMD mkfs.vfat -n GRML "$EFI_IMG" >/dev/null
$ROOTCMD mmd -i "$EFI_IMG" ::EFI
$ROOTCMD mmd -i "$EFI_IMG" ::EFI/BOOT
$ROOTCMD mcopy -i "$EFI_IMG" "$BOOTX64" ::EFI/BOOT/bootx64.efi >/dev/null
- echo "Generated EFI image $BOOTX64"
- echo "Generated bootx64 image $EFI_IMG"
+ echo "Generated 64-bit EFI image $BOOTX64"
+elif ifclass I386 ; then
+ if ! [ -r "${target}/${BOOTX32}" ] ; then
+ echo "Can not access grub efi image ${BOOTX32}." >&2
+ exit 1
+ fi
+
+ dd if=/dev/zero of="${target}/${EFI_IMG}" bs=4M count=1 2>/dev/null
+ $ROOTCMD mkfs.vfat -n GRML "$EFI_IMG" >/dev/null
+ $ROOTCMD mmd -i "$EFI_IMG" ::EFI
+ $ROOTCMD mmd -i "$EFI_IMG" ::EFI/BOOT
+ $ROOTCMD mcopy -i "$EFI_IMG" "$BOOTX32" ::EFI/BOOT/bootia32.efi >/dev/null
+ echo "Generated 32-bit EFI image $BOOTX32"
fi
+echo "Generated EFI image $EFI_IMG"
+
rm -f "${target}/${TMP_CONFIG}"
echo "Generated Grub images"
-
## END OF FILE #################################################################
# vim:ft=sh expandtab ai tw=80 tabstop=4 shiftwidth=2
# EFI boot files
if [ -r "${CHROOT_OUTPUT}/boot/efi.img" -a -r "${CHROOT_OUTPUT}/boot/bootx64.efi" ] ; then
- einfo "Moving EFI boot files into ISO path."
- log "Moving EFI boot files into ISO path."
- RC=$0
- mv "${CHROOT_OUTPUT}/boot/efi.img" "${BUILD_OUTPUT}/boot/" || RC=$?
- mkdir -p "${BUILD_OUTPUT}/efi/boot/" || RC=$?
- mv "${CHROOT_OUTPUT}/boot/bootx64.efi" "${BUILD_OUTPUT}/efi/boot/bootx64.efi" || RC=$?
- eend $?
+ einfo "Moving 64-bit EFI boot files into ISO path."
+ log "Moving 64-bit EFI boot files into ISO path."
+ RC=$0
+ mv "${CHROOT_OUTPUT}/boot/efi.img" "${BUILD_OUTPUT}/boot/" || RC=$?
+ mkdir -p "${BUILD_OUTPUT}/efi/boot/" || RC=$?
+ mv "${CHROOT_OUTPUT}/boot/bootx64.efi" "${BUILD_OUTPUT}/efi/boot/bootx64.efi" || RC=$?
+ eend $?
+ elif [ -r "${CHROOT_OUTPUT}/boot/efi.img" -a -r "${CHROOT_OUTPUT}/boot/bootia32.efi" ] ; then
+ einfo "Moving 32-bit EFI boot files into ISO path."
+ log "Moving 32-bit EFI boot files into ISO path."
+ RC=$0
+ mv "${CHROOT_OUTPUT}/boot/efi.img" "${BUILD_OUTPUT}/boot/" || RC=$?
+ mkdir -p "${BUILD_OUTPUT}/efi/boot/" || RC=$?
+ mv "${CHROOT_OUTPUT}/boot/bootia32.efi" "${BUILD_OUTPUT}/efi/boot/bootia32.efi" || RC=$?
+ eend $?
+ else
+ ewarn "No EFI boot files found, skipping." ; eend 0
fi
[ -n "$TEMPLATE_DIRECTORY" ] || TEMPLATE_DIRECTORY='/usr/share/grml-live/templates'
cp -a "${CHROOT_OUTPUT}"/boot/grub/core.img "${BUILD_OUTPUT}"/boot/grub/
cp -a "${CHROOT_OUTPUT}"/boot/grub/grub.img "${BUILD_OUTPUT}"/boot/grub/
- # copy modules for UEFI grub
+ # copy modules for UEFI grub, 64-bit
mkdir -p "${BUILD_OUTPUT}"/boot/grub/x86_64-efi/
cp -a "${CHROOT_OUTPUT}"/usr/lib/grub/x86_64-efi/*.{mod,lst} "${BUILD_OUTPUT}"/boot/grub/x86_64-efi/
+ # copy modules for UEFI grub, 32-bit
+ mkdir -p "${BUILD_OUTPUT}"/boot/grub/i386-efi/
+ cp -a "${CHROOT_OUTPUT}"/usr/lib/grub/i386-efi/*.{mod,lst} "${BUILD_OUTPUT}"/boot/grub/i386-efi/
+
if ! [ -d "${TEMPLATE_DIRECTORY}"/GRML ] ; then
log "Error: ${TEMPLATE_DIRECTORY}/GRML does not exist. Exiting."
eerror "Error: ${TEMPLATE_DIRECTORY}/GRML does not exist. Exiting." ; eend 1
if [ "$BOOT_METHOD" = "isolinux" ] ; then
BOOT_ARGS="-no-emul-boot -boot-load-size 4 -boot-info-table -b boot/isolinux/isolinux.bin -c boot/isolinux/boot.cat"
+ if [ "$HYBRID_METHOD" = "isohybrid" ] ; then
+ EFI_ARGS="-isohybrid-mbr /usr/lib/ISOLINUX/isohdpfx.bin -eltorito-alt-boot -e boot/efi.img -no-emul-boot -isohybrid-gpt-basdat"
+ fi
elif [ "$BOOT_METHOD" = "grub2" ] ; then
BOOT_ARGS="-no-emul-boot -boot-load-size 4 -b boot/grub/toriboot.bin"
fi
echo 1 16 | mksh "${SCRIPTS_DIRECTORY}/bootgrub.mksh" -B 11 | \
dd of=boot/grub/toriboot.bin conv=notrunc 2>/dev/null
fi
- log "$MKISOFS -V '${GRML_NAME} ${VERSION}' -publisher 'grml-live | grml.org' -l -r -J $BOOT_ARGS -o ${ISO_OUTPUT}/${ISO_NAME} ."
+ log "$MKISOFS -V '${GRML_NAME} ${VERSION}' -publisher 'grml-live | grml.org' -l -r -J $BOOT_ARGS $EFI_ARGS -no-pad -o ${ISO_OUTPUT}/${ISO_NAME} ."
$MKISOFS -V "${GRML_NAME} ${VERSION}" -publisher 'grml-live | grml.org' \
- -l -r -J $BOOT_ARGS -no-pad \
+ -l -r -J $BOOT_ARGS $EFI_ARGS -no-pad \
-o "${ISO_OUTPUT}/${ISO_NAME}" . ; RC=$?
# both of these need core.img there, so it’s easier to write it here
if [ "$BOOT_METHOD" = "grub2" ] || [ "$HYBRID_METHOD" = "grub2" ]; then
eend $?
fi
elif [ "$HYBRID_METHOD" = "isohybrid" ] ; then
- if ! which isohybrid >/dev/null 2>&1 ; then
- bailout 12 "isohybrid binary not found - please install syslinux/syslinux-common/syslinux-utils"
- else
- log "Creating hybrid ISO file with isohybrid method"
- einfo "Creating hybrid ISO file with isohybrid method"
- # Notes for consideration:
- # "-entry 4 -type 1c"
- # * using 4 as the partition number is supposed to help with BIOSes
- # that only support USB-Zip boot
- # * using 1c (i.e. hidden FAT32 LBA), instead of the default 0x17
- # (hidden NTFS, IIRC), as the partition type is sometimes needed
- # to get the BIOS even look at the partition created by isohybrid
- if isohybrid --help | grep -q -- --uefi ; then
- if echo $CLASSES | grep -qw I386 ; then
- log "Detected uefi support for isohybrid but 32bit systems do not support it, ignoring."
- einfo "Detected uefi support for isohybrid but 32bit systems do not support it, ignoring."
- else
- log "Detected uefi support for isohybrid, enabling"
- einfo "Detected uefi support for isohybrid, enabling"
- ISOHYBRID_OPTIONS=--uefi
- fi
- fi
-
- log "isohybrid $ISOHYBRID_OPTIONS ${ISO_OUTPUT}/${ISO_NAME}"
- isohybrid $ISOHYBRID_OPTIONS "${ISO_OUTPUT}/${ISO_NAME}"
- eend $?
- fi
+ : # nothing to do, handled via $MKISOFS $EFI_ARGS already
else
bailout 12 "Unknown HYBRID_METHOD [${HYBRID_METHOD}]. Supported values: disable, isohybrid, grub2, manifold"
fi