0aa1f2febd
grub-mkconfig will set GRUB_TERMINAL_OUTPUT to "gfxterm" unless the user has overridden it. On EFI systems, this will stop output from going to the default "console" terminal. When the EFI fw console is configured to output to both serial and video, this will cause GRUB to only display on video - while continuing to accept input from both video and serial. Instead of switching from "console" to "gfxterm", let's output to both. Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
356 lines
8.5 KiB
Bash
356 lines
8.5 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
|
|
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=
|
|
save_env next_entry
|
|
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=
|
|
save_env next_entry
|
|
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}"
|
|
save_env saved_entry
|
|
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${LANG}" != "xC" ] && [ "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 --append ${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
|