diff --git a/VERSION b/VERSION index cac2dec..72920d9 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.3.88 +1.3.89 diff --git a/deploy/bootstrap/lib/template.sh b/deploy/bootstrap/lib/template.sh index 03d8bd1..d0069eb 100644 --- a/deploy/bootstrap/lib/template.sh +++ b/deploy/bootstrap/lib/template.sh @@ -237,10 +237,51 @@ fetch_cloud_image() { return 0 } +# Aus der Ausgabe von `guestfish … part-list`: die Nummer der Partition, die am +# WEITESTEN HINTEN auf der Platte beginnt. +# +# Eigene Funktion, damit sie sich ohne Proxmox und ohne libguestfs gegen +# aufgezeichnete Ausgaben durchspielen lässt — sie ist der Kern von Falle 2 und +# hat schon einmal das Falsche gesagt. +last_partition_number() { + awk ' + /part_num:/ { num = $2 } + /part_start:/ { if ($2 + 0 > max + 0) { max = $2 + 0; last = num } } + END { print last } + ' +} + +# Aus derselben Ausgabe: wo eine bestimmte Partition beginnt (für die Meldung). +partition_start() { + awk -v want="$1" ' + /part_num:/ { num = $2 } + /part_start:/ { if (num == want) { print $2; exit } } + ' +} + # FALLE 2, geprüft statt angenommen. # -# Zwei Aussagen: kein LVM, und die Root-Partition ist die letzte auf der Platte. -# `virt-filesystems` beantwortet beide, ohne das Abbild einzuhängen. +# Zwei Aussagen: kein LVM, und hinter der Root-Partition liegt nichts mehr. +# +# --------------------------------------------------------------------------- +# Warum nach dem ANFANG gefragt wird und nicht nach der Nummer +# --------------------------------------------------------------------------- +# +# Hier stand ein Vergleich der Partitions-NAMEN: die letzte war die, die +# `sort -V` nach hinten sortiert. Das ist bei Debians Cloud-Abbild genau falsch +# herum und hat es am 1. August 2026 abgelehnt — dem einzigen Abbild, für das +# diese Prüfung je gedacht war. +# +# Debian legt die BIOS-Boot- und die EFI-Partition an den ANFANG der Platte und +# nummeriert sie als 14 und 15; die Wurzel ist Nummer 1 und liegt physisch +# dahinter. Das ist Absicht und ist genau die Eigenschaft, die Falle 2 verlangt: +# nur so kann `growpart` die Wurzel über den freien Rest ausdehnen. Nach Namen +# sortiert sah `/dev/sda15` wie die letzte aus, und die Prüfung verweigerte ein +# Abbild, das ihre Bedingung erfüllte. +# +# `guestfish part-list` gibt Anfangs-Offsets in Bytes. Danach wird gefragt, +# weil das die Frage IST — „nichts liegt dahinter" ist eine Aussage über die +# Platte, nicht über die Benennung. verify_image_layout() { _image="$1" @@ -255,17 +296,35 @@ verify_image_layout() { return 1 fi - # Die Wurzel ist die Partition mit der höchsten Nummer, wenn sie die letzte - # ist. Anders gefragt: gibt es hinter der Root-Partition noch eine? - _last_part="$(printf '%s\n' "$_fs" | awk '/^\/dev\/[a-z]+[0-9]+/ { print $1 }' | sort -V | tail -1)" _root_part="$(virt-filesystems --long -a "$_image" 2>/dev/null | awk '$0 !~ /swap/ && /ext4|xfs|btrfs/ { print $1; }' | sort -V | tail -1)" - - if [ -n "$_last_part" ] && [ -n "$_root_part" ] && [ "$_last_part" != "$_root_part" ]; then - log "Die Root-Partition (${_root_part}) ist nicht die letzte auf der Platte (${_last_part}). GrowGuestFilesystem wächst nur die letzte." + if [ -z "$_root_part" ]; then + log 'Keine Wurzel im Abbild gefunden (kein ext4/xfs/btrfs) — Abbildaufbau nicht prüfbar' return 1 fi - log "Abbildaufbau in Ordnung: kein LVM, Wurzel auf ${_root_part:-(unbestimmt)} als letzte Partition" + _root_num="$(printf '%s' "$_root_part" | sed 's/.*[^0-9]\([0-9][0-9]*\)$/\1/')" + + _parts="$(guestfish --ro -a "$_image" run : part-list /dev/sda 2>/dev/null)" + if [ -z "$_parts" ]; then + log 'guestfish part-list liefert nichts — die Lage der Partitionen ist nicht prüfbar' + return 1 + fi + + _last_num="$(printf '%s\n' "$_parts" | last_partition_number)" + + if [ -z "$_last_num" ]; then + log 'part-list liefert keine Partitionen — Abbildaufbau nicht prüfbar' + return 1 + fi + + if [ "$_last_num" != "$_root_num" ]; then + # Die Zahlen mit in die Meldung: scheitert das je wieder, soll die + # nächste Person die Platte im Protokoll sehen und nicht raten müssen. + log "Hinter der Wurzel (Partition ${_root_num}, Beginn $(printf '%s\n' "$_parts" | partition_start "$_root_num") Bytes) beginnt noch Partition ${_last_num} (Beginn $(printf '%s\n' "$_parts" | partition_start "$_last_num") Bytes). GrowGuestFilesystem vergrößert nur, was nichts hinter sich hat." + return 1 + fi + + log "Abbildaufbau in Ordnung: kein LVM, Wurzel auf ${_root_part} und nichts dahinter" return 0 }