From 9d8813b3b4f69d9428e7759ed8a2956d8846b0fb Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 30 May 2017 22:45:10 +0900 Subject: [PATCH] kernel-install: support the case /etc/machine-id is missing or empty (#5975) Some .install plugins does not require that machine ID is set such as 20-grubby.install for Fedora and 50-depmod.install. To support such plugins to run without valid machine-id, this commit makes the following change: * if /etc/machine-id is missing or empty, create temporary directory and set its path to BOOT_DIR_ABS, * run the .install helpers with KERNEL_INSTALL_MACHINE_ID environment variable that'd be empty if /etc/machine-id is missing or empty. This may be useful for installing kernel for e.g. stateless systems which initialize machine-id while booting the systems. --- NEWS | 7 ++++++ src/kernel-install/90-loaderentry.install | 8 +++---- src/kernel-install/kernel-install | 27 +++++++++++++++-------- 3 files changed, 28 insertions(+), 14 deletions(-) diff --git a/NEWS b/NEWS index b980b646fe..2c595ee817 100644 --- a/NEWS +++ b/NEWS @@ -7,6 +7,13 @@ CHANGES WITH 234 in spe fallback was redundant and interfered with the [!UNAVAIL=return] suffix. See nss-resolve(8) for the recommended configuration. + * All kernel install plugins are called with the environment variable + KERNEL_INSTALL_MACHINE_ID which is set to the machine ID given by + /etc/machine-id. If the file is missing or empty, the variable is + empty and BOOT_DIR_ABS is the path of a temporary directory which is + removed after the all plugins exit. So, if KERNEL_INSTALL_MACHINE_ID + is empty, all plugins should not put anything in BOOT_DIR_ABS. + CHANGES WITH 233: * This version requires at least gperf 3.1 for building, 3.0 is not diff --git a/src/kernel-install/90-loaderentry.install b/src/kernel-install/90-loaderentry.install index a0bca05c9a..305ea8f5c9 100644 --- a/src/kernel-install/90-loaderentry.install +++ b/src/kernel-install/90-loaderentry.install @@ -7,13 +7,11 @@ KERNEL_VERSION="$2" BOOT_DIR_ABS="$3" KERNEL_IMAGE="$4" -if [[ -f /etc/machine-id ]]; then - read MACHINE_ID < /etc/machine-id +if ! [[ $KERNEL_INSTALL_MACHINE_ID ]]; then + exit 0 fi -if ! [[ $MACHINE_ID ]]; then - exit 1 -fi +MACHINE_ID=$KERNEL_INSTALL_MACHINE_ID BOOT_DIR="/$MACHINE_ID/$KERNEL_VERSION" BOOT_ROOT=${BOOT_DIR_ABS%$BOOT_DIR} diff --git a/src/kernel-install/kernel-install b/src/kernel-install/kernel-install index c7d9f4eea9..66bc4a6e8e 100644 --- a/src/kernel-install/kernel-install +++ b/src/kernel-install/kernel-install @@ -77,18 +77,15 @@ if [[ -f /etc/machine-id ]]; then read MACHINE_ID < /etc/machine-id fi -if ! [[ $MACHINE_ID ]]; then - echo "Could not determine your machine ID from /etc/machine-id." >&2 - echo "Please run 'systemd-machine-id-setup' as root. See man:machine-id(5)" >&2 - exit 1 -fi - if [[ ! $COMMAND ]] || [[ ! $KERNEL_VERSION ]]; then echo "Not enough arguments" >&2 exit 1 fi -if [[ -d /efi/loader/entries ]] || [[ -d /efi/$MACHINE_ID ]]; then +if ! [[ $MACHINE_ID ]]; then + BOOT_DIR_ABS=$(mktemp -d /tmp/kernel-install.XXXXX) || exit 1 + trap "rm -rf '$BOOT_DIR_ABS'" EXIT INT QUIT PIPE +elif [[ -d /efi/loader/entries ]] || [[ -d /efi/$MACHINE_ID ]]; then BOOT_DIR_ABS="/efi/$MACHINE_ID/$KERNEL_VERSION" elif [[ -d /boot/loader/entries ]] || [[ -d /boot/$MACHINE_ID ]]; then BOOT_DIR_ABS="/boot/$MACHINE_ID/$KERNEL_VERSION" @@ -102,6 +99,8 @@ else BOOT_DIR_ABS="/boot/$MACHINE_ID/$KERNEL_VERSION" fi +export KERNEL_INSTALL_MACHINE_ID=$MACHINE_ID + ret=0 readarray -t PLUGINS <<<"$( @@ -127,11 +126,20 @@ case $COMMAND in "$f" add "$KERNEL_VERSION" "$BOOT_DIR_ABS" "$KERNEL_IMAGE" x=$? if [[ $x == $SKIP_REMAINING ]]; then - exit 0 + ret=0 + break fi ((ret+=$x)) fi done + + if ! [[ $MACHINE_ID ]] && ! rmdir "$BOOT_DIR_ABS"; then + echo "Warning: In kernel-install plugins, requiring BOOT_DIR_ABS to be preset is deprecated." >&2 + echo " All plugins should not put anything in BOOT_DIR_ABS if the environment" >&2 + echo " variable KERNEL_INSTALL_MACHINE_ID is empty." >&2 + rm -rf "$BOOT_DIR_ABS" + ((ret+=$?)) + fi ;; remove) @@ -140,7 +148,8 @@ case $COMMAND in "$f" remove "$KERNEL_VERSION" "$BOOT_DIR_ABS" x=$? if [[ $x == $SKIP_REMAINING ]]; then - exit 0 + ret=0 + break fi ((ret+=$x)) fi