aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-09-26 09:56:27 +0200
committerDanilo M. <danix@danix.xyz>2026-09-26 09:56:27 +0200
commit2addd8bd31e146e91cc2489840da7b4ae1325eed (patch)
treeb1570e5c143a8b6167bf9b20990d8f9a0d189547
parent670dd1bb6ef62234eeb082c106b1f90dd31e04b7 (diff)
downloaddist-upgrade-2addd8bd31e146e91cc2489840da7b4ae1325eed.tar.gz
dist-upgrade-2addd8bd31e146e91cc2489840da7b4ae1325eed.zip
Fix bootability check to parse -f and ignore kernel-builtin modules
mkinitrd_command_generator often emits no -m and relies on -f for the root filesystem, so the module check silently skipped. Parse -f as well and drop any name listed in modules.builtin. Also fix the parser itself: two greps inside a { } group share one stdin stream, so the second grep saw EOF and returned nothing. Replaced with a single awk pass.
-rwxr-xr-xdist-upgrade38
1 files changed, 28 insertions, 10 deletions
diff --git a/dist-upgrade b/dist-upgrade
index b3bd627..578410f 100755
--- a/dist-upgrade
+++ b/dist-upgrade
@@ -70,7 +70,12 @@ version_from_listing() {
}
explicit_modules() {
- grep -oE '\-m [^\\ ]+' | tail -n1 | sed -E 's/^-m //; s/[[:space:]]+$//; s/"//g' | tr ':' '\n' | sed '/^$/d'
+ awk '{
+ for (i = 1; i <= NF; i++) {
+ if ($i == "-f") { print $(i+1) }
+ else if ($i == "-m") { n = split($(i+1), m, ":"); for (j = 1; j <= n; j++) print m[j] }
+ }
+ }' | tr -d '"' | sed '/^$/d'
}
initrd_modules() { initrd_list "$1" | modules_from_listing | sort -u; }
@@ -88,6 +93,10 @@ newest_kernel() {
needed_modules() { "$MKINITRD_GEN" -k "$1" 2>/dev/null | explicit_modules; }
+builtin_modules() {
+ grep -oE '[^/]+\.ko' "/lib/modules/$1/modules.builtin" 2>/dev/null | sed 's/\.ko$//' | norm | sort -u
+}
+
run_slackpkg() {
if [ "$INTERACTIVE" -eq 1 ]; then
slackpkg "$@"
@@ -107,7 +116,7 @@ snapshot_initrd() {
}
check_initrd() {
- local target newver iver needed have missing dropped before
+ local target newver iver needed have missing dropped before gen_ok
if [ ! -e "$INITRD" ] && [ ! -L "$INITRD" ]; then
info "No initrd at $INITRD (huge-kernel setup?), skipping initrd checks."
@@ -126,21 +135,26 @@ check_initrd() {
info "initrd kernel version matches installed kernel: $iver"
fi
+ gen_ok=0
if [ -x "$MKINITRD_GEN" ] && [ -n "$newver" ] && [ -d "/lib/modules/$newver" ]; then
- needed=$(needed_modules "$newver" | sort -u)
- else
- needed=""
+ gen_ok=1
+ needed=$(needed_modules "$newver" | norm | sort -u)
+ if [ -f "/lib/modules/$newver/modules.builtin" ]; then
+ needed=$(comm -23 <(printf '%s\n' "$needed") <(builtin_modules "$newver"))
+ fi
fi
- if [ -z "$needed" ]; then
- info "note: no module list derived from mkinitrd_command_generator, skipping bootability check."
+ if [ "$gen_ok" -eq 0 ]; then
+ info "note: mkinitrd_command_generator unavailable for $newver, skipping bootability check."
+ elif [ -z "$needed" ]; then
+ info "initrd needs no extra modules: everything the boot config requires is built into the kernel."
else
have=$(initrd_modules "$INITRD" | norm | sort -u)
- missing=$(comm -23 <(printf '%s\n' "$needed" | norm | sort -u) <(printf '%s\n' "$have"))
+ missing=$(comm -23 <(printf '%s\n' "$needed") <(printf '%s\n' "$have"))
if [ -n "$missing" ]; then
warn "initrd $target is missing modules the boot config needs: $(printf '%s' "$missing" | tr '\n' ' ')"
else
- info "initrd contains every module mkinitrd_command_generator says is needed."
+ info "initrd contains every module mkinitrd_command_generator says are needed: $(printf '%s' "$needed" | tr '\n' ' ')"
fi
fi
@@ -177,10 +191,14 @@ lib/modules/6.18.50/modules.dep'
dropped=$(comm -23 <(printf '%s\n' "$a") <(printf '%s\n' "$b"))
[ "$dropped" = "usbhid" ] || die "self-test: module diff failed: '$dropped'"
- got=$(printf '# mkinitrd -c -k 6.18.50 -f ext4 -r /dev/sda2 -m ext4:usbhid \\\n# -u -o /boot/initrd-6.18.50.img\n' | explicit_modules | sort | tr '\n' ' ')
+ got=$(printf '# mkinitrd -c -k 6.18.50 -f ext4 -r /dev/sda2 -m ext4:usbhid \\\n# -u -o /boot/initrd-6.18.50.img\n' | explicit_modules | sort -u | tr '\n' ' ')
expected="ext4 usbhid "
[ "$got" = "$expected" ] || die "self-test: mkinitrd parse failed: '$got'"
+ got=$(printf 'mkinitrd -c -k 6.18.50 -f ext4 -r /dev/sda2 -u -o /boot/initrd-6.18.50.img\n' | explicit_modules | sort -u | tr '\n' ' ')
+ expected="ext4 "
+ [ "$got" = "$expected" ] || die "self-test: mkinitrd -f parse failed: '$got'"
+
d=$(mktemp -d) || die "self-test: mktemp failed"
mkdir -p "$d/lib/modules/6.18.50/kernel/fs/ext4" "$d/lib/modules/6.18.50/kernel/drivers/usb/host"
: > "$d/lib/modules/6.18.50/kernel/fs/ext4/ext4.ko"