/usr/sbin/drbl-gen-grub-efi-nb is in drbl 2.20.11-4.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
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 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 | #!/bin/bash
# License: GPL
# Author: Steven Shiau <steven _at_ nchc org tw>, Ceasar Sun <ceasar _at_ nchc ogr tw>
# Description: Program to prepare grub uEFI network booting image
#
DRBL_SCRIPT_PATH="${DRBL_SCRIPT_PATH:-/usr/share/drbl}"
. $DRBL_SCRIPT_PATH/sbin/drbl-conf-functions
. /etc/drbl/drbl-ocs.conf
. $DRBL_SCRIPT_PATH/sbin/ocs-functions
# Settings
grub_mkimg_compress_opt="-C xz"
#efi_required_mod="part_gpt part_msdos hfsplus fat ext2 ntfs btrfs normal chain boot configfile linux appleldr minicmd multiboot iso9660 acpi efi_gop efi_uga elf loadbios loopback video_fb usb search fixvideo png gfxterm gfxterm_background gfxterm_menu echo videotest video reboot halt gfxmenu gettext tftp efinet net gzio xzio"
# Rerfer to the file systems list in /usr/lib/grub/x86_64-efi/fs.lst. This is for client's local disk boot.
fs_mod="ext2 xfs reiserfs jfs hfsplus fat ntfs"
efi_required_mod="normal tftp efinet chain echo net gzio xzio linux \
efi_gop efi_uga png gfxterm gfxterm_background gfxterm_menu \
serial part_gpt part_msdos boot multiboot progress search \
$fs_mod configfile test sleep tr reboot halt"
prog="$0"
################
##### Main #####
################
check_if_root
ask_and_load_lang_set
# Find the grub2 commands: grub-mkimage, grub-mknetdir
if type grub2-mkimage >/dev/null 2>&1; then
GRUB_MKIMG=grub2-mkimage
elif type grub-mkimage >/dev/null 2>&1; then
GRUB_MKIMG=grub-mkimage
else
[ "$BOOTUP" = "color" ] && $SETCOLOR_WARNING
echo "Command grub2-mkimage or grub-mkimage not found!"
[ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
echo "Skip creating grub2 uEFI network boot image."
exit 1
fi
if type grub2-mknetdir >/dev/null 2>&1; then
GRUB_MKNETD=grub2-mknetdir
elif type grub-mknetdir >/dev/null 2>&1; then
GRUB_MKNETD=grub-mknetdir
else
[ "$BOOTUP" = "color" ] && $SETCOLOR_WARNING
echo "Command grub2-mknetdir or grub-mknetdir not found!"
[ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
echo "Skip creating grub2 uEFI network boot modules."
exit 1
fi
#
grub_efi_tmpd="$(mktemp -d /tmp/grub-efi.XXXXXX)"
# Prepare a grub.cfg so that the eltorito image could find it.
# Because if/elif/else/fi is only supported in normal module, and in this embedded, preconfig only the command in rescue mode is supported, here we use this unique, subtle way. i.e.
# Quoted from Andrei Borzenkov:
# "if" is not external command - it must be recognized and processed by
# script parser and at this point rescue script parser is still active.
# OTOH "configfile" is more or less standard external command. So first
# "if" results in error, then "configfile" succeeds. configfile
# implicitly loads and calls normal.mod so it appears to work. Although
# not exactly as envisioned :)
# //NOTE// So when configfile command succeeds, it won't return to this
# preconfig file. Therefore there is no need to have if/elif/else/fi
# commands.
# For more details, check:
# http://lists.gnu.org/archive/html/help-grub/2015-09/msg00035.html
cat <<-GRUB_END > $grub_efi_tmpd/grub-header.cfg
set prefix=(tftp)/grub-efi.cfg
echo "Grub CPU and platform: \$grub_cpu, \$grub_platform"
echo 'Network status: '
net_ls_cards
net_ls_addr
net_ls_routes
tr --set pretty_mac x: x- \$net_default_mac
echo "Loading config file \$prefix/grub.cfg-01-\$pretty_mac..."
configfile \$prefix/grub.cfg-01-\$pretty_mac
echo "Loading config file: \$prefix/grub.cfg"
configfile \$prefix/grub.cfg
echo "Could not find config file \$prefix/grub.cfg-\$pretty_mac or \$prefix/grub.cfg!"
sleep 15
GRUB_END
if [ -z "$GRUB_EFINB_DIR" ]; then
[ "$BOOTUP" = "color" ] && $SETCOLOR_FAILURE
echo "\"\$GRUB_EFINB_DIR\" _NOT_ defined!"
[ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
echo "$msg_program_stop!"
exit 1
fi
echo "Removing the old $GRUB_EFINB_DIR if it exists..."
if [ -d "$GRUB_EFINB_DIR" ]; then
rm -rf $GRUB_EFINB_DIR
fi
mkdir -p $GRUB_EFINB_DIR
# Get the grub version
grub_v="$(LC_ALL=C $GRUB_MKIMG --version | awk -F" " '{print $NF}')"
if [ -n "$grub_v" ]; then
echo "$grub_v" > $pxecfg_pd/GRUB_VERSION
else
[ "$BOOTUP" = "color" ] && $SETCOLOR_WARNING
echo "Warngin! Grub version _NOT_ found!"
[ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
fi
# Prepare some files, e.g. background img and fonts
# Unicode is located at:
# Debian: /usr/share/grub/unicode.pf2
# CetnOS: /boot/efi/EFI/centos/fonts/unicode.pf2
echo "Preparing background img and font..."
unicode_font="$(LC_ALL=C find /usr/share/grub/ /boot/efi/EFI/ -name "unicode.pf2" -print 2>/dev/null | uniq | head -n 1)"
if [ -n "$unicode_font" ]; then
cp -fv $unicode_font $pxecfg_pd/
fi
cp -fv $grub_bg_img $pxecfg_pd/
# Generate the template grub.cfg
gen-grub-efi-nb-menu
# For x86-64 arch, we create bootx64.efi and bootia32.efi.
# For i386 arch, we only create bootia32.efi.
# First we find the installed OS arch
sys_arch="$(LC_ALL=C getconf LONG_BIT)"
dest_bootloader=""
case "$sys_arch" in
32) echo "System architecture is 32-bit."
dest_bootloader="i386"
;;
64) echo "System architecture is 64-bit."
dest_bootloader="i386 x86_64";;
*)
[ "$BOOTUP" = "color" ] && $SETCOLOR_FAILURE
echo "Unknown system architecture in drbl-gen-grub-efi-nb!"
[ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
echo "$msg_program_stop!"
exit 1
esac
for i in $dest_bootloader; do
export EFI_ARCH=$i
case "$EFI_ARCH" in
i386)
if [ ! -e /usr/lib/grub/i386-efi/moddep.lst ]; then
# On some system, like CentOS 7, there is no i386 efi from grub2.
continue
fi
out_f="$pxecfg_pd/bootia32.efi" ;;
x86_64) out_f="$pxecfg_pd/bootx64.efi" ;;
esac
# Checking the required modules
for im in $efi_required_mod; do
if [ ! -e "/usr/lib/grub/$EFI_ARCH-efi/${im}.mod" ]; then
[ "$BOOTUP" = "color" ] && $SETCOLOR_WARNING
echo "Missing grub2 module ${im}.mod... Exluding ${im}.mod..."
[ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
efi_required_mod="$(echo $efi_required_mod | sed -r -e "s/$im //g")"
fi
done
echo "Creating the uEFI network booting bootable image $out_f..."
$GRUB_MKIMG $grub_mkimg_compress_opt -O ${EFI_ARCH}-efi -o $out_f --prefix='(tftp)/grub-efi.cfg/' -c $grub_efi_tmpd/grub-header.cfg $efi_required_mod
rc=$?
if [ "$rc" -ne 0 ]; then
# When grub-mkimage fails, an empty output file will still be created. We'd better to clean it.
rm -f $out_f
[ "$BOOTUP" = "color" ] && $SETCOLOR_WARNING
echo "Warning! Failed to create $out_f!"
echo "This server won't be able to serve uEFI network boot clients."
[ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
sleep 5
else
# Create a tag file
echo "Created by program \"$prog\" with command:" > ${out_f}.info
echo "$GRUB_MKIMG $grub_mkimg_compress_opt -O ${EFI_ARCH}-efi -o $out_f --prefix='(tftp)/grub-efi.cfg/' -c $grub_efi_tmpd/grub-header.cfg $efi_required_mod" >> ${out_f}.info
echo "The contents of $grub_efi_tmpd/grub-header.cfg:" >> ${out_f}.info
echo "$msg_delimiter_star_line" >> ${out_f}.info
cat $grub_efi_tmpd/grub-header.cfg >> ${out_f}.info
echo "$msg_delimiter_star_line" >> ${out_f}.info
fi
done
# Suppress the output to avoid confusion.
echo "Preparing the grub modules in $GRUB_EFINB_DIR..."
$GRUB_MKNETD --net-directory=$GRUB_EFINB_DIR --subdir=/ >/dev/null
echo "The uEFI network booting is ready."
# Clean the temp dir
if [ -e "$grub_efi_tmpd" -a -n "$(echo $grub_efi_tmpd | grep -E "grub-efi")" ]; then
rm -rf $grub_efi_tmpd
fi
|