]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
kernel-install: search harder for kernel image/initrd drop-in dir
authorLennart Poettering <lennart@poettering.net>
Thu, 10 Feb 2022 13:27:22 +0000 (14:27 +0100)
committerLennart Poettering <lennart@poettering.net>
Fri, 11 Mar 2022 10:34:34 +0000 (11:34 +0100)
If not explicitly configured, let's search a bit harder for the
ENTRY_TOKEN, and let's try the machine ID, the IMAGE_ID and ID fields of
/etc/os-release and finally "Default", all below potential $XBOOTLDR.

src/kernel-install/kernel-install

index 75a31c62d42d1f0ad8c2665c20f161ec606afbc1..c42c40592a911983ae5a84afcae038c130be2582 100755 (executable)
@@ -103,29 +103,50 @@ fi
 # 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"
+if [ -z "$ENTRY_TOKEN" ]; then
+    # If not configured explicitly, then use a few candidates: the machine ID,
+    # the IMAGE_ID= and ID= fields from /etc/os-release and finally the fixed
+    # string "Default"
+    ENTRY_TOKEN_SEARCH="$MACHINE_ID"
+    [ -r /etc/os-release ] && . /etc/os-release
+    [ -n "$IMAGE_ID" ] && ENTRY_TOKEN_SEARCH="$ENTRY_TOKEN_SEARCH $IMAGE_ID"
+    [ -n "$ID" ] && ENTRY_TOKEN_SEARCH="$ENTRY_TOKEN_SEARCH $ID"
+    ENTRY_TOKEN_SEARCH="$ENTRY_TOKEN_SEARCH Default"
+else
+    ENTRY_TOKEN_SEARCH="$ENTRY_TOKEN"
+fi
 
 # 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
+[ -z "$BOOT_ROOT" ] && for suff in $ENTRY_TOKEN_SEARCH; do
+    for pref in "/efi" "/boot" "/boot/efi"; do
         if [ -d "$pref/$suff" ]; then
             BOOT_ROOT="$pref"
+            ENTRY_TOKEN="$suff"
             break 2
         fi
     done
 done
 
+[ -z "$BOOT_ROOT" ] && for pref in "/efi" "/boot" "/boot/efi"; do
+    if [ -d "$pref/loader/entries" ]; then
+        BOOT_ROOT="$pref"
+        break
+    fi
+done
+
 [ -z "$BOOT_ROOT" ] && for pref in "/efi" "/boot/efi"; do
     if mountpoint -q "$pref"; then
         BOOT_ROOT="$pref"
         break
     fi
 done
+
 [ -z "$BOOT_ROOT" ] && BOOT_ROOT="/boot"
 
+[ -z "$ENTRY_TOKEN" ] && ENTRY_TOKEN="$MACHINE_ID"
 
 if [ -z "$layout" ]; then
     # Administrative decision: if not present, some scripts generate into /boot.