Files
duffyduckandClaude Opus 5 e88a80cb25 SPICE-Anzeige und USB-Weiterleitung fuer Wiederherstellungen
Der Anlass: ein Software-Schutzmodul am USB-Port. Normalerweise haengt so ein
Dongle an einem USB-Server im Netz - eine abgeschottete Wiederherstellung hat
aber keins. Ueber SPICE kommt das Geraet vom Rechner des Bedieners, nicht ueber
das Gastnetz. Die Maschine bleibt also ohne Netzwerk und hat trotzdem ihren
Dongle.

  --spice        SPICE-Anzeige (vga: qxl), zusaetzlich zu noVNC
  --usb <n>      so viele USB-Weiterleitungen
  --iso <volid>  Abbild als CD einlegen
  spice <vmid>   Verbindungsdatei fuer remote-viewer (.vv)

Zwei Dinge zeigte erst der Test, beide haetten die Sache still unbrauchbar
gemacht:

  vga: qxl zerstoert den geladenen Arbeitsspeicher. qxl hat 64 MB
  Grafikspeicher, die Vorgabe 16 - beim Laden kommt "Size mismatch:
  vga.vram", und die Maschine bleibt angehalten stehen. Wieder mit TASK OK.
  Wird jetzt abgelehnt, mit den drei Auswegen in der Meldung. Der dauerhafte
  ist, am Original 'vga: qxl' zu setzen - dann tragen alle kuenftigen
  Snapshots es mit und beides geht gleichzeitig.

  USB ohne SPICE ist wirkungslos. QEMU legt die usbredir-Geraete zwar an, aber
  ohne SPICE-Server gibt es keinen Kanal dafuer - spiceproxy sagt schlicht "no
  spice port". --usb schaltet die Anzeige deshalb mit ein.

Ausserdem korrigiert: in der .vv-Datei darf das Zertifikat nicht in echte
Zeilenumbrueche uebersetzt werden. virt-viewer erwartet die Zeichenfolge \n als
zwei Zeichen in einer einzigen Zeile; sonst steht nur die erste hinter "ca=".

tools/get-guest-tools.sh holt virtio-win auf einen ISO-Storage. Fuer den
Dongle wird davon nichts gebraucht - die Tools sind nur fuer Zwischenablage,
Aufloesung und Mauszeiger.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-03 12:52:00 +02:00

103 lines
3.8 KiB
Bash
Executable File

#!/bin/bash
# ---------------------------------------------------------------------
# Guest-Tools fuer wiederhergestellte Maschinen holen
#
# Die USB-Weiterleitung ueber SPICE braucht im Gast NICHTS - ein
# weitergereichter Dongle taucht dort als gewoehnliches USB-Geraet auf.
# Die Tools sind nur fuer den Komfort: Zwischenablage, automatische
# Aufloesung, sauberer Mauszeiger.
#
# Aufruf: ./get-guest-tools.sh [--storage <name>] [--list]
#
# --storage <name> wohin (Vorgabe: erster Storage mit iso-Inhalt)
# --list nur zeigen, was da ist
# -h, --help diese Hilfe
#
# Danach beim Anlegen einlegen:
# pvesnap-recovery live 802 --spice --usb 2 --iso <storage>:iso/<datei>
# ---------------------------------------------------------------------
set -euo pipefail
STORAGE=""
LIST=0
# virtio-win enthaelt fuer Windows alles auf einmal: den qxl-Grafiktreiber,
# den SPICE-Agenten und die virtio-Treiber. Fuer Linux gibt es nichts zu
# holen - dort genuegt das Paket der Distribution.
WINDOWS_URL="https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso"
WINDOWS_NAME="virtio-win.iso"
while [ $# -gt 0 ]; do
case "$1" in
--storage) STORAGE="${2:-}"; shift ;;
--storage=*) STORAGE="${1#*=}" ;;
--list) LIST=1 ;;
-h|--help) sed -n '2,19p' "$0" | sed 's/^#[[:space:]]\{0,1\}//'; exit 0 ;;
*) echo "Unbekannte Option: $1" >&2; exit 1 ;;
esac
shift
done
info() { printf '\033[1;32m==>\033[0m %s\n' "$*"; }
warn() { printf '\033[1;33m==>\033[0m %s\n' "$*" >&2; }
fail() { printf '\033[1;31m==>\033[0m %s\n' "$*" >&2; exit 1; }
command -v pvesm >/dev/null 2>&1 || fail "pvesm nicht gefunden - das gehoert auf einen Proxmox-Host."
# Storage bestimmen: der erste, der iso-Inhalt aufnimmt
if [ -z "$STORAGE" ]; then
STORAGE="$(pvesm status --content iso 2>/dev/null | awk 'NR>1 && $3=="active" {print $1; exit}')"
[ -n "$STORAGE" ] || fail "Kein Storage mit iso-Inhalt gefunden.
In der Proxmox-Oberflaeche unter Datacenter -> Storage bei einem Storage
den Inhalt 'ISO image' zulassen, oder --storage angeben."
fi
DIR="$(pvesm path "${STORAGE}:iso/x" 2>/dev/null | xargs dirname 2>/dev/null || true)"
[ -n "$DIR" ] || fail "Ablageort von '${STORAGE}' nicht ermittelbar."
if [ "$LIST" -eq 1 ]; then
info "Vorhandene Abbilder auf '${STORAGE}' (${DIR}):"
pvesm list "$STORAGE" --content iso 2>/dev/null | tail -n +2 | sed 's/^/ /' \
|| echo " (keine)"
exit 0
fi
info "Ablage: ${DIR}"
mkdir -p "$DIR"
# --- Windows ---------------------------------------------------------
TARGET="${DIR}/${WINDOWS_NAME}"
if [ -f "$TARGET" ]; then
info "Schon da: ${STORAGE}:iso/${WINDOWS_NAME} ($(du -h "$TARGET" | cut -f1))"
else
info "Hole virtio-win (Windows: qxl-Treiber, SPICE-Agent, virtio-Treiber)"
command -v curl >/dev/null 2>&1 || fail "curl wird benoetigt."
if curl -fL --progress-bar -o "${TARGET}.teil" "$WINDOWS_URL"; then
mv "${TARGET}.teil" "$TARGET"
info "Fertig: ${STORAGE}:iso/${WINDOWS_NAME} ($(du -h "$TARGET" | cut -f1))"
else
rm -f "${TARGET}.teil"
fail "Herunterladen fehlgeschlagen. Hat der Host Internetzugang?
Sonst von Hand holen und nach ${DIR} legen:
${WINDOWS_URL}"
fi
fi
cat <<EOF
Beim Anlegen einlegen:
pvesnap-recovery live <VMID> --spice --usb 2 --iso ${STORAGE}:iso/${WINDOWS_NAME}
Im Gast danach:
Windows Von der CD 'virtio-win-guest-tools.exe' ausfuehren.
Linux Nichts von der CD - das Paket der Distribution nehmen:
apt install spice-vdagent (Debian/Ubuntu)
dnf install spice-vdagent (Fedora/RHEL)
Fuer einen weitergereichten USB-Dongle braucht es davon nichts. Der taucht im
Gast als gewoehnliches USB-Geraet auf, sobald du ihn im remote-viewer unter
"USB-Geraeteauswahl" anhakst.
EOF