#!/usr/bin/sh # # Set a default boot entry for GRUB. # Copyright (C) 2004,2009 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 . #set -eu # Initialize some variables. prefix=/usr exec_prefix=/usr sbindir=/usr/sbin bindir=/usr/bin sysconfdir="/etc" PACKAGE_NAME=GRUB PACKAGE_VERSION=2.06 datarootdir="/usr/share" datadir="/usr/share" if [ ! -v pkgdatadir ]; then pkgdatadir="${datadir}/grub" fi self=`basename $0` grub_get_kernel_settings="${sbindir}/grub2-get-kernel-settings" grub_editenv=${bindir}/grub2-editenv etcdefaultgrub=/etc/default/grub eval "$("${grub_get_kernel_settings}")" || true EFIDIR=$(grep ^ID= /etc/os-release | sed -e 's/^ID=//' -e 's/rhel/redhat/' -e 's/\"//g') if [ -d /sys/firmware/efi/efivars/ ]; then startlink=/etc/grub2-efi.cfg grubdir=`echo "/boot/efi/EFI/${EFIDIR}/" | sed 's,//*,/,g'` else startlink=/etc/grub2.cfg grubdir=`echo "/boot/grub2" | sed 's,//*,/,g'` fi blsdir=`echo "/boot/loader/entries" | sed 's,//*,/,g'` backupsuffix=.bak arch="$(uname -m)" export TEXTDOMAIN=grub export TEXTDOMAINDIR="${datarootdir}/locale" . "${pkgdatadir}/grub-mkconfig_lib" # Usage: usage # Print the usage. usage () { gettext_printf "Usage: %s\n" "$self" gettext "Switch to BLS config files.\n"; echo echo print_option_help "-h, --help" "$(gettext "print this message and exit")" print_option_help "-V, --version" "$(gettext "print the version information and exit")" echo print_option_help "--backup-suffix=$(gettext "SUFFIX")" "$backupsuffix" print_option_help "--bls-directory=$(gettext "DIR")" "$blsdir" print_option_help "--config-file=$(gettext "FILE")" "$startlink" print_option_help "--grub-defaults=$(gettext "FILE")" "$etcdefaultgrub" print_option_help "--grub-directory=$(gettext "DIR")" "$grubdir" # echo # gettext "Report bugs to ."; 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 ;; --backup-suffix) backupsuffix=`argument $option "$@"` shift ;; --backup-suffix=*) backupsuffix=`echo "$option" | sed 's/--backup-suffix=//'` ;; --bls-directory) blsdir=`argument $option "$@"` shift ;; --bls-directory=*) blsdir=`echo "$option" | sed 's/--bls-directory=//'` ;; --config-file) startlink=`argument $option "$@"` shift ;; --config-file=*) startlink=`echo "$option" | sed 's/--config-file=//'` ;; --grub-defaults) etcdefaultgrub=`argument $option "$@"` shift ;; --grub-defaults=*) etcdefaultgrub=`echo "$option" | sed 's/--grub-defaults=//'` ;; --grub-directory) grubdir=`argument $option "$@"` shift ;; --grub-directory=*) grubdir=`echo "$option" | sed 's/--grub-directory=//'` ;; *) gettext_printf "Unrecognized option \`%s'\n" "$option" 1>&2 usage exit 1 ;; esac done find_grub_cfg() { local candidate="" while [ -e "${candidate}" -o $# -gt 0 ] do if [ ! -e "${candidate}" ] ; then candidate="$1" shift fi if [ -L "${candidate}" ]; then candidate="$(realpath "${candidate}")" fi if [ -f "${candidate}" ]; then export GRUB_CONFIG_FILE="${candidate}" return 0 fi done return 1 } if ! find_grub_cfg ${startlink} ${grubdir}/grub.cfg ; then gettext_printf "Couldn't find config file\n" 1>&2 exit 1 fi if [ ! -d "${blsdir}" ]; then install -m 700 -d "${blsdir}" fi if [ -f /etc/machine-id ]; then MACHINE_ID=$(cat /etc/machine-id) else MACHINE_ID=$(dmesg | sha256sum) fi mkbls() { local kernelver=$1 && shift local datetime=$1 && shift local kernelopts=$1 && shift local debugname="" local debugid="" local flavor="" if [ "$kernelver" == *\+* ] ; then local flavor=-"${kernelver##*+}" if [ "${flavor}" == "-debug" ]; then local debugname=" with debugging" local debugid="-debug" fi fi ( source /etc/os-release cat <"${bls_target}" if [ "x$GRUB_LINUX_MAKE_DEBUG" = "xtrue" ]; then bls_debug="$(echo ${bls_target} | sed -e "s/${kernelver}/${kernelver}~debug/")" cp -aT "${bls_target}" "${bls_debug}" title="$(grep '^title[ \t]' "${bls_debug}" | sed -e 's/^title[ \t]*//')" options="$(echo "${cmdline} ${GRUB_CMDLINE_LINUX_DEBUG}" | sed -e 's/\//\\\//g')" sed -i -e "s/^title.*/title ${title}${GRUB_LINUX_DEBUG_TITLE_POSTFIX}/" "${bls_debug}" sed -i -e "s/^options.*/options ${options}/" "${bls_debug}" fi done if [ -f "/boot/vmlinuz-0-rescue-${MACHINE_ID}" ]; then mkbls "0-rescue-${MACHINE_ID}" "0" "${bootprefix}" >"${blsdir}/${MACHINE_ID}-0-rescue.conf" fi } # The grub2 EFI binary is not copied to the ESP as a part of an ostree # transaction. Make sure a grub2 version with BLS support is installed # but only do this if the blsdir is not set, to make sure that the BLS # parsing module will search for the BLS snippets in the default path. if test -f /run/ostree-booted && test -d /sys/firmware/efi/efivars && \ ! ${grub_editenv} - list | grep -q blsdir && \ mountpoint -q /boot; then grub_binary="$(find /usr/lib/ostree-boot/efi/EFI/${EFIDIR}/ -name grub*.efi)" install -m 700 ${grub_binary} ${grubdir} || exit 1 # Create a hidden file to indicate that grub2 now has BLS support. touch /boot/grub2/.grub2-blscfg-supported fi GENERATE=0 if grep '^GRUB_ENABLE_BLSCFG=.*' "${etcdefaultgrub}" \ | grep -vq '^GRUB_ENABLE_BLSCFG="*true"*\s*$' ; then if ! sed -i"${backupsuffix}" \ -e 's,^GRUB_ENABLE_BLSCFG=.*,GRUB_ENABLE_BLSCFG=true,' \ "${etcdefaultgrub}" ; then gettext_printf "Updating %s failed\n" "${etcdefaultgrub}" exit 1 fi GENERATE=1 elif ! grep -q '^GRUB_ENABLE_BLSCFG=.*' "${etcdefaultgrub}" ; then if ! echo 'GRUB_ENABLE_BLSCFG=true' >> "${etcdefaultgrub}" ; then gettext_printf "Updating %s failed\n" "${etcdefaultgrub}" exit 1 fi GENERATE=1 fi if [ "${GENERATE}" -eq 1 ] ; then copy_bls if [ $arch = "x86_64" ] && [ ! -d /sys/firmware/efi ]; then mod_dir="i386-pc" elif [ $arch = "ppc64" -o $arch = "ppc64le" ] && [ ! -d /sys/firmware/opal ]; then mod_dir="powerpc-ieee1275" fi if [ -n "${mod_dir}" ]; then for mod in blscfg increment; do install -m 700 ${prefix}/lib/grub/${mod_dir}/${mod}.mod ${grubdir}/$mod_dir/ || exit 1 done fi cp -af "${GRUB_CONFIG_FILE}" "${GRUB_CONFIG_FILE}${backupsuffix}" if ! grub2-mkconfig -o "${GRUB_CONFIG_FILE}" ; then install -m 700 "${GRUB_CONFIG_FILE}${backupsuffix}" "${GRUB_CONFIG_FILE}" sed -i"${backupsuffix}" \ -e 's,^GRUB_ENABLE_BLSCFG=.*,GRUB_ENABLE_BLSCFG=false,' \ "${etcdefaultgrub}" gettext_printf "Updating %s failed\n" "${GRUB_CONFIG_FILE}" exit 1 fi fi # Bye. exit 0