Currently the BLS snippets are named ostree-$ID-$VARIANT_ID-$index.conf, but the BLS config files are actually sorted by using the version field which is the inverse of the index. In most places, _ostree_sysroot_read_boot_loader_configs() is used to get the BLS files and this function already returns them sorted by the version field. The only place where the index trailing number is used is in the ostree-grub-generator script that lists the BLS files to populate the grub config file. But for some bootloaders the BLS filename is the criteria for sorting by taking the filename as a string version. So on these bootloaders the BLS entries will be listed in the reverse order. To avoid that, change the BLS snippets filename to have the version field instead of the index and also to have the version before deployment name. Make the filenames to be of the form ostree-$version-$ID-$VARIANT_ID.conf so the version is before the deployment name. Signed-off-by: Javier Martinez Canillas <javierm@redhat.com> Closes: #1654 Approved by: cgwalters
108 lines
3.0 KiB
Bash
108 lines
3.0 KiB
Bash
#!/bin/sh
|
|
|
|
# The builtin grub.cfg generator.
|
|
#
|
|
# This script is called by ostree/src/libostree/ostree-bootloader-grub2.c whenever
|
|
# boot loader configuration file needs to be updated. It can be used as a template
|
|
# for a custom grub.cfg generator. What to consider when writing a custom grub.cfg
|
|
# generator:
|
|
#
|
|
# - The populate_menu() function converts boot loader entries as defined by
|
|
# https://www.freedesktop.org/wiki/Specifications/BootLoaderSpec/ into GRUB2
|
|
# menuentry sections. This is the core logic that is required by OSTree
|
|
# based system.
|
|
#
|
|
# - Embedded systems: Be aware that this script is executed not only on a host machine by OS
|
|
# installer, but also on a target device, thus think about shell portability. A target device
|
|
# for example might be using busybox with a limited shell.
|
|
#
|
|
# Feel free to edit this script to fit your requirements.
|
|
|
|
set -e
|
|
|
|
script=$(basename ${0})
|
|
# Atomically safe location where to generete grub.cfg when executing system upgrade.
|
|
new_grub2_cfg=${2}
|
|
entries_path=$(dirname $new_grub2_cfg)/entries
|
|
|
|
read_config()
|
|
{
|
|
config_file=${1}
|
|
title=""
|
|
initrd=""
|
|
options=""
|
|
linux=""
|
|
|
|
while read -r line
|
|
do
|
|
record=$(echo ${line} | cut -f 1 -d ' ')
|
|
value=$(echo ${line} | cut -s -f2- -d ' ')
|
|
case "${record}" in
|
|
"title")
|
|
title=${value}
|
|
;;
|
|
"initrd")
|
|
initrd=${value}
|
|
;;
|
|
"linux")
|
|
linux=${value}
|
|
;;
|
|
"options")
|
|
options=${value}
|
|
;;
|
|
esac
|
|
done < ${config_file}
|
|
|
|
if [ -z "${title}" ]; then
|
|
title="(Untitled)"
|
|
fi
|
|
}
|
|
|
|
populate_menu()
|
|
{
|
|
# Default to /boot if OSTREE_BOOT_PARTITION is not set and /boot is on the same device than ostree/repo
|
|
if [ -z ${OSTREE_BOOT_PARTITION+x} ] && [ -d /boot/ostree ] && [ -d /ostree/repo ] && [ $(stat -c '%d' /boot/ostree) -eq $(stat -c '%d' /ostree/repo) ]; then
|
|
boot_prefix="/boot"
|
|
else
|
|
boot_prefix="${OSTREE_BOOT_PARTITION}"
|
|
fi
|
|
for config in $(ls -v -r $entries_path/*.conf); do
|
|
read_config ${config}
|
|
menu="${menu}menuentry '${title}' {\n"
|
|
menu="${menu}\t linux ${boot_prefix}${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" >> ${new_grub2_cfg}
|
|
}
|
|
|
|
populate_warning()
|
|
{
|
|
cat >> ${new_grub2_cfg} <<EOF
|
|
# This file was generated by ${script}. Do not modify the generated file - all changes will
|
|
# be lost the next time file is regenerated. For more details refer to the ${script} script.
|
|
EOF
|
|
}
|
|
|
|
populate_header()
|
|
{
|
|
cat >> ${new_grub2_cfg} <<EOF
|
|
serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1
|
|
default=boot
|
|
timeout=10
|
|
|
|
EOF
|
|
}
|
|
|
|
generate_grub2_cfg()
|
|
{
|
|
populate_warning
|
|
populate_header
|
|
populate_menu
|
|
}
|
|
|
|
generate_grub2_cfg
|