diff options
author | Lennart Poettering <lennart@poettering.net> | 2022-02-09 14:29:19 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2022-03-11 11:34:34 +0100 |
commit | 3907044ffa568aedf076d0f9807489ec78f87502 (patch) | |
tree | fcd73fd37dc0bd18735cf574a502202c8e0733d1 /src/kernel-install | |
parent | kernel-install: don't try to persist used machine ID locally (diff) | |
download | systemd-3907044ffa568aedf076d0f9807489ec78f87502.tar.xz systemd-3907044ffa568aedf076d0f9807489ec78f87502.zip |
kernel-install: add a new $ENTRY_TOKEN variable for naming boot entries
This cleans up naming of boot loader spec boot entries a bit (i.e. the
naming of the .conf snippet files, and the directory in $BOOT where the
kernel images and initrds are placed), and isolates it from the actual machine
ID concept.
Previously there was a sinlge concept for both things, because typically
the entries are just named after the machine ID. However one could also
use a different identifier, i.e. not a 128bit ID in which cases issues
pop up everywhere. For example, the "machine-id" field in the generated
snippets would not be a machine ID anymore, and the newly added
systemd.machine_id= kernel parameter would possibly get passed invalid
data.
Hence clean this up:
$MACHINE_ID → always a valid 128bit ID.
$ENTRY_TOKEN → usually the $MACHINE_ID but can be any other string too.
This is used to name the directory to put kernels/initrds in. It's also
used for naming the *.conf snippets that implement the Boot Loader Type
1 spec.
Diffstat (limited to 'src/kernel-install')
-rw-r--r-- | src/kernel-install/90-loaderentry.install | 11 | ||||
-rwxr-xr-x | src/kernel-install/kernel-install | 21 |
2 files changed, 23 insertions, 9 deletions
diff --git a/src/kernel-install/90-loaderentry.install b/src/kernel-install/90-loaderentry.install index 046771169c..46261a2c11 100644 --- a/src/kernel-install/90-loaderentry.install +++ b/src/kernel-install/90-loaderentry.install @@ -29,6 +29,7 @@ INITRD_OPTIONS_SHIFT=4 [ "$KERNEL_INSTALL_LAYOUT" = "bls" ] || exit 0 MACHINE_ID="$KERNEL_INSTALL_MACHINE_ID" +ENTRY_TOKEN="$KERNEL_INSTALL_ENTRY_TOKEN" BOOT_ROOT="$KERNEL_INSTALL_BOOT_ROOT" BOOT_MNT="$(stat -c %m "$BOOT_ROOT")" @@ -41,10 +42,10 @@ fi case "$COMMAND" in remove) [ "$KERNEL_INSTALL_VERBOSE" -gt 0 ] && \ - echo "Removing $BOOT_ROOT/loader/entries/$MACHINE_ID-$KERNEL_VERSION*.conf" + echo "Removing $BOOT_ROOT/loader/entries/$ENTRY_TOKEN-$KERNEL_VERSION*.conf" exec rm -f \ - "$BOOT_ROOT/loader/entries/$MACHINE_ID-$KERNEL_VERSION.conf" \ - "$BOOT_ROOT/loader/entries/$MACHINE_ID-$KERNEL_VERSION+"*".conf" + "$BOOT_ROOT/loader/entries/$ENTRY_TOKEN-$KERNEL_VERSION.conf" \ + "$BOOT_ROOT/loader/entries/$ENTRY_TOKEN-$KERNEL_VERSION+"*".conf" ;; add) ;; @@ -80,9 +81,9 @@ if [ -r /etc/kernel/tries ]; then echo "/etc/kernel/tries does not contain an integer." >&2 exit 1 fi - LOADER_ENTRY="$BOOT_ROOT/loader/entries/$MACHINE_ID-$KERNEL_VERSION+$TRIES.conf" + LOADER_ENTRY="$BOOT_ROOT/loader/entries/$ENTRY_TOKEN-$KERNEL_VERSION+$TRIES.conf" else - LOADER_ENTRY="$BOOT_ROOT/loader/entries/$MACHINE_ID-$KERNEL_VERSION.conf" + LOADER_ENTRY="$BOOT_ROOT/loader/entries/$ENTRY_TOKEN-$KERNEL_VERSION.conf" fi if ! [ -d "$ENTRY_DIR_ABS" ]; then diff --git a/src/kernel-install/kernel-install b/src/kernel-install/kernel-install index e94aa79bc6..75a31c62d4 100755 --- a/src/kernel-install/kernel-install +++ b/src/kernel-install/kernel-install @@ -97,7 +97,19 @@ fi [ -z "$MACHINE_ID" ] && [ -r /etc/machine-id ] && read -r MACHINE_ID </etc/machine-id [ -z "$MACHINE_ID" ] && MACHINE_ID="$(systemd-id128 new)" -[ -z "$BOOT_ROOT" ] && for suff in "$MACHINE_ID" "loader/entries"; do +# Now that we determined the machine ID to use, let's determine the "token" for +# the boot loader entry to generate. We use that for naming the directory below +# $BOOT where we want to place the kernel/initrd and related resources, as well +# for naming the .conf boot loader spec entry. Typically this is just the +# machine ID, but it can be anything else, too, if we are told so. +[ -z "$ENTRY_TOKEN" ] && [ -r /etc/kernel/entry-token ] && read -r ENTRY_TOKEN </etc/kernel/entry-token +[ -z "$ENTRY_TOKEN" ] && ENTRY_TOKEN="$MACHINE_ID" + +# NB: The $MACHINE_ID is guaranteed to be a valid machine ID, but +# $ENTRY_TOKEN can be any string that fits into a VFAT filename, though +# typically is just the machine ID. + +[ -z "$BOOT_ROOT" ] && for suff in "$ENTRY_TOKEN" "loader/entries"; do for pref in "/efi" "/boot" "/boot/efi" ; do if [ -d "$pref/$suff" ]; then BOOT_ROOT="$pref" @@ -117,14 +129,14 @@ done if [ -z "$layout" ]; then # Administrative decision: if not present, some scripts generate into /boot. - if [ -d "$BOOT_ROOT/$MACHINE_ID" ]; then + if [ -d "$BOOT_ROOT/$ENTRY_TOKEN" ]; then layout="bls" else layout="other" fi fi -ENTRY_DIR_ABS="$BOOT_ROOT/$MACHINE_ID/$KERNEL_VERSION" +ENTRY_DIR_ABS="$BOOT_ROOT/$ENTRY_TOKEN/$KERNEL_VERSION" # Provide a directory where to store generated initrds cleanup() { @@ -136,6 +148,7 @@ trap cleanup EXIT KERNEL_INSTALL_STAGING_AREA="$(mktemp -d -t -p /tmp kernel-install.staging.XXXXXXX)" export KERNEL_INSTALL_MACHINE_ID="$MACHINE_ID" +export KERNEL_INSTALL_ENTRY_TOKEN="$ENTRY_TOKEN" export KERNEL_INSTALL_BOOT_ROOT="$BOOT_ROOT" export KERNEL_INSTALL_LAYOUT="$layout" export KERNEL_INSTALL_INITRD_GENERATOR="$initrd_generator" @@ -168,7 +181,7 @@ case "$COMMAND" in fi if [ "$MAKE_ENTRY_DIR_ABS" -eq 0 ]; then - # Compatibility with earlier versions that used the presence of $BOOT_ROOT/$MACHINE_ID + # Compatibility with earlier versions that used the presence of $BOOT_ROOT/$ENTRY_TOKEN # to signal to 00-entry-directory to create $ENTRY_DIR_ABS # to serve as the indication to use or to not use the BLS if [ "$KERNEL_INSTALL_VERBOSE" -gt 0 ]; then |