Add run-ubuntu2604.py with its QEMU config files and NoCloud seed. The launcher follows the Debian 13 one, with UBUNTU_VM_ settings and SSH forwarded to host port 2225. The seed injects the current user's SSH public key, uses the USTC mirror (ubuntu-ports on arm64) and installs the GNOME desktop on first boot. Update vm-images for the ubuntu2604 image target. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Kwxp2XWvKnuEBifnCbhyX5
63 lines
2.1 KiB
Bash
Executable File
63 lines
2.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
script_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
|
|
output="${1:-${script_dir}/seed.iso}"
|
|
files=(user-data meta-data)
|
|
|
|
# Public key injected into user-data: $SSH_PUBKEY_FILE, else the first
|
|
# ~/.ssh/id_*.pub, else the first key offered by ssh-agent.
|
|
pubkey=""
|
|
if [[ -n "${SSH_PUBKEY_FILE:-}" ]]; then
|
|
pubkey="$(head -n1 -- "${SSH_PUBKEY_FILE}")"
|
|
else
|
|
for f in "${HOME}"/.ssh/id_ed25519.pub "${HOME}"/.ssh/id_*.pub; do
|
|
if [[ -f "$f" ]]; then pubkey="$(head -n1 -- "$f")"; break; fi
|
|
done
|
|
if [[ -z "$pubkey" ]] && command -v ssh-add >/dev/null 2>&1; then
|
|
pubkey="$(ssh-add -L 2>/dev/null | head -n1 || true)"
|
|
fi
|
|
fi
|
|
if [[ "$pubkey" != ssh-* && "$pubkey" != ecdsa-* && "$pubkey" != sk-* ]]; then
|
|
printf 'Error: no SSH public key found; set SSH_PUBKEY_FILE.\n' >&2
|
|
exit 1
|
|
fi
|
|
|
|
work="$(mktemp -d)"
|
|
trap 'rm -rf -- "${work}"' EXIT
|
|
template="$(<"${script_dir}/user-data")"
|
|
printf '%s\n' "${template//@SSH_PUBKEY@/${pubkey}}" > "${work}/user-data"
|
|
cp -- "${script_dir}/meta-data" "${work}/meta-data"
|
|
if [[ -f "${script_dir}/network-config" ]]; then
|
|
cp -- "${script_dir}/network-config" "${work}/network-config"
|
|
fi
|
|
|
|
mkdir -p "$(dirname -- "$output")"
|
|
|
|
if [[ -f "${script_dir}/network-config" ]]; then
|
|
files+=(network-config)
|
|
fi
|
|
|
|
if command -v cloud-localds >/dev/null 2>&1; then
|
|
args=()
|
|
if [[ -f "${script_dir}/network-config" ]]; then
|
|
args+=(--network-config="${work}/network-config")
|
|
fi
|
|
cloud-localds "${args[@]}" "${output}" \
|
|
"${work}/user-data" "${work}/meta-data"
|
|
elif command -v xorriso >/dev/null 2>&1; then
|
|
xorriso -as mkisofs -quiet -volid cidata -joliet -rock \
|
|
-output "${output}" "${files[@]/#/${work}/}"
|
|
elif command -v genisoimage >/dev/null 2>&1; then
|
|
genisoimage -quiet -output "${output}" -volid cidata -joliet -rock \
|
|
"${files[@]/#/${work}/}"
|
|
elif command -v mkisofs >/dev/null 2>&1; then
|
|
mkisofs -quiet -output "${output}" -volid cidata -joliet -rock \
|
|
"${files[@]/#/${work}/}"
|
|
else
|
|
printf 'Error: install cloud-image-utils, xorriso, genisoimage, or mkisofs.\n' >&2
|
|
exit 1
|
|
fi
|
|
|
|
printf 'Created %s\n' "${output}"
|