diff options
| author | Danilo M. <danix@danix.xyz> | 2026-09-26 09:56:27 +0200 |
|---|---|---|
| committer | Danilo M. <danix@danix.xyz> | 2026-09-26 09:56:27 +0200 |
| commit | 2addd8bd31e146e91cc2489840da7b4ae1325eed (patch) | |
| tree | b1570e5c143a8b6167bf9b20990d8f9a0d189547 | |
| parent | 670dd1bb6ef62234eeb082c106b1f90dd31e04b7 (diff) | |
| download | dist-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-x | dist-upgrade | 38 |
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" |
