ee4bd79ef2
The GRUB_DISABLE_SUBMENU option is different than the others in the sense that it has to be set to "y" instead of "true" to be enabled. That causes a lot of confusion to users, some may wrongly set it to "true" expecting that will work the same than with most options, and some may set it to "yes" since for other options the value to set is a word and not a single character. This patch changes all the grub.d scripts using the GRUB_DISABLE_SUBMENU option, so they check if it was set to "true" instead of "y", making it consistent with all the other options. But to keep backward compatibility for users that set the option to "y" in /etc/default/grub file, keep testing for this value. And also do it for "yes", since it is a common mistake made by users caused by this option being inconsistent with the others. Signed-off-by: Prarit Bhargava <prarit@redhat.com> Signed-off-by: Javier Martinez Canillas <javierm@redhat.com> Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
252 lines
8.3 KiB
Bash
252 lines
8.3 KiB
Bash
#! /bin/sh
|
|
set -e
|
|
|
|
# grub-mkconfig helper script.
|
|
# Copyright (C) 2006,2007,2008,2009,2010,2011 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@"
|
|
. "$pkgdatadir/grub-mkconfig_lib"
|
|
|
|
export TEXTDOMAIN=@PACKAGE@
|
|
export TEXTDOMAINDIR="@localedir@"
|
|
|
|
CLASS="--class os"
|
|
|
|
case "${GRUB_DISTRIBUTOR}" in
|
|
Debian)
|
|
OS="${GRUB_DISTRIBUTOR} GNU/kFreeBSD"
|
|
CLASS="--class $(echo ${GRUB_DISTRIBUTOR} | tr 'A-Z' 'a-z' | cut -d' ' -f1|LC_ALL=C sed 's,[^[:alnum:]_],_,g') --class gnu-kfreebsd --class gnu ${CLASS}"
|
|
;;
|
|
*)
|
|
OS="FreeBSD"
|
|
CLASS="--class freebsd --class bsd ${CLASS}"
|
|
;;
|
|
esac
|
|
|
|
load_kfreebsd_module ()
|
|
{
|
|
mod="$1"
|
|
allow_fail="$2"
|
|
|
|
if ! test -e "${module_dir}/${mod}.ko" ; then
|
|
if [ "${allow_fail}" = "true" ] ; then
|
|
# Return silently
|
|
return
|
|
else
|
|
# Print an error and fail.
|
|
ls "${module_dir}/${mod}.ko" > /dev/null
|
|
fi
|
|
fi
|
|
|
|
if [ -z "${prepare_module_dir_cache}" ]; then
|
|
prepare_module_dir_cache="$(prepare_grub_to_access_device $(${grub_probe} -t device "${module_dir}") | grub_add_tab)"
|
|
fi
|
|
|
|
printf '%s\n' "${prepare_module_dir_cache}"
|
|
cat << EOF
|
|
kfreebsd_module_elf ${module_dir_rel}/${mod}.ko
|
|
EOF
|
|
}
|
|
|
|
title_correction_code=
|
|
|
|
kfreebsd_entry ()
|
|
{
|
|
os="$1"
|
|
version="$2"
|
|
type="$3"
|
|
args="$4"
|
|
if [ -z "$boot_device_id" ]; then
|
|
boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")"
|
|
fi
|
|
if [ x$type != xsimple ] ; then
|
|
if [ x$type = xrecovery ] ; then
|
|
title="$(gettext_printf "%s, with kFreeBSD %s (recovery mode)" "${os}" "${version}")"
|
|
else
|
|
title="$(gettext_printf "%s, with kFreeBSD %s" "${os}" "${version}")"
|
|
fi
|
|
replacement_title="$(echo "Advanced options for ${OS}" | sed 's,>,>>,g')>$(echo "$title" | sed 's,>,>>,g')"
|
|
if [ x"$title" = x"$GRUB_ACTUAL_DEFAULT" ]; then
|
|
quoted="$(echo "$GRUB_ACTUAL_DEFAULT" | grub_quote)"
|
|
title_correction_code="${title_correction_code}if [ \"x\$default\" = '$quoted' ]; then default='$(echo "$replacement_title" | grub_quote)'; fi;"
|
|
grub_warn "$(gettext_printf "Please don't use old title \`%s' for GRUB_DEFAULT, use \`%s' (for versions before 2.00) or \`%s' (for 2.00 or later)" "$GRUB_ACTUAL_DEFAULT" "$replacement_title" "kfreebsd-advanced-$boot_device_id>kfreebsd-$version-$type-$boot_device_id")"
|
|
fi
|
|
echo "menuentry '$(echo "$title" | grub_quote)' ${CLASS} \$menuentry_id_option 'kfreebsd-$version-$type-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
|
|
else
|
|
echo "menuentry '$(echo "$OS" | grub_quote)' ${CLASS} \$menuentry_id_option 'kfreebsd-simple-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
|
|
fi
|
|
if [ x$type != xrecovery ] ; then
|
|
save_default_entry | grub_add_tab | sed "s/^/$submenu_indentation/"
|
|
fi
|
|
if [ -z "${prepare_boot_cache}" ]; then
|
|
prepare_boot_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} | grub_add_tab)"
|
|
fi
|
|
|
|
printf '%s\n' "${prepare_boot_cache}" | sed "s/^/$submenu_indentation/"
|
|
message="$(gettext_printf "Loading kernel of FreeBSD %s ..." ${version})"
|
|
sed "s/^/$submenu_indentation/" << EOF
|
|
echo '$(echo "$message" | grub_quote)'
|
|
kfreebsd ${rel_dirname}/${basename} ${args}
|
|
EOF
|
|
|
|
if test -n "${devices}" ; then
|
|
sed "s/^/$submenu_indentation/" << EOF
|
|
kfreebsd_loadenv ${devices_rel_dirname}/${devices_basename}
|
|
EOF
|
|
fi
|
|
|
|
load_kfreebsd_module acpi true
|
|
|
|
for abstraction in dummy $(${grub_probe} -t abstraction --device ${GRUB_DEVICE}) ; do
|
|
case $abstraction in
|
|
lvm) load_kfreebsd_module geom_linux_lvm false ;;
|
|
esac
|
|
done
|
|
|
|
case "${kfreebsd_fs}" in
|
|
zfs)
|
|
load_kfreebsd_module opensolaris false
|
|
|
|
ls "/boot/zfs/zpool.cache" > /dev/null
|
|
printf '%s\n' "${prepare_boot_cache}"
|
|
sed "s/^/$submenu_indentation/" << EOF
|
|
kfreebsd_module $(make_system_path_relative_to_its_root /boot)/zfs/zpool.cache type=/boot/zfs/zpool.cache
|
|
EOF
|
|
;;
|
|
esac
|
|
|
|
if [ x${kfreebsd_fs} = xufs ]; then
|
|
load_kfreebsd_module ${kfreebsd_fs} true | sed "s/^/$submenu_indentation/"
|
|
else
|
|
load_kfreebsd_module ${kfreebsd_fs} false | sed "s/^/$submenu_indentation/"
|
|
fi
|
|
|
|
sed "s/^/$submenu_indentation/" << EOF
|
|
set kFreeBSD.vfs.root.mountfrom=${kfreebsd_fs}:${kfreebsd_device}
|
|
set kFreeBSD.vfs.root.mountfrom.options=rw
|
|
}
|
|
EOF
|
|
}
|
|
|
|
list=
|
|
for i in /boot/kfreebsd-* /boot/kernel/kernel ; do
|
|
if grub_file_is_not_garbage "$i" ; then
|
|
list="$list $i"
|
|
fi
|
|
done
|
|
prepare_boot_cache=
|
|
boot_device_id=
|
|
title_correction_code=
|
|
|
|
# Extra indentation to add to menu entries in a submenu. We're not in a submenu
|
|
# yet, so it's empty. In a submenu it will be equal to '\t' (one tab).
|
|
submenu_indentation=""
|
|
|
|
is_top_level=true
|
|
|
|
while [ "x$list" != "x" ] ; do
|
|
kfreebsd=`version_find_latest $list`
|
|
gettext_printf "Found kernel of FreeBSD: %s\n" "$kfreebsd" >&2
|
|
basename=`basename $kfreebsd`
|
|
dirname=`dirname $kfreebsd`
|
|
rel_dirname=`make_system_path_relative_to_its_root $dirname`
|
|
|
|
if [ -f /boot/device.hints ] ; then
|
|
devices=/boot/device.hints
|
|
devices_basename=`basename $devices`
|
|
devices_dirname=`dirname $devices`
|
|
devices_rel_dirname=`make_system_path_relative_to_its_root $devices_dirname`
|
|
fi
|
|
|
|
case ${GRUB_FS} in
|
|
ufs1 | ufs2) kfreebsd_fs=ufs ;;
|
|
ext2) kfreebsd_fs=ext2fs ;;
|
|
*) kfreebsd_fs=${GRUB_FS} ;;
|
|
esac
|
|
|
|
case ${GRUB_FS} in
|
|
zfs)
|
|
# zpool name
|
|
kfreebsd_device=$(${grub_probe} -t fs_label --device ${GRUB_DEVICE})
|
|
# filesystem name (empty string for the main filesystem)
|
|
kfreebsd_device="${kfreebsd_device}$(${grub_mkrelpath} / | sed -e "s,/*@$,,")"
|
|
;;
|
|
*)
|
|
kfreebsd_device=${kfreebsd_fs}id/${GRUB_DEVICE_UUID}
|
|
# Debian GNU/kFreeBSD can't remount root if it's supplied as UUID but
|
|
# as an UUID
|
|
if [ "x${GRUB_DISTRIBUTOR}" = "xDebian" ] \
|
|
&& ! (cat /etc/fstab | awk '!/^[[:space:]]*#/ && $2=="/" { print $1; }' \
|
|
| grep "${kfreebsd_fs}id/${GRUB_DEVICE_UUID}" > /dev/null); then
|
|
kfreebsd_device=${GRUB_DEVICE}
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
version=`echo $basename | sed -e "s,^[^0-9]*-,,g;s/\.gz$//g"`
|
|
alt_version=`echo $version | sed -e "s,\.old$,,g"`
|
|
|
|
module_dir=
|
|
for i in "/lib/modules/${version}" "/lib/modules/${alt_version}" \
|
|
"/boot/kernel"; do
|
|
if test -e "$i" ; then
|
|
module_dir="$i"
|
|
break
|
|
fi
|
|
done
|
|
if test -n "${module_dir}" ; then
|
|
gettext_printf "Found kernel module directory: %s\n" "${module_dir}" >&2
|
|
module_dir_rel=$(make_system_path_relative_to_its_root $module_dir)
|
|
fi
|
|
|
|
# The GRUB_DISABLE_SUBMENU option used to be different than others since it was
|
|
# mentioned in the documentation that has to be set to 'y' instead of 'true' to
|
|
# enable it. This caused a lot of confusion to users that set the option to 'y',
|
|
# 'yes' or 'true'. This was fixed but all of these values must be supported now.
|
|
if [ "x${GRUB_DISABLE_SUBMENU}" = xyes ] || [ "x${GRUB_DISABLE_SUBMENU}" = xy ]; then
|
|
GRUB_DISABLE_SUBMENU="true"
|
|
fi
|
|
|
|
if [ "x$is_top_level" = xtrue ] && [ "x${GRUB_DISABLE_SUBMENU}" != xtrue ]; then
|
|
kfreebsd_entry "${OS}" "${version}" simple
|
|
submenu_indentation="$grub_tab"
|
|
|
|
if [ -z "$boot_device_id" ]; then
|
|
boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")"
|
|
fi
|
|
# TRANSLATORS: %s is replaced with an OS name
|
|
echo "submenu '$(gettext_printf "Advanced options for %s" "${OS}" | grub_quote)' \$menuentry_id_option 'kfreebsd-advanced-$boot_device_id' {"
|
|
is_top_level=false
|
|
fi
|
|
|
|
kfreebsd_entry "${OS}" "${version}" advanced
|
|
if [ "x${GRUB_DISABLE_RECOVERY}" != "xtrue" ]; then
|
|
kfreebsd_entry "${OS}" "${version}" recovery "-s"
|
|
fi
|
|
|
|
list=`echo $list | tr ' ' '\n' | fgrep -vx "$kfreebsd" | tr '\n' ' '`
|
|
done
|
|
|
|
# If at least one kernel was found, then we need to
|
|
# add a closing '}' for the submenu command.
|
|
if [ x"$is_top_level" != xtrue ]; then
|
|
echo '}'
|
|
fi
|
|
|
|
echo "$title_correction_code"
|
|
|