Support EFI on 32-bit systems, increase EFI image size + switch from isohybrid to...
[grml-live.git] / etc / grml / fai / config / scripts / GRMLBASE / 45-grub-images
1 #!/bin/bash
2 # Filename:      ${GRML_FAI_CONFIG}/config/scripts/GRMLBASE/45-efi
3 # Purpose:       create grub image for use in ISO for EFI boot
4 # Authors:       grml-team (grml.org), (c) Michael Prokop <mika@grml.org>
5 # Bug-Reports:   see http://grml.org/bugs/
6 # License:       This file is licensed under the GPL v2 or any later version.
7 ################################################################################
8
9 set -e
10 set -u
11
12
13 BOOTX64="${target}/boot/bootx64.efi"
14 BOOTX32="${target}/boot/bootia32.efi"
15 EFI_IMG="${target}/boot/efi.img"
16 TMP_CONFIG="${target}/tmp/grub_config_efi"
17
18 rm -f "$BOOTX64" "$EFI_IMG" "$TMP_CONFIG"
19
20 cat > "$TMP_CONFIG" <<EOF
21 search.file /conf/bootid.txt root
22 set prefix=(\$root)/boot/grub
23 insmod normal
24 normal
25 echo "E: Could not find root device!"
26 EOF
27
28 BOOTX64="${BOOTX64##${target}}"
29 BOOTX32="${BOOTX32##${target}}"
30 EFI_IMG="${EFI_IMG##${target}}"
31 TMP_CONFIG="${TMP_CONFIG##${target}}"
32
33 ARCHS=(i386-pc)
34
35 declare -A ADDITIONAL_MODULES
36 ADDITIONAL_MODULES[i386-pc]="biosdisk"
37
38 if ifclass AMD64 ; then
39   if [ -r "${target}"/usr/lib/grub/x86_64-efi/moddep.lst ] ; then
40     ARCHS+=(x86_64-efi)
41     ADDITIONAL_MODULES[x86_64-efi]="efi_gop efi_uga"
42   else
43     echo "/usr/lib/grub/x86_64-efi/moddep.lst could not be found, skipping."
44     echo "NOTE: grub-efi-amd64-bin not installed?"
45   fi
46 elif ifclass I386 ; then
47   if [ -r "${target}"/usr/lib/grub/i386-efi/moddep.lst ] ; then
48     ARCHS+=(i386-efi)
49     ADDITIONAL_MODULES[i386-efi]="efi_gop efi_uga"
50   else
51     echo "/usr/lib/grub/i386-efi/moddep.lst could not be found, skipping."
52     echo "NOTE: grub-efi-ia32 not installed?"
53   fi
54 fi
55
56 for arch in ${ARCHS[@]} ; do
57   $ROOTCMD grub-mkimage -O $arch -o /boot/$arch.img --prefix=/boot/grub/ --config="$TMP_CONFIG" \
58     echo iso9660 part_msdos search_fs_file test \
59     fat ext2 reiserfs xfs btrfs squash4 part_gpt lvm \
60     ${ADDITIONAL_MODULES[$arch]}
61 done
62
63 if [ -f "${target}/boot/i386-pc.img" ] ; then
64   mv "${target}/boot/i386-pc.img" "${target}/boot/grub/grub.img"
65 fi
66
67 if [ -f "${target}/boot/x86_64-efi.img" ] ; then
68   mv "${target}/boot/x86_64-efi.img" "${target}/${BOOTX64}"
69 fi
70
71 if [ -f "${target}/boot/i386-efi.img" ] ; then
72   mv "${target}/boot/i386-efi.img" "${target}/${BOOTX32}"
73 fi
74
75 if ifclass AMD64 ; then
76   if ! [ -r "${target}/${BOOTX64}" ] ; then
77     echo "Can not access grub efi image ${BOOTX64}." >&2
78     exit 1
79   fi
80
81   dd if=/dev/zero of="${target}/${EFI_IMG}" bs=4M count=1 2>/dev/null
82   $ROOTCMD mkfs.vfat -n GRML "$EFI_IMG" >/dev/null
83   $ROOTCMD mmd -i "$EFI_IMG" ::EFI
84   $ROOTCMD mmd -i "$EFI_IMG" ::EFI/BOOT
85   $ROOTCMD mcopy -i "$EFI_IMG" "$BOOTX64" ::EFI/BOOT/bootx64.efi >/dev/null
86   echo "Generated 64-bit EFI image $BOOTX64"
87 elif ifclass I386 ; then
88   if ! [ -r "${target}/${BOOTX32}" ] ; then
89     echo "Can not access grub efi image ${BOOTX32}." >&2
90     exit 1
91   fi
92
93   dd if=/dev/zero of="${target}/${EFI_IMG}" bs=4M count=1 2>/dev/null
94   $ROOTCMD mkfs.vfat -n GRML "$EFI_IMG" >/dev/null
95   $ROOTCMD mmd -i "$EFI_IMG" ::EFI
96   $ROOTCMD mmd -i "$EFI_IMG" ::EFI/BOOT
97   $ROOTCMD mcopy -i "$EFI_IMG" "$BOOTX32" ::EFI/BOOT/bootia32.efi >/dev/null
98   echo "Generated 32-bit EFI image $BOOTX32"
99 fi
100
101 echo "Generated EFI image $EFI_IMG"
102
103 rm -f "${target}/${TMP_CONFIG}"
104 echo "Generated Grub images"
105
106 ## END OF FILE #################################################################
107 # vim:ft=sh expandtab ai tw=80 tabstop=4 shiftwidth=2