#!/usr/bin/env bash # Rebuild a guest's cloud-init seed image and publish it into the libvirt pool. # Run on the lab host. # # ./rebuild-seed.sh 1 # # The same content lives in three places: the source YAML, the ISO, and the # uploaded pool volume. Editing the YAML alone changes nothing, which is why # this is a script and not a set of remembered commands. # # A rebuilt seed only takes effect on a freshly created VM. cloud-init runs its # per-instance modules once per instance-id, so an existing guest ignores it. set -euo pipefail N="${1:?usage: rebuild-seed.sh <1|2>}" CLOUD_DIR="${CLOUD_DIR:-$HOME/workspace/cloud}" POOL="${POOL:-default}" export LIBVIRT_DEFAULT_URI="${LIBVIRT_DEFAULT_URI:-qemu:///system}" cd "$CLOUD_DIR" src="kc-lab-${N}.yaml" iso="seed-kc-lab-${N}.iso" meta="meta-kc-lab-${N}" [ -f "$src" ] || { echo "missing $CLOUD_DIR/$src" >&2; exit 1; } # A fresh instance-id makes cloud-init treat the guest as new and re-run the # per-instance modules. printf 'instance-id: kc-lab-%s-%s\nlocal-hostname: kc-lab-%s\n' \ "$N" "$(date +%s)" "$N" > "$meta" # NoCloud looks for a volume labelled cidata holding files named exactly # user-data and meta-data. -graft-points renames them inside the image so no # staging directory is needed. xorrisofs -quiet -output "$iso" -volid CIDATA -joliet -rock -graft-points \ "/user-data=${src}" "/meta-data=${meta}" size="$(stat -c%s "$iso")" virsh vol-delete --pool "$POOL" "$iso" >/dev/null 2>&1 || true virsh vol-create-as "$POOL" "$iso" "$size" --format raw >/dev/null virsh vol-upload --pool "$POOL" "$iso" "$iso" echo "$iso published to pool '$POOL' ($size bytes)" echo "attach it as a virtio disk, not a SATA cdrom:" echo " --disk vol=${POOL}/${iso},device=disk,bus=virtio,readonly=on" echo "Debian genericcloud images carry no AHCI driver, so a SATA cdrom is invisible" echo "to the guest and cloud-init fails with no error anywhere."