/
gen-efi
executable file
·102 lines (77 loc) · 3.51 KB
/
gen-efi
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#!/bin/sh -e
# rEFIt searches for /EFI/*/*.EFI, so care must be taken
# to preserve uppercase for case-sensitive filesystems
# i386-efi: most pre-2008 Macs (EFI 1.x + UGA)
# x86_64-efi: later Macs (EFI 1.x + GOP), all non-Macs (UEFI 2.x + GOP)
# Paths mandated for removable media devices by
# UEFI Spec 2.3.1 Err. A, Sec. 12.3.1.3 and 3.4.1.1
efidir=/EFI/BOOT
ia32name=BOOTIA32.EFI
x64name=BOOTx64.EFI
grubroot=/boot/grub
grubcfg=${grubroot}/grub.cfg
templcfg=${HOME}/config/grub.cfg
templearlycfg=${HOME}/config/grub-early.cfg
consolefont=euro.pf2
# Included modules (command.lst, partmap.lst, fs.lst, video.lst)
modules_core="normal configfile echo test true cat help minicmd sleep ls"
modules_fs="part_msdos part_gpt iso9660 fat ext2 hfsplus loopback"
modules_boot="boot linux halt reboot chain appleldr"
modules_arch="cpuid loadbios gfxterm efi_gop efi_uga fixvideo"
modules_io="search hashsum gcry_sha256 read"
modules="${modules_core} ${modules_fs} ${modules_boot} ${modules_arch} ${modules_io}"
# Building a memdisk (see grub2-mkstandalone (Savannah: #36772, #39796))
memdisk() {
local out="$1" arch="$2" mods="$3"
local build=`mktemp -d`
local memroot=${build}/boot/grub
local libdir=/usr/lib/grub moddir=${memroot}/${arch}
[ -n "${build}" ] || return 1
# Iteratively include all dependent modules
local oldmods= deps= modname=
while [ "${mods}" != "${oldmods}" ]; do
oldmods="${mods}"
for modname in ${mods}; do
deps=`sed -n "s/^${modname}://p" ${libdir}/${arch}/moddep.lst`
mods="${mods}${deps}"
done
mods=`echo ${mods} | tr ' ' '\n' | sort -u`
done
# Filter filesystems list, so that "search" doesn't try to load modules
mkdir -p ${moddir}
cp -p ${libdir}/${arch}/*.lst ${moddir}
sed -ri "/^(`echo ${mods} | tr ' ' '|'`)\$/b; d" ${moddir}/fs.lst
# NOTE: localization files go into ${memroot}/locale/*.mo
mods=`echo "${mods}" | sed "s:.*:${libdir}/${arch}/&.mod:"`
cp -p ${mods} ${moddir}
cat ${templearlycfg} \
| sed "/^##/d ; \
s@VERSION@${LVERSION}@" \
> ${memroot}/grub.cfg
# Compress all files (*.mod, *.lst, grub.cfg)
xz -C crc32 --lzma2=dict=1MiB `find ${memroot} -type f`
rename .xz "" `find ${memroot} -type f`
# Add bogus manifest (to be patched in mk-boot)
echo "replace_hash__________________________________________________01 /liberte${grubcfg}" > ${memroot}/grub.mf
echo "replace_hash__________________________________________________02 /liberte${grubcfg%.*}.mf" >> ${memroot}/grub.mf
tar -cf ${build}/memdisk.tar -C ${build} boot
# NOTE: -C has no effect (Savannah: #36770)
# grub2-mkstandalone -C xz -O ${arch} -o ${out} --compress=xz --install-modules="${modules}"
# --themes=none --fonts=none --locales=none (Savannah: #36772)
grub2-mkimage -C xz -O ${arch} -m ${build}/memdisk.tar \
-o ${out} memdisk tar xzio gcry_crc
rm -r ${build}
}
# Generate EFI binaries with modules in memdisk
mkdir -p /boot${efidir}
memdisk /boot${efidir}/${ia32name} i386-efi "${modules}"
memdisk /boot${efidir}/${x64name} x86_64-efi "${modules}"
# Copy gfxterm font
mkdir -p ${grubroot}
cp -p /usr/share/grub/${consolefont} ${grubroot}
# Substitute and copy template
cat ${templcfg} \
| sed "/^##/d ; \
s@VERSION@${LVERSION}@ ; \
s@CONSOLEFONT@${consolefont}@" \
> ${grubcfg}