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>
103 lines
3.8 KiB
Bash
Executable File
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
|