From d835d77c35e41329223ff6b2f748699cc96bca9d Mon Sep 17 00:00:00 2001 From: bluebluesoda <300733005+bluebluesoda@users.noreply.github.com> Date: Wed, 7 Oct 2026 04:48:55 +0000 Subject: [PATCH] fix(install): enable Debian contrib so the ZFS packages resolve MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - zfsutils-linux (and the zfs-dkms it Recommends) live in Debian's 'contrib' component — ZFS's CDDL license is not DFSG-free — but a minimal Debian install enables only 'main' (+ 'non-free-firmware'). Without contrib, apt reports "Package 'zfsutils-linux' has no installation candidate", zfs-dkms is never installed and the DKMS rebuild then dies with "no ZFS DKMS version found". Enable contrib idempotently before installing, in both the deb822 (*.sources) and the classic one-line formats, touching only the deb.debian.org archive so a third-party repo is never given a contrib it lacks. Mirrors the existing Ubuntu 'universe' handling. - Strip the trailing colon from 'dkms status' version fields: a module whose postinst ran before the headers existed registers as "zfs/: added" (no kernel), and 'dkms build zfs/:' is invalid, so the fallback rebuild failed even once contrib was enabled. Co-authored-by: CommandCodeBot --- scripts/00-check.sh | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/scripts/00-check.sh b/scripts/00-check.sh index 3281d33..45cfff4 100755 --- a/scripts/00-check.sh +++ b/scripts/00-check.sh @@ -95,6 +95,27 @@ log "storage backend: $STORAGE" # fails at runtime. visudo ships with the sudo package. KERNEL_REL=$(uname -r) BASE_DEPS="sudo ca-certificates python3 tar xz-utils nftables zstd curl gpg" + +# zfsutils-linux and zfs-dkms live in Debian's 'contrib' component (ZFS's +# CDDL license is not DFSG-free), but a minimal Debian install enables only +# 'main' (plus 'non-free-firmware' when firmware was selected). Without +# contrib, 'apt-get install zfsutils-linux' fails with "has no installation +# candidate" and zfs-dkms is never pulled in, so no module can be built and +# the pool cannot be created. Enable contrib idempotently, covering both the +# deb822 (*.sources) and the classic one-line formats. Only the Debian +# archive itself is touched — appending contrib to a third-party repo would +# make 'apt-get update' fail. +enable_debian_contrib(){ + local f + while IFS= read -r f; do + [[ -z "$f" ]] && continue + if grep -qE '^URIs:.*deb\.debian\.org' "$f"; then + sed -i -E '/^Components:/ { /[[:space:]]main([[:space:]]|$)/ { /contrib/! s/[[:space:]]*$/ contrib/ } }' "$f" + fi + sed -i -E '/^deb[[:space:]].*deb\.debian\.org/ { /[[:space:]]main([[:space:]]|$)/ { /contrib/! s/[[:space:]]*$/ contrib/ } }' "$f" + done < <(ls /etc/apt/sources.list /etc/apt/sources.list.d/*.sources /etc/apt/sources.list.d/*.list 2>/dev/null) +} + if [[ "$STORAGE" == "zfs" ]]; then BASE_DEPS="$BASE_DEPS zfsutils-linux" if [[ "$ID" == "debian" ]]; then @@ -104,6 +125,11 @@ if [[ "$STORAGE" == "zfs" ]]; then esac BASE_DEPS="$BASE_DEPS $KERNEL_HEADERS_PKG build-essential" log "Debian detected — ZFS module will be DKMS-compiled (headers: $KERNEL_HEADERS_PKG)" + if ! grep -rhE '^[^#].*\bcontrib\b' /etc/apt/sources.list /etc/apt/sources.list.d/ 2>/dev/null | grep -q .; then + log "enabling the Debian contrib component (needed for zfsutils-linux / zfs-dkms)" + enable_debian_contrib + apt-get update -qq + fi else log "Ubuntu detected — ZFS module is prebuilt in the kernel, no compilation" # Ubuntu minimal/cloud images often ship with only the 'main' component; the @@ -157,7 +183,10 @@ fi if [[ "$STORAGE" == "zfs" ]]; then if ! modprobe zfs 2>/dev/null; then log "ZFS module missing for $KERNEL_REL — rebuilding via dkms (takes a minute)..." - DKMS_VERSIONS=$(dkms status 2>/dev/null | awk -F'[,/ ]+' '/^zfs\//{print $2}' | sort -u) + # A module whose postinst ran before the headers existed is registered + # without a kernel ("zfs/: added"); the field carries a trailing + # colon there, so strip it (dkms build rejects "zfs/:"). + DKMS_VERSIONS=$(dkms status 2>/dev/null | awk -F'[,/ ]+' '/^zfs\//{v=$2; sub(/:$/,"",v); if(v!="") print v}' | sort -u) [[ -n "$DKMS_VERSIONS" ]] || die "no ZFS DKMS version found — check 'dkms status'" for v in $DKMS_VERSIONS; do if ! DKMS_OUT=$(dkms build "zfs/$v" -k "$KERNEL_REL" 2>&1); then