summaryrefslogtreecommitdiff
path: root/config/binary_local-hooks/grub2-efi
blob: 97b072141bd6c39ea20fa9eccabc25c217e346d9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#!/bin/bash

case "$LB_BOOTLOADER" in
grub2|burg)
	;;
*)
	exit 0
	;;
esac

bit="$(file chroot/bin/true | grep -q 'ELF 64-bit' && echo 64 || echo 32)"
case "$bit" in
64)
	platform=x86_64-efi
	efi_name=x64
	shell_dir=X64
	;;
32)
	platform=i386-efi
	efi_name=ia32
	shell_dir=Ia32
	;;
esac
modules="search iso9660 configfile normal memdisk tar part_msdos fat"

workdir=

cleanup () {
        [ -z "$workdir" ] || rm -rf "$workdir"
}
trap cleanup EXIT HUP INT QUIT TERM

workdir="$(mktemp -d efi-image.XXXXXX)"

# Skeleton configuration file which finds the real boot disk.
mkdir -p "$workdir/boot/grub"
cat >"$workdir/boot/grub/grub.cfg" <<EOF
search --file --set=root /.disk/info
set prefix=(\$root)/boot/grub
source \$prefix/$platform/grub.cfg
EOF

mkdir -p "binary/boot/grub/$platform"
mkdir -p "binary/efi/boot"

#(for i in $(cat chroot/usr/lib/grub/$platform/partmap.lst); do
#        echo "insmod $i"
# done; \
echo "set efi_arch=$efi_name
source /boot/grub/grub-efi.cfg" >"binary/boot/grub/$platform/grub.cfg"

# fix module order ("gzio" should be loaded before "normal", otherwise a "prefix not set" error message will pop up on boot)
sed -i.orig -e '/^normal:/{/gzio/!{s/$/ gzio/}}' chroot/usr/lib/grub/$platform/moddep.lst

# Build the core image.
(cd "$workdir"; tar -cf - boot) > chroot/memdisk.$$.img
chroot chroot grub-mkimage -O "$platform" -m "/memdisk.$$.img" \
        -o "/boot$efi_name.efi" -p '(memdisk)/boot/grub' $modules
rm chroot/memdisk.$$.img
mv "chroot/boot$efi_name.efi" "binary/efi/boot/boot$efi_name.efi"

# restore original module order
mv chroot/usr/lib/grub/$platform/moddep.lst{.orig,}

# Copy over GRUB modules, except for those already built in.
cp -a "chroot/usr/lib/grub/$platform"/*.lst "binary/boot/grub/$platform/"
builtin_modules="$(m="$modules"; while [ "$m" ] && echo $m
	do m=$(sed -ne "s/^\($(echo -n $m | sed 's/ /\\|/g')\):\(.*\)$/\2/p" "chroot/usr/lib/grub/$platform"/moddep.lst)
	done | fmt -w1 | sort -u)"
for x in "chroot/usr/lib/grub/$platform"/*.mod; do
	case $(basename "$x" .mod) in
	    affs|afs|afs_be|befs|befs_be|minix|nilfs2|sfs|zfs|zfsinfo)
		# unnecessary filesystem modules
		;;
	    example_functional_test|functional_test|hello)
		# other cruft
		;;
	    *)
		grep -wq $(basename "$x" .mod) <<<"$builtin_modules" || cp -a "$x" "binary/boot/grub/$platform/"
		;;
	esac
done

# include EFI shell
[ -f binary/efi/boot/shell$efi_name.efi ] || \
wget -O binary/efi/boot/shell$efi_name.efi "https://github.com/tianocore/edk2/raw/master/EdkShellBinPkg/FullShell/$shell_dir/Shell_Full.efi"