diff --git a/0206-grub-switch-to-blscfg-Only-mark-GRUB-as-BLS-supporte.patch b/0206-grub-switch-to-blscfg-Only-mark-GRUB-as-BLS-supporte.patch new file mode 100644 index 0000000..27ef6e0 --- /dev/null +++ b/0206-grub-switch-to-blscfg-Only-mark-GRUB-as-BLS-supporte.patch @@ -0,0 +1,37 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Javier Martinez Canillas +Date: Thu, 2 Apr 2020 11:07:24 +0200 +Subject: [PATCH] grub-switch-to-blscfg: Only mark GRUB as BLS supported if + blsdir isn't set + +If the user set the blsdir environemnt variable to a path that is not the +default where ostree writes the BLS snippets, the blscfg module won't be +able to parse them and can lead to not having any menu entries on boot. + +So to minimize the risk of things going wrong when dropping the 15_ostree +script used by ostree to create the menu entries, only mark the bootloader +as BLS supported if the blsdir variable has not been set. + +Signed-off-by: Javier Martinez Canillas +--- + util/grub-switch-to-blscfg.in | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +diff --git a/util/grub-switch-to-blscfg.in b/util/grub-switch-to-blscfg.in +index a05a8d98554..4bbed8e4fe9 100644 +--- a/util/grub-switch-to-blscfg.in ++++ b/util/grub-switch-to-blscfg.in +@@ -267,8 +267,11 @@ copy_bls() { + } + + # 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. +-if test -f /run/ostree-booted && test -d /sys/firmware/efi/efivars/; then ++# 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; then + grub_binary="$(find /usr/lib/ostree-boot/efi/EFI/${EFIDIR}/ -name grub*.efi)" + cp ${grub_binary} ${grubdir} || exit 1 + # Create a hidden file to indicate that grub2 now has BLS support. diff --git a/0207-10_linux.in-Merge-logic-from-10_linux_bls-and-drop-t.patch b/0207-10_linux.in-Merge-logic-from-10_linux_bls-and-drop-t.patch new file mode 100644 index 0000000..cd4be69 --- /dev/null +++ b/0207-10_linux.in-Merge-logic-from-10_linux_bls-and-drop-t.patch @@ -0,0 +1,662 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Javier Martinez Canillas +Date: Tue, 31 Mar 2020 12:35:42 +0200 +Subject: [PATCH] 10_linux.in: Merge logic from 10_linux_bls and drop that + script + +There's a 10_linux_bls snippet that's used in ppc64le machines to generate +a set of menuentry commands by parsing BLS configs in /boot/loader/entries. + +This was made because on PowerNV ppc64le machines that boot using the OPAL +firmware, there could be an old version of the Petitboot bootloader that +doesn't have support to parse BLS snippets. + +But there is no need to have a separate GRUB script for that and the logic +could just be part of the usual 10_linux snippet. + +Also the BLS files could be used directly if the bootloader has support to +parse them, which is the case for GRUB that's used in ppc64le OF or if the +Petitboot used in ppc64le OPAL machines is version 1.8.0 or newer. + +So only generate the menuentry commands from the BLS snippets in the case +of OPAL machines with an old Petitboot version. + +Signed-off-by: Javier Martinez Canillas +--- + Makefile.util.def | 7 - + util/grub.d/10_linux.in | 97 ++++++++- + util/grub.d/10_linux_bls.in | 470 -------------------------------------------- + 3 files changed, 96 insertions(+), 478 deletions(-) + delete mode 100644 util/grub.d/10_linux_bls.in + +diff --git a/Makefile.util.def b/Makefile.util.def +index 1fa92caad4d..f3a699691bf 100644 +--- a/Makefile.util.def ++++ b/Makefile.util.def +@@ -517,13 +517,6 @@ script = { + condition = COND_HOST_LINUX; + }; + +-script = { +- name = '10_linux_bls'; +- common = util/grub.d/10_linux_bls.in; +- installdir = grubconf; +- condition = COND_HOST_LINUX; +-}; +- + script = { + name = '10_reset_boot_success'; + common = util/grub.d/10_reset_boot_success.in; +diff --git a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in +index b70dca27567..c72cc3246bb 100644 +--- a/util/grub.d/10_linux.in ++++ b/util/grub.d/10_linux.in +@@ -84,18 +84,86 @@ esac + + populate_header_warn() + { ++if [ "x${BLS_POPULATE_MENU}" = "xtrue" ]; then ++ bls_parser="10_linux script" ++else ++ bls_parser="blscfg command" ++fi + cat <&2 ++ ++ files=($(for bls in ${blsdir}/*.conf ; do ++ if ! [[ -e "${bls}" ]] ; then ++ continue ++ fi ++ bls="${bls%.conf}" ++ bls="${bls##*/}" ++ echo "${bls}" ++ done | ${kernel_sort} | tac)) || : ++ ++ for bls in "${files[@]}" ; do ++ read_config "${blsdir}/${bls}.conf" ++ ++ menu="${menu}menuentry '${title}' ${grub_arg} --id=${bls} {\n" ++ menu="${menu}\t linux ${linux} ${options}\n" ++ if [ -n "${initrd}" ] ; then ++ menu="${menu}\t initrd ${boot_prefix}${initrd}\n" ++ fi ++ menu="${menu}}\n\n" ++ done ++ # The printf command seems to be more reliable across shells for special character (\n, \t) evaluation ++ printf "$menu" ++} ++ + if [ "x${GRUB_ENABLE_BLSCFG}" = "xtrue" ]; then + if [ x$dirname = x/ ]; then + if [ -z "${prepare_root_cache}" ]; then +@@ -115,6 +183,26 @@ if [ "x${GRUB_ENABLE_BLSCFG}" = "xtrue" ]; then + prepare_grub_to_access_device_with_variable boot ${boot_device} + fi + ++ arch="$(uname -m)" ++ if [ "x${arch}" = "xppc64le" ] && [ -d /sys/firmware/opal ]; then ++ ++ petitboot_path="/sys/firmware/devicetree/base/ibm,firmware-versions/petitboot" ++ ++ if test -e ${petitboot_path}; then ++ read -a petitboot_version < ${petitboot_path} ++ petitboot_version="$(echo ${petitboot_version//v})" ++ major_version="$(echo ${petitboot_version} | cut -d . -f1)" ++ minor_version="$(echo ${petitboot_version} | cut -d . -f2)" ++ ++ if test -z ${petitboot_version} || test ${major_version} -lt 1 || \ ++ test ${major_version} -eq 1 -a ${minor_version} -lt 8; then ++ BLS_POPULATE_MENU="true" ++ fi ++ else ++ BLS_POPULATE_MENU="true" ++ fi ++ fi ++ + populate_header_warn + + cat << EOF +@@ -129,10 +217,17 @@ if [ "x${GRUB_ENABLE_BLSCFG}" = "xtrue" ]; then + if [ -z "\${kernelopts}" ]; then + set kernelopts="root=${LINUX_ROOT_DEVICE} ro ${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}" + fi ++EOF ++ ++ if [ "x${BLS_POPULATE_MENU}" = "xtrue" ]; then ++ populate_menu ++ else ++ cat << EOF + + insmod blscfg + blscfg + EOF ++ fi + + if [ "x${GRUB_GRUBENV_UPDATE}" = "xyes" ]; then + blsdir="/boot/loader/entries" +diff --git a/util/grub.d/10_linux_bls.in b/util/grub.d/10_linux_bls.in +deleted file mode 100644 +index 68fbedf2129..00000000000 +--- a/util/grub.d/10_linux_bls.in ++++ /dev/null +@@ -1,470 +0,0 @@ +-#! /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 . +- +-prefix="@prefix@" +-exec_prefix="@exec_prefix@" +-datarootdir="@datarootdir@" +- +-. "$pkgdatadir/grub-mkconfig_lib" +- +-export TEXTDOMAIN=@PACKAGE@ +-export TEXTDOMAINDIR="@localedir@" +- +-CLASS="--class gnu-linux --class gnu --class os --unrestricted" +- +-if [ "x${GRUB_DISTRIBUTOR}" = "x" ] ; then +- OS="$(eval $(grep PRETTY_NAME /etc/os-release) ; echo ${PRETTY_NAME})" +- CLASS="--class $(eval $(grep '^ID_LIKE=\|^ID=' /etc/os-release) ; [ -n "${ID_LIKE}" ] && echo ${ID_LIKE} || echo ${ID}) ${CLASS}" +-else +- OS="${GRUB_DISTRIBUTOR}" +- CLASS="--class $(echo ${GRUB_DISTRIBUTOR} | tr 'A-Z' 'a-z' | cut -d' ' -f1|LC_ALL=C sed 's,[^[:alnum:]_],_,g') ${CLASS}" +-fi +- +-# loop-AES arranges things so that /dev/loop/X can be our root device, but +-# the initrds that Linux uses don't like that. +-case ${GRUB_DEVICE} in +- /dev/loop/*|/dev/loop[0-9]) +- GRUB_DEVICE=`losetup ${GRUB_DEVICE} | sed -e "s/^[^(]*(\([^)]\+\)).*/\1/"` +- ;; +-esac +- +-# Default to disabling partition uuid support to maintian compatibility with +-# older kernels. +-GRUB_DISABLE_LINUX_PARTUUID=${GRUB_DISABLE_LINUX_PARTUUID-true} +- +-# btrfs may reside on multiple devices. We cannot pass them as value of root= parameter +-# and mounting btrfs requires user space scanning, so force UUID in this case. +-if ( [ "x${GRUB_DEVICE_UUID}" = "x" ] && [ "x${GRUB_DEVICE_PARTUUID}" = "x" ] ) \ +- || ( [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ] \ +- && [ "x${GRUB_DISABLE_LINUX_PARTUUID}" = "xtrue" ] ) \ +- || ( ! test -e "/dev/disk/by-uuid/${GRUB_DEVICE_UUID}" \ +- && ! test -e "/dev/disk/by-partuuid/${GRUB_DEVICE_PARTUUID}" ) \ +- || ( test -e "${GRUB_DEVICE}" && uses_abstraction "${GRUB_DEVICE}" lvm ); then +- LINUX_ROOT_DEVICE=${GRUB_DEVICE} +-elif [ "x${GRUB_DEVICE_UUID}" = "x" ] \ +- || [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ]; then +- LINUX_ROOT_DEVICE=PARTUUID=${GRUB_DEVICE_PARTUUID} +-else +- LINUX_ROOT_DEVICE=UUID=${GRUB_DEVICE_UUID} +-fi +- +-case x"$GRUB_FS" in +- xbtrfs) +- if [ "x${SUSE_BTRFS_SNAPSHOT_BOOTING}" = "xtrue" ]; then +- GRUB_CMDLINE_LINUX="${GRUB_CMDLINE_LINUX} \${extra_cmdline}" +- else +- rootsubvol="`make_system_path_relative_to_its_root /`" +- rootsubvol="${rootsubvol#/}" +- if [ "x${rootsubvol}" != x ]; then +- GRUB_CMDLINE_LINUX="rootflags=subvol=${rootsubvol} ${GRUB_CMDLINE_LINUX}" +- fi +- fi;; +- xzfs) +- rpool=`${grub_probe} --device ${GRUB_DEVICE} --target=fs_label 2>/dev/null || true` +- bootfs="`make_system_path_relative_to_its_root / | sed -e "s,@$,,"`" +- LINUX_ROOT_DEVICE="ZFS=${rpool}${bootfs}" +- ;; +-esac +- +-mktitle () +-{ +- local title_type +- local version +- local OS_NAME +- local OS_VERS +- +- title_type=$1 && shift +- version=$1 && shift +- +- OS_NAME="$(eval $(grep ^NAME= /etc/os-release) ; echo ${NAME})" +- OS_VERS="$(eval $(grep ^VERSION= /etc/os-release) ; echo ${VERSION})" +- +- case $title_type in +- recovery) +- title=$(printf '%s (%s) %s (recovery mode)' \ +- "${OS_NAME}" "${version}" "${OS_VERS}") +- ;; +- *) +- title=$(printf '%s (%s) %s' \ +- "${OS_NAME}" "${version}" "${OS_VERS}") +- ;; +- esac +- echo -n ${title} +-} +- +-title_correction_code= +- +-populate_header_warn() +-{ +-cat <&2 +- +- files=($(for bls in ${blsdir}/*.conf ; do +- if ! [[ -e "${bls}" ]] ; then +- continue +- fi +- bls="${bls%.conf}" +- bls="${bls##*/}" +- echo "${bls}" +- done | ${kernel_sort} | tac)) || : +- +- for bls in "${files[@]}" ; do +- read_config "${blsdir}/${bls}.conf" +- +- menu="${menu}menuentry '${title}' ${grub_arg} --id=${bls} {\n" +- menu="${menu}\t linux ${linux} ${options}\n" +- if [ -n "${initrd}" ] ; then +- menu="${menu}\t initrd ${boot_prefix}${initrd}\n" +- fi +- menu="${menu}}\n\n" +- done +- # The printf command seems to be more reliable across shells for special character (\n, \t) evaluation +- printf "$menu" +-} +- +-linux_entry () +-{ +- os="$1" +- version="$2" +- type="$3" +- isdebug="$4" +- args="$5" +- +- if [ -z "$boot_device_id" ]; then +- boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")" +- fi +- +- if [ "x${GRUB_ENABLE_BLSCFG}" = "xtrue" ]; then +- if [ x$dirname = x/ ]; then +- if [ -z "${prepare_root_cache}" ]; then +- prepare_grub_to_access_device ${GRUB_DEVICE} +- fi +- else +- if [ -z "${prepare_boot_cache}" ]; then +- prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} +- fi +- fi +- +- if [ -d /sys/firmware/efi ]; then +- bootefi_device="`${grub_probe} --target=device /boot/efi/`" +- prepare_grub_to_access_device_with_variable boot ${bootefi_device} +- else +- boot_device="`${grub_probe} --target=device /boot/`" +- prepare_grub_to_access_device_with_variable boot ${boot_device} +- fi +- +- populate_header_warn +- populate_menu +- +- if [ "x${GRUB_GRUBENV_UPDATE}" = "xyes" ]; then +- blsdir="/boot/loader/entries" +- [ -d "${blsdir}" ] && GRUB_BLS_FS="$(${grub_probe} --target=fs ${blsdir})" +- if [ "x${GRUB_BLS_FS}" = "xbtrfs" ] || [ "x${GRUB_BLS_FS}" = "xzfs" ]; then +- blsdir=$(make_system_path_relative_to_its_root "${blsdir}") +- if [ "x${blsdir}" != "x/loader/entries" ] && [ "x${blsdir}" != "x/boot/loader/entries" ]; then +- ${grub_editenv} - set blsdir="${blsdir}" +- fi +- fi +- +- ${grub_editenv} - set kernelopts="root=${linux_root_device_thisversion} ro ${args}" +- if [ -n "${GRUB_EARLY_INITRD_LINUX_CUSTOM}" ]; then +- ${grub_editenv} - set early_initrd="${GRUB_EARLY_INITRD_LINUX_CUSTOM}" +- fi +- fi +- +- exit 0 +- fi +- +- if [ x$type != xsimple ] ; then +- title=$(mktitle "$type" "$version") +- if [ x"$title" = x"$GRUB_ACTUAL_DEFAULT" ] || [ x"Previous Linux versions>$title" = x"$GRUB_ACTUAL_DEFAULT" ]; then +- replacement_title="$(echo "Advanced options for ${OS}" | sed 's,>,>>,g')>$(echo "$title" | sed 's,>,>>,g')" +- 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;" +- fi +- if [ x$isdebug = xdebug ]; then +- title="$title${GRUB_LINUX_DEBUG_TITLE_POSTFIX}" +- fi +- echo "menuentry '$(echo "$title" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-$version-$type-$boot_device_id' {" | sed "s/^/$submenu_indentation/" +- else +- echo "menuentry '$(echo "$os" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-simple-$boot_device_id' {" | sed "s/^/$submenu_indentation/" +- fi +- if [ x$type != xrecovery ] ; then +- save_default_entry | grub_add_tab +- fi +- +- # Use ELILO's generic "efifb" when it's known to be available. +- # FIXME: We need an interface to select vesafb in case efifb can't be used. +- if [ "x$GRUB_GFXPAYLOAD_LINUX" = x ]; then +- echo " load_video" | sed "s/^/$submenu_indentation/" +- if grep -qx "CONFIG_FB_EFI=y" "${config}" 2> /dev/null \ +- && grep -qx "CONFIG_VT_HW_CONSOLE_BINDING=y" "${config}" 2> /dev/null; then +- echo " set gfxpayload=keep" | sed "s/^/$submenu_indentation/" +- fi +- else +- if [ "x$GRUB_GFXPAYLOAD_LINUX" != xtext ]; then +- echo " load_video" | sed "s/^/$submenu_indentation/" +- fi +- echo " set gfxpayload=$GRUB_GFXPAYLOAD_LINUX" | sed "s/^/$submenu_indentation/" +- fi +- +- echo " insmod gzio" | sed "s/^/$submenu_indentation/" +- +- if [ x$dirname = x/ ]; then +- if [ -z "${prepare_root_cache}" ]; then +- prepare_root_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE} | grub_add_tab)" +- fi +- printf '%s\n' "${prepare_root_cache}" | sed "s/^/$submenu_indentation/" +- else +- 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/" +- fi +- sed "s/^/$submenu_indentation/" << EOF +- linux ${rel_dirname}/${basename} root=${linux_root_device_thisversion} ro ${args} +-EOF +- if test -n "${initrd}" ; then +- initrd_path= +- for i in ${initrd}; do +- initrd_path="${initrd_path} ${rel_dirname}/${i}" +- done +- sed "s/^/$submenu_indentation/" << EOF +- initrd $(echo $initrd_path) +-EOF +- fi +- if test -n "${fdt}" ; then +- sed "s/^/$submenu_indentation/" << EOF +- devicetree ${rel_dirname}/${fdt} +-EOF +- fi +- sed "s/^/$submenu_indentation/" << EOF +-} +-EOF +-} +- +-machine=`uname -m` +-case "x$machine" in +- xi?86 | xx86_64) +- list= +- for i in /boot/vmlinuz-* /vmlinuz-* /boot/kernel-* ; do +- if grub_file_is_not_garbage "$i" ; then list="$list $i" ; fi +- done ;; +- *) +- list= +- for i in /boot/vmlinuz-* /boot/vmlinux-* /vmlinuz-* /vmlinux-* /boot/kernel-* ; do +- if grub_file_is_not_garbage "$i" ; then list="$list $i" ; fi +- done ;; +-esac +- +-if [ "x${GRUB_ENABLE_BLSCFG}" = "xtrue" ]; then +- for i in /boot/ostree/*/vmlinuz-* ; do +- if grub_file_is_not_garbage "$i" ; then list="$list $i" ; fi +- done +-fi +- +-case "$machine" in +- i?86) GENKERNEL_ARCH="x86" ;; +- mips|mips64) GENKERNEL_ARCH="mips" ;; +- mipsel|mips64el) GENKERNEL_ARCH="mipsel" ;; +- arm*) GENKERNEL_ARCH="arm" ;; +- *) GENKERNEL_ARCH="$machine" ;; +-esac +- +-prepare_boot_cache= +-prepare_root_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 +- linux=`version_find_latest $list` +- if [ "x${GRUB_ENABLE_BLSCFG}" != "xtrue" ]; then +- gettext_printf "Found linux image: %s\n" "$linux" >&2 +- fi +- +- basename=`basename $linux` +- dirname=`dirname $linux` +- rel_dirname=`make_system_path_relative_to_its_root $dirname` +- version=`echo $basename | sed -e "s,^[^0-9]*-,,g"` +- alt_version=`echo $version | sed -e "s,\.old$,,g"` +- linux_root_device_thisversion="${LINUX_ROOT_DEVICE}" +- +- initrd_early= +- for i in ${GRUB_EARLY_INITRD_LINUX_STOCK} \ +- ${GRUB_EARLY_INITRD_LINUX_CUSTOM}; do +- if test -e "${dirname}/${i}" ; then +- initrd_early="${initrd_early} ${i}" +- fi +- done +- +- initrd_real= +- for i in "initrd.img-${version}" "initrd-${version}.img" "initrd-${version}.gz" \ +- "initrd-${version}" "initramfs-${version}.img" \ +- "initrd.img-${alt_version}" "initrd-${alt_version}.img" \ +- "initrd-${alt_version}" "initramfs-${alt_version}.img" \ +- "initramfs-genkernel-${version}" \ +- "initramfs-genkernel-${alt_version}" \ +- "initramfs-genkernel-${GENKERNEL_ARCH}-${version}" \ +- "initramfs-genkernel-${GENKERNEL_ARCH}-${alt_version}"; do +- if test -e "${dirname}/${i}" ; then +- initrd_real="${i}" +- break +- fi +- done +- +- initrd= +- if test -n "${initrd_early}" || test -n "${initrd_real}"; then +- initrd="${initrd_early} ${initrd_real}" +- +- initrd_display= +- for i in ${initrd}; do +- initrd_display="${initrd_display} ${dirname}/${i}" +- done +- if [ "x${GRUB_ENABLE_BLSCFG}" != "xtrue" ]; then +- gettext_printf "Found initrd image: %s\n" "$(echo $initrd_display)" >&2 +- fi +- fi +- +- fdt= +- for i in "dtb-${version}" "dtb-${alt_version}"; do +- if test -f "${dirname}/${i}/${GRUB_DEFAULT_DTB}" ; then +- fdt="${i}/${GRUB_DEFAULT_DTB}" +- break +- fi +- done +- +- config= +- for i in "${dirname}/config-${version}" "${dirname}/config-${alt_version}" "/etc/kernels/kernel-config-${version}" ; do +- if test -e "${i}" ; then +- config="${i}" +- break +- fi +- done +- +- initramfs= +- if test -n "${config}" ; then +- initramfs=`grep CONFIG_INITRAMFS_SOURCE= "${config}" | cut -f2 -d= | tr -d \"` +- fi +- +- if test -z "${initramfs}" && test -z "${initrd_real}" ; then +- # "UUID=" and "ZFS=" magic is parsed by initrd or initramfs. Since there's +- # no initrd or builtin initramfs, it can't work here. +- if [ "x${GRUB_DEVICE_PARTUUID}" = "x" ] \ +- || [ "x${GRUB_DISABLE_LINUX_PARTUUID}" = "xtrue" ]; then +- +- linux_root_device_thisversion=${GRUB_DEVICE} +- else +- linux_root_device_thisversion=PARTUUID=${GRUB_DEVICE_PARTUUID} +- fi +- fi +- +- 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 +- linux_entry "${OS}" "${version}" simple standard \ +- "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}" +- if [ "x$GRUB_LINUX_MAKE_DEBUG" = "xtrue" ]; then +- linux_entry "${OS}" "${version}" simple debug \ +- "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT} ${GRUB_CMDLINE_LINUX_DEBUG}" +- fi +- +- 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 'gnulinux-advanced-$boot_device_id' {" +- is_top_level=false +- fi +- +- linux_entry "${OS}" "${version}" advanced standard \ +- "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}" +- if [ "x$GRUB_LINUX_MAKE_DEBUG" = "xtrue" ]; then +- linux_entry "${OS}" "${version}" advanced debug \ +- "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT} ${GRUB_CMDLINE_LINUX_DEBUG}" +- fi +- +- if [ "x${GRUB_DISABLE_RECOVERY}" != "xtrue" ]; then +- linux_entry "${OS}" "${version}" recovery standard \ +- "single ${GRUB_CMDLINE_LINUX}" +- fi +- +- list=`echo $list | tr ' ' '\n' | fgrep -vx "$linux" | 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" diff --git a/99-grub-mkconfig.install b/99-grub-mkconfig.install index 339b3c7..f943da1 100755 --- a/99-grub-mkconfig.install +++ b/99-grub-mkconfig.install @@ -13,10 +13,25 @@ if [[ -e /sys/hypervisor/type ]] && grep -q "^xen$" /sys/hypervisor/type; then fi ARCH=$(uname -m) -# Older ppc64le OPAL firmware don't have BLS support so grub2-mkconfig has to -# be run to generate a GRUB config file that contains menuentry commands. -if [[ $ARCH = "ppc64le" ]]; then - RUN_MKCONFIG=true +# Older ppc64le OPAL firmware (petitboot version < 1.8.0) don't have BLS support +# so grub2-mkconfig has to be run to generate a config with menuentry commands. +if [[ $ARCH = "ppc64le" ]] && [ -d /sys/firmware/opal ]; then + + petitboot_path="/sys/firmware/devicetree/base/ibm,firmware-versions/petitboot" + + if test -e ${petitboot_path}; then + read -a petitboot_version < ${petitboot_path} + petitboot_version="$(echo ${petitboot_version//v})" + major_version="$(echo ${petitboot_version} | cut -d . -f1)" + minor_version="$(echo ${petitboot_version} | cut -d . -f2)" + + if test -z ${petitboot_version} || test ${major_version} -lt 1 || \ + test ${major_version} -eq 1 -a ${minor_version} -lt 8; then + RUN_MKCONFIG=true + fi + else + RUN_MKCONFIG=true + fi fi if [[ $DISABLE_BLS = "true" ]]; then diff --git a/grub.patches b/grub.patches index 1704303..5a75330 100644 --- a/grub.patches +++ b/grub.patches @@ -203,3 +203,5 @@ Patch0202: 0202-efi-ip4_config-Improve-check-to-detect-literal-IPv6-.patch Patch0203: 0203-efi-net-Print-a-debug-message-if-parsing-the-address.patch Patch0204: 0204-blscfg-return-NULL-instead-of-a-zero-length-array-in.patch Patch0205: 0205-grub-switch-to-blscfg-Update-grub2-binary-in-ESP-for.patch +Patch0206: 0206-grub-switch-to-blscfg-Only-mark-GRUB-as-BLS-supporte.patch +Patch0207: 0207-10_linux.in-Merge-logic-from-10_linux_bls-and-drop-t.patch diff --git a/grub2.spec b/grub2.spec index 0b74f16..70d10cc 100644 --- a/grub2.spec +++ b/grub2.spec @@ -9,7 +9,7 @@ Name: grub2 Epoch: 1 Version: 2.04 -Release: 11%{?dist} +Release: 12%{?dist} Summary: Bootloader with support for Linux, Multiboot and more License: GPLv3+ URL: http://www.gnu.org/software/grub/ @@ -387,11 +387,6 @@ rm -r /boot/grub2.tmp/ || : %files tools %attr(0644,root,root) %ghost %config(noreplace) %{_sysconfdir}/default/grub %config %{_sysconfdir}/grub.d/??_* -%ifarch ppc64 ppc64le -%exclude %{_sysconfdir}/grub.d/10_linux -%else -%exclude %{_sysconfdir}/grub.d/10_linux_bls -%endif %{_sysconfdir}/grub.d/README %{_userunitdir}/grub-boot-success.timer %{_userunitdir}/grub-boot-success.service @@ -509,6 +504,9 @@ rm -r /boot/grub2.tmp/ || : %endif %changelog +* Thu Apr 02 2020 Javier Martinez Canillas - 2.04-12 +- Merge 10_linux_bls logic into 10_linux and avoid issues if blsdir is set + * Thu Mar 26 2020 Javier Martinez Canillas - 2.04-11 - grub-switch-to-blscfg: Update grub2 binary in ESP for OSTree systems Related: rhbz#1751272