This patch extends the generated grub.cfg so that it can use the external environment block when the variable env_block is defined. During boot, if env_block is set, grub.cfg builds a device path for it, exports the variable, and then loads its contents in addition to the normal grubenv file. When GRUB writes variables such as next_entry or saved_entry, the save commands are changed to write into env_block if it is set, and to fall back to the grubenv file otherwise. In this way the external environment block is used automatically, and existing commands like savedefault or save_env do not need to change. Signed-off-by: Michael Chang <mchang@suse.com> Reviewed-by: Neal Gompa <ngompa13@gmail.com> Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
377 lines
8.9 KiB
Bash
377 lines
8.9 KiB
Bash
#! /bin/sh
|
|
set -e
|
|
|
|
# grub-mkconfig helper script.
|
|
# Copyright (C) 2006,2007,2008,2009,2010 Free Software Foundation, Inc.
|
|
#
|
|
# GRUB is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# GRUB is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
prefix="@prefix@"
|
|
exec_prefix="@exec_prefix@"
|
|
datarootdir="@datarootdir@"
|
|
grub_lang=`echo $LANG | cut -d . -f 1`
|
|
|
|
export TEXTDOMAIN=@PACKAGE@
|
|
export TEXTDOMAINDIR="@localedir@"
|
|
|
|
. "$pkgdatadir/grub-mkconfig_lib"
|
|
|
|
# Do this as early as possible, since other commands might depend on it.
|
|
# (e.g. the `loadfont' command might need lvm or raid modules)
|
|
for i in ${GRUB_PRELOAD_MODULES} ; do
|
|
echo "insmod $i"
|
|
done
|
|
|
|
if [ "x${GRUB_DEFAULT}" = "x" ] ; then GRUB_DEFAULT=0 ; fi
|
|
if [ "x${GRUB_DEFAULT}" = "xsaved" ] ; then GRUB_DEFAULT='${saved_entry}' ; fi
|
|
if [ "x${GRUB_TIMEOUT}" = "x" ] ; then GRUB_TIMEOUT=5 ; fi
|
|
if [ "x${GRUB_GFXMODE}" = "x" ] ; then GRUB_GFXMODE=auto ; fi
|
|
|
|
if [ "x${GRUB_DEFAULT_BUTTON}" = "x" ] ; then GRUB_DEFAULT_BUTTON="$GRUB_DEFAULT" ; fi
|
|
if [ "x${GRUB_DEFAULT_BUTTON}" = "xsaved" ] ; then GRUB_DEFAULT_BUTTON='${saved_entry}' ; fi
|
|
if [ "x${GRUB_TIMEOUT_BUTTON}" = "x" ] ; then GRUB_TIMEOUT_BUTTON="$GRUB_TIMEOUT" ; fi
|
|
|
|
cat << EOF
|
|
if [ -s \$prefix/grubenv ]; then
|
|
load_env
|
|
fi
|
|
|
|
if [ "\${env_block}" ] ; then
|
|
set env_block="(\${root})\${env_block}"
|
|
export env_block
|
|
load_env -f "\${env_block}"
|
|
fi
|
|
|
|
EOF
|
|
if [ "x$GRUB_BUTTON_CMOS_ADDRESS" != "x" ]; then
|
|
cat <<EOF
|
|
if cmostest $GRUB_BUTTON_CMOS_ADDRESS ; then
|
|
set default="${GRUB_DEFAULT_BUTTON}"
|
|
elif [ "\${next_entry}" ] ; then
|
|
set default="\${next_entry}"
|
|
set next_entry=
|
|
if [ "\${env_block}" ] ; then
|
|
save_env -f "\${env_block}" next_entry
|
|
else
|
|
save_env next_entry
|
|
fi
|
|
set boot_once=true
|
|
else
|
|
set default="${GRUB_DEFAULT}"
|
|
fi
|
|
EOF
|
|
else
|
|
cat <<EOF
|
|
if [ "\${next_entry}" ] ; then
|
|
set default="\${next_entry}"
|
|
set next_entry=
|
|
if [ "\${env_block}" ] ; then
|
|
save_env -f "\${env_block}" next_entry
|
|
else
|
|
save_env next_entry
|
|
fi
|
|
set boot_once=true
|
|
else
|
|
set default="${GRUB_DEFAULT}"
|
|
fi
|
|
EOF
|
|
fi
|
|
cat <<EOF
|
|
|
|
if [ x"\${feature_menuentry_id}" = xy ]; then
|
|
menuentry_id_option="--id"
|
|
else
|
|
menuentry_id_option=""
|
|
fi
|
|
|
|
export menuentry_id_option
|
|
|
|
if [ "\${prev_saved_entry}" ]; then
|
|
set saved_entry="\${prev_saved_entry}"
|
|
save_env saved_entry
|
|
set prev_saved_entry=
|
|
save_env prev_saved_entry
|
|
set boot_once=true
|
|
fi
|
|
|
|
function savedefault {
|
|
if [ -z "\${boot_once}" ]; then
|
|
saved_entry="\${chosen}"
|
|
if [ "\${env_block}" ] ; then
|
|
save_env -f "\${env_block}" saved_entry
|
|
else
|
|
save_env saved_entry
|
|
fi
|
|
|
|
fi
|
|
}
|
|
|
|
function load_video {
|
|
EOF
|
|
if [ -n "${GRUB_VIDEO_BACKEND}" ]; then
|
|
cat <<EOF
|
|
insmod ${GRUB_VIDEO_BACKEND}
|
|
EOF
|
|
else
|
|
# If all_video.mod isn't available load all modules available
|
|
# with versions prior to introduction of all_video.mod
|
|
cat <<EOF
|
|
if [ x\$feature_all_video_module = xy ]; then
|
|
insmod all_video
|
|
else
|
|
insmod efi_gop
|
|
insmod efi_uga
|
|
insmod ieee1275_fb
|
|
insmod vbe
|
|
insmod vga
|
|
insmod video_bochs
|
|
insmod video_cirrus
|
|
fi
|
|
EOF
|
|
fi
|
|
cat <<EOF
|
|
}
|
|
|
|
EOF
|
|
|
|
serial=0;
|
|
gfxterm=0;
|
|
for x in ${GRUB_TERMINAL_INPUT} ${GRUB_TERMINAL_OUTPUT}; do
|
|
if [ xserial = "x$x" ]; then
|
|
serial=1;
|
|
fi
|
|
if [ xgfxterm = "x$x" ]; then
|
|
gfxterm=1;
|
|
fi
|
|
done
|
|
|
|
if [ "x$serial" = x1 ]; then
|
|
if [ "x${GRUB_SERIAL_COMMAND}" = "x" ] ; then
|
|
grub_warn "$(gettext "Requested serial terminal but GRUB_SERIAL_COMMAND is unspecified. Default parameters will be used.")"
|
|
GRUB_SERIAL_COMMAND=serial
|
|
fi
|
|
echo "${GRUB_SERIAL_COMMAND}"
|
|
fi
|
|
|
|
if [ "x$gfxterm" = x1 ]; then
|
|
if [ -n "$GRUB_FONT" ] ; then
|
|
# Make the font accessible
|
|
prepare_grub_to_access_device `${grub_probe} --target=device "${GRUB_FONT}"`
|
|
cat << EOF
|
|
if loadfont `make_system_path_relative_to_its_root "${GRUB_FONT}"` ; then
|
|
EOF
|
|
else
|
|
for dir in "${pkgdatadir}" "`echo '/@bootdirname@/@grubdirname@' | sed "s,//*,/,g"`" /usr/share/grub ; do
|
|
for basename in unicode unifont ascii; do
|
|
path="${dir}/${basename}.pf2"
|
|
if is_path_readable_by_grub "${path}" > /dev/null ; then
|
|
font_path="${path}"
|
|
else
|
|
continue
|
|
fi
|
|
break 2
|
|
done
|
|
done
|
|
if [ -n "${font_path}" ] ; then
|
|
cat << EOF
|
|
if [ x\$feature_default_font_path = xy ] ; then
|
|
font=unicode
|
|
else
|
|
EOF
|
|
# Make the font accessible
|
|
prepare_grub_to_access_device `${grub_probe} --target=device "${font_path}"`
|
|
cat << EOF
|
|
font="`make_system_path_relative_to_its_root "${font_path}"`"
|
|
fi
|
|
|
|
if loadfont \$font ; then
|
|
EOF
|
|
else
|
|
cat << EOF
|
|
if loadfont unicode ; then
|
|
EOF
|
|
fi
|
|
fi
|
|
|
|
cat << EOF
|
|
set gfxmode=${GRUB_GFXMODE}
|
|
load_video
|
|
insmod gfxterm
|
|
EOF
|
|
|
|
# Gettext variables and module
|
|
if [ "x${grub_lang}" != "xC" ] && [ "x${LANG}" != "xPOSIX" ] && [ "x${LANG}" != "x" ]; then
|
|
cat << EOF
|
|
set locale_dir=\$prefix/locale
|
|
set lang=${grub_lang}
|
|
insmod gettext
|
|
EOF
|
|
fi
|
|
|
|
cat <<EOF
|
|
fi
|
|
EOF
|
|
fi
|
|
|
|
case x${GRUB_TERMINAL_INPUT} in
|
|
x)
|
|
# Just use the native terminal
|
|
;;
|
|
x*)
|
|
cat << EOF
|
|
terminal_input ${GRUB_TERMINAL_INPUT}
|
|
EOF
|
|
;;
|
|
esac
|
|
|
|
case x${GRUB_TERMINAL_OUTPUT} in
|
|
x)
|
|
# Just use the native terminal
|
|
;;
|
|
x*)
|
|
cat << EOF
|
|
terminal_output ${GRUB_TERMINAL_OUTPUT}
|
|
EOF
|
|
;;
|
|
esac
|
|
|
|
if [ "x$gfxterm" = x1 ]; then
|
|
if [ "x$GRUB_THEME" != x ] && [ -f "$GRUB_THEME" ] \
|
|
&& is_path_readable_by_grub "$GRUB_THEME"; then
|
|
gettext_printf "Found theme: %s\n" "$GRUB_THEME" >&2
|
|
|
|
prepare_grub_to_access_device `${grub_probe} --target=device "$GRUB_THEME"`
|
|
cat << EOF
|
|
insmod gfxmenu
|
|
EOF
|
|
themedir="`dirname "$GRUB_THEME"`"
|
|
for x in "$themedir"/*.pf2 "$themedir"/f/*.pf2; do
|
|
if [ -f "$x" ]; then
|
|
cat << EOF
|
|
loadfont (\$root)`make_system_path_relative_to_its_root $x`
|
|
EOF
|
|
fi
|
|
done
|
|
if [ x"`echo "$themedir"/*.jpg`" != x"$themedir/*.jpg" ] || [ x"`echo "$themedir"/*.jpeg`" != x"$themedir/*.jpeg" ]; then
|
|
cat << EOF
|
|
insmod jpeg
|
|
EOF
|
|
fi
|
|
if [ x"`echo "$themedir"/*.png`" != x"$themedir/*.png" ]; then
|
|
cat << EOF
|
|
insmod png
|
|
EOF
|
|
fi
|
|
if [ x"`echo "$themedir"/*.tga`" != x"$themedir/*.tga" ]; then
|
|
cat << EOF
|
|
insmod tga
|
|
EOF
|
|
fi
|
|
|
|
cat << EOF
|
|
set theme=(\$root)`make_system_path_relative_to_its_root $GRUB_THEME`
|
|
export theme
|
|
EOF
|
|
elif [ "x$GRUB_BACKGROUND" != x ] && [ -f "$GRUB_BACKGROUND" ] \
|
|
&& is_path_readable_by_grub "$GRUB_BACKGROUND"; then
|
|
gettext_printf "Found background: %s\n" "$GRUB_BACKGROUND" >&2
|
|
case "$GRUB_BACKGROUND" in
|
|
*.png) reader=png ;;
|
|
*.tga) reader=tga ;;
|
|
*.jpg|*.jpeg) reader=jpeg ;;
|
|
*) gettext "Unsupported image format" >&2; echo >&2; exit 1 ;;
|
|
esac
|
|
prepare_grub_to_access_device `${grub_probe} --target=device "$GRUB_BACKGROUND"`
|
|
cat << EOF
|
|
insmod $reader
|
|
background_image -m stretch "`make_system_path_relative_to_its_root "$GRUB_BACKGROUND"`"
|
|
EOF
|
|
fi
|
|
fi
|
|
|
|
make_timeout ()
|
|
{
|
|
if [ "x${3}" != "x" ] ; then
|
|
timeout="${2}"
|
|
style="${3}"
|
|
elif [ "x${1}" != "x" ] && [ "x${1}" != "x0" ] ; then
|
|
# Handle the deprecated GRUB_HIDDEN_TIMEOUT scheme.
|
|
timeout="${1}"
|
|
if [ "x${2}" != "x0" ] ; then
|
|
grub_warn "$(gettext "Setting GRUB_TIMEOUT to a non-zero value when GRUB_HIDDEN_TIMEOUT is set is no longer supported.")"
|
|
fi
|
|
if [ "x${GRUB_HIDDEN_TIMEOUT_QUIET}" = "xtrue" ] ; then
|
|
style="hidden"
|
|
verbose=
|
|
else
|
|
style="countdown"
|
|
verbose=" --verbose"
|
|
fi
|
|
else
|
|
# No hidden timeout, so treat as GRUB_TIMEOUT_STYLE=menu
|
|
timeout="${2}"
|
|
style="menu"
|
|
fi
|
|
cat << EOF
|
|
if [ x\$feature_timeout_style = xy ] ; then
|
|
set timeout_style=${style}
|
|
set timeout=${timeout}
|
|
EOF
|
|
if [ "x${style}" = "xmenu" ] ; then
|
|
cat << EOF
|
|
# Fallback normal timeout code in case the timeout_style feature is
|
|
# unavailable.
|
|
else
|
|
set timeout=${timeout}
|
|
EOF
|
|
else
|
|
cat << EOF
|
|
# Fallback hidden-timeout code in case the timeout_style feature is
|
|
# unavailable.
|
|
elif sleep${verbose} --interruptible ${timeout} ; then
|
|
set timeout=0
|
|
EOF
|
|
fi
|
|
cat << EOF
|
|
fi
|
|
EOF
|
|
}
|
|
|
|
if [ "x$GRUB_BUTTON_CMOS_ADDRESS" != "x" ]; then
|
|
cat <<EOF
|
|
if cmostest $GRUB_BUTTON_CMOS_ADDRESS ; then
|
|
EOF
|
|
make_timeout "${GRUB_HIDDEN_TIMEOUT_BUTTON}" "${GRUB_TIMEOUT_BUTTON}" "${GRUB_TIMEOUT_STYLE_BUTTON}"
|
|
echo else
|
|
make_timeout "${GRUB_HIDDEN_TIMEOUT}" "${GRUB_TIMEOUT}" "${GRUB_TIMEOUT_STYLE}"
|
|
echo fi
|
|
else
|
|
make_timeout "${GRUB_HIDDEN_TIMEOUT}" "${GRUB_TIMEOUT}" "${GRUB_TIMEOUT_STYLE}"
|
|
fi
|
|
|
|
if [ "x$GRUB_BUTTON_CMOS_ADDRESS" != "x" ] && [ "x$GRUB_BUTTON_CMOS_CLEAN" = "xyes" ]; then
|
|
cat <<EOF
|
|
cmosclean $GRUB_BUTTON_CMOS_ADDRESS
|
|
EOF
|
|
fi
|
|
|
|
# Play an initial tune
|
|
if [ "x${GRUB_INIT_TUNE}" != "x" ] ; then
|
|
echo "play ${GRUB_INIT_TUNE}"
|
|
fi
|
|
|
|
if [ "x${GRUB_BADRAM}" != "x" ] ; then
|
|
echo "badram ${GRUB_BADRAM}"
|
|
fi
|