123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285 |
- #! /bin/sh
- set -e
- # Generate grub.cfg by inspecting /boot contents.
- # 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@"
- prefix="@prefix@"
- exec_prefix="@exec_prefix@"
- sbindir="@sbindir@"
- bindir="@bindir@"
- sysconfdir="@sysconfdir@"
- PACKAGE_NAME=@PACKAGE_NAME@
- PACKAGE_VERSION=@PACKAGE_VERSION@
- host_os=@host_os@
- datadir="@datadir@"
- if [ "x$pkgdatadir" = x ]; then
- pkgdatadir="${datadir}/@PACKAGE@"
- fi
- # export it for scripts
- export pkgdatadir
- grub_cfg=""
- grub_mkconfig_dir="${sysconfdir}"/grub.d
- self=`basename $0`
- grub_probe="${sbindir}/@grub_probe@"
- grub_file="${bindir}/@grub_file@"
- grub_editenv="${bindir}/@grub_editenv@"
- grub_script_check="${bindir}/@grub_script_check@"
- export TEXTDOMAIN=@PACKAGE@
- export TEXTDOMAINDIR="@localedir@"
- . "${pkgdatadir}/grub-mkconfig_lib"
- # Usage: usage
- # Print the usage.
- usage () {
- gettext_printf "Usage: %s [OPTION]\n" "$self"
- gettext "Generate a grub config file"; echo
- echo
- print_option_help "-o, --output=$(gettext FILE)" "$(gettext "output generated config to FILE [default=stdout]")"
- print_option_help "-h, --help" "$(gettext "print this message and exit")"
- print_option_help "-v, --version" "$(gettext "print the version information and exit")"
- echo
- gettext "Report bugs to <bug-grub@gnu.org>."; echo
- }
- argument () {
- opt=$1
- shift
- if test $# -eq 0; then
- gettext_printf "%s: option requires an argument -- \`%s'\n" "$self" "$opt" 1>&2
- exit 1
- fi
- echo $1
- }
- # Check the arguments.
- while test $# -gt 0
- do
- option=$1
- shift
- case "$option" in
- -h | --help)
- usage
- exit 0 ;;
- -V | --version)
- echo "$self (${PACKAGE_NAME}) ${PACKAGE_VERSION}"
- exit 0 ;;
- -o | --output)
- grub_cfg=`argument $option "$@"`; shift;;
- --output=*)
- grub_cfg=`echo "$option" | sed 's/--output=//'`
- ;;
- -*)
- gettext_printf "Unrecognized option \`%s'\n" "$option" 1>&2
- usage
- exit 1
- ;;
- # Explicitly ignore non-option arguments, for compatibility.
- esac
- done
- if [ "x$EUID" = "x" ] ; then
- EUID=`id -u`
- fi
- if [ "$EUID" != 0 ] ; then
- root=f
- case "`uname 2>/dev/null`" in
- CYGWIN*)
- # Cygwin: Assume root if member of admin group
- for g in `id -G 2>/dev/null` ; do
- case $g in
- 0|544) root=t ;;
- esac
- done ;;
- esac
- if [ $root != t ] ; then
- gettext_printf "%s: You must run this as root\n" "$self" >&2
- exit 1
- fi
- fi
- set $grub_probe dummy
- if test -f "$1"; then
- :
- else
- gettext_printf "%s: Not found.\n" "$1" 1>&2
- exit 1
- fi
- # Device containing our userland. Typically used for root= parameter.
- GRUB_DEVICE="`${grub_probe} --target=device /`"
- GRUB_DEVICE_UUID="`${grub_probe} --device ${GRUB_DEVICE} --target=fs_uuid 2> /dev/null`" || true
- # Device containing our /boot partition. Usually the same as GRUB_DEVICE.
- GRUB_DEVICE_BOOT="`${grub_probe} --target=device /boot`"
- GRUB_DEVICE_BOOT_UUID="`${grub_probe} --device ${GRUB_DEVICE_BOOT} --target=fs_uuid 2> /dev/null`" || true
- # Filesystem for the device containing our userland. Used for stuff like
- # choosing Hurd filesystem module.
- GRUB_FS="`${grub_probe} --device ${GRUB_DEVICE} --target=fs 2> /dev/null || echo unknown`"
- if [ x"$GRUB_FS" = xunknown ]; then
- GRUB_FS="$(stat -f --printf=%T / || echo unknown)"
- fi
- if test -f ${sysconfdir}/default/grub ; then
- . ${sysconfdir}/default/grub
- fi
- # XXX: should this be deprecated at some point?
- if [ "x${GRUB_TERMINAL}" != "x" ] ; then
- GRUB_TERMINAL_INPUT="${GRUB_TERMINAL}"
- GRUB_TERMINAL_OUTPUT="${GRUB_TERMINAL}"
- fi
- termoutdefault=0
- if [ "x${GRUB_TERMINAL_OUTPUT}" = "x" ]; then
- GRUB_TERMINAL_OUTPUT=gfxterm;
- termoutdefault=1;
- fi
- for x in ${GRUB_TERMINAL_OUTPUT}; do
- case "x${x}" in
- xgfxterm) ;;
- xconsole | xserial | xofconsole | xvga_text)
- # make sure all our children behave in conformance with ascii..
- export LANG=C;;
- *) echo "Invalid output terminal \"${GRUB_TERMINAL_OUTPUT}\"" >&2 ; exit 1 ;;
- esac
- done
- GRUB_ACTUAL_DEFAULT="$GRUB_DEFAULT"
- if [ "x${GRUB_ACTUAL_DEFAULT}" = "xsaved" ] ; then GRUB_ACTUAL_DEFAULT="`"${grub_editenv}" - list | sed -n '/^saved_entry=/ s,^saved_entry=,,p'`" ; fi
- # These are defined in this script, export them here so that user can
- # override them.
- export GRUB_DEVICE \
- GRUB_DEVICE_UUID \
- GRUB_DEVICE_BOOT \
- GRUB_DEVICE_BOOT_UUID \
- GRUB_FS \
- GRUB_FONT \
- GRUB_PRELOAD_MODULES \
- GRUB_ACTUAL_DEFAULT
- # These are optional, user-defined variables.
- export GRUB_DEFAULT \
- GRUB_HIDDEN_TIMEOUT \
- GRUB_HIDDEN_TIMEOUT_QUIET \
- GRUB_TIMEOUT \
- GRUB_TIMEOUT_STYLE \
- GRUB_DEFAULT_BUTTON \
- GRUB_HIDDEN_TIMEOUT_BUTTON \
- GRUB_TIMEOUT_BUTTON \
- GRUB_TIMEOUT_STYLE_BUTTON \
- GRUB_BUTTON_CMOS_ADDRESS \
- GRUB_BUTTON_CMOS_CLEAN \
- GRUB_DISTRIBUTOR \
- GRUB_CMDLINE_LINUX \
- GRUB_CMDLINE_LINUX_DEFAULT \
- GRUB_CMDLINE_XEN \
- GRUB_CMDLINE_XEN_DEFAULT \
- GRUB_CMDLINE_LINUX_XEN_REPLACE \
- GRUB_CMDLINE_LINUX_XEN_REPLACE_DEFAULT \
- GRUB_CMDLINE_NETBSD \
- GRUB_CMDLINE_NETBSD_DEFAULT \
- GRUB_CMDLINE_GNUMACH \
- GRUB_TERMINAL_INPUT \
- GRUB_TERMINAL_OUTPUT \
- GRUB_SERIAL_COMMAND \
- GRUB_DISABLE_LINUX_UUID \
- GRUB_DISABLE_RECOVERY \
- GRUB_VIDEO_BACKEND \
- GRUB_GFXMODE \
- GRUB_BACKGROUND \
- GRUB_THEME \
- GRUB_GFXPAYLOAD_LINUX \
- GRUB_DISABLE_OS_PROBER \
- GRUB_INIT_TUNE \
- GRUB_SAVEDEFAULT \
- GRUB_ENABLE_CRYPTODISK \
- GRUB_BADRAM \
- GRUB_OS_PROBER_SKIP_LIST \
- GRUB_DISABLE_SUBMENU
- if test "x${grub_cfg}" != "x"; then
- rm -f "${grub_cfg}.new"
- oldumask=$(umask); umask 077
- exec > "${grub_cfg}.new"
- umask $oldumask
- fi
- gettext "Generating grub configuration file ..." >&2
- echo >&2
- cat << EOF
- #
- # DO NOT EDIT THIS FILE
- #
- # It is automatically generated by $self using templates
- # from ${grub_mkconfig_dir} and settings from ${sysconfdir}/default/grub
- #
- EOF
- for i in "${grub_mkconfig_dir}"/* ; do
- case "$i" in
- # emacsen backup files. FIXME: support other editors
- *~) ;;
- # emacsen autosave files. FIXME: support other editors
- */\#*\#) ;;
- *)
- if grub_file_is_not_garbage "$i" && test -x "$i" ; then
- echo
- echo "### BEGIN $i ###"
- "$i"
- echo "### END $i ###"
- fi
- ;;
- esac
- done
- if test "x${grub_cfg}" != "x" ; then
- if ! ${grub_script_check} ${grub_cfg}.new; then
- # TRANSLATORS: %s is replaced by filename
- gettext_printf "Syntax errors are detected in generated GRUB config file.
- Ensure that there are no errors in /etc/default/grub
- and /etc/grub.d/* files or please file a bug report with
- %s file attached." "${grub_cfg}.new" >&2
- echo >&2
- exit 1
- else
- # none of the children aborted with error, install the new grub.cfg
- mv -f ${grub_cfg}.new ${grub_cfg}
- fi
- fi
- gettext "done" >&2
- echo >&2
|