fix(vm): aria-vm boot flexibel (Diskette/ISO ohne Disk) + ARIA-Grundwissen

Start aus der App scheiterte: aria-vm boot verlangte zwingend disk.qcow2 —
basic_os bootet aber von floppy.img/ISO ohne Festplatte (OS-Bau). Jetzt:
- aria-vm boot: Disk optional; --floppy (-fda), --iso, --disk; Auto-Erkennung
  von disk.qcow2/floppy.img/cdrom.iso im VM-Ordner; Boot-Reihenfolge automatisch
  (ISO→d, nur Diskette→a, sonst c); braucht nur >=1 Boot-Medium.
- aria-vm create: groesse='none' → VM ohne Disk.
- Seed-Regel (Grundwissen) neu: volle aria-vm-Optionen inkl. disk-los, PFLICHT
  vm_register nach Bau (sonst leere Desktop-Liste), Dateien in /shared/projects,
  VNC komplett durch RVS. So weiss ARIA selbst was zu tun ist.

Live getestet auf dem Host: boot basicos (floppy-Autodetect) → laeuft :5901.
aria-vm bereits auf den Host gepusht. bash -n / py_compile OK.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-20 23:48:22 +02:00
co-authored by Claude Opus 4.8
parent 7e14107361
commit 2a8cbc6c15
2 changed files with 67 additions and 37 deletions
+35 -29
View File
@@ -406,40 +406,46 @@ SEED_RULES: List[dict] = [
"title": "Code-Projekte + QEMU: aria-vm auf dem Host, Editor/Desktop in der App", "title": "Code-Projekte + QEMU: aria-vm auf dem Host, Editor/Desktop in der App",
"category": "architektur", "category": "architektur",
"content": ( "content": (
"Wenn aus einem Gespraech ein PROGRAMMIER- oder BAU-Projekt wird " "GRUNDWISSEN Code-/Bau-Projekte + VMs — so haengt das System zusammen:\n"
"(Du schreibst Code, baust ein System, testest eine VM):\n"
"\n" "\n"
"1. Ruf `set_project_kind('code')` — dann blendet Stefans App einen " "DATEIEN eines Code-Projekts gehoeren nach `/shared/projects/<projekt-id>/` "
"Live-Code-Editor und den QEMU-Desktop ein. Vorher ein Projekt " "(Volume in proxy+bridge+brain gemountet). Alles was DORT liegt, erscheint "
"anlegen/betreten (project_create/enter), sonst gibt's kein Ziel.\n" "automatisch: das Projekt bekommt in der Liste ein 📄-Symbol, und im "
"2. Schreib Code-Dateien NUR unter `/shared/projects/<projekt-id>/` " "Cockpit-Code-Editor sieht Stefan die Dateien — auch ALTE, nicht nur was Du "
"(das Volume ist in proxy+bridge+brain gemountet). Genau diese " "gerade live schreibst. Was Stefan im Editor tippt, kommt als Datei dorthin "
"Writes/Edits erscheinen live in Stefans Editor — und was Stefan " "zurueck. (Ein manuelles set_project_kind gibt's noch, ist aber optional — "
"dort tippt, landet als Datei zurueck in diesem Verzeichnis.\n" "die Dateipraesenz ist der eigentliche Indikator.)\n"
"\n" "\n"
"QEMU (VMs fuer JEDE Architektur x86, ARM, MIPS, PPC, RISC-V, SPARC) " "VMs (QEMU, JEDE Architektur: x86/i386, ARM/aarch64, MIPS, PPC, RISC-V, "
"laeuft auf dem Host. Du steuerst sie per `ssh aria-wohnung aria-vm ...`:\n" "SPARC) laufen auf dem HOST (die qemu-Tools liegen in aria-wohnung, die "
" - `aria-vm create <name> <arch> [groesse]` Disk anlegen (z.B. i386 " "Projektdateien in /shared). Du steuerst sie per `ssh aria-wohnung aria-vm ...`:\n"
"fuer Win 3.11, aarch64, mips ...).\n" " - `aria-vm create <name> <arch> [groesse]` — legt eine VM an. groesse=\n"
" - `aria-vm boot <name> [--iso <pfad>] [--vnc-display 1] [--mem 1024]` " " '10G' → Festplatte (qcow2); groesse='none' → OHNE Disk (fuer OS-Bau, "
"startet die VM. VNC bindet an 127.0.0.1:<display> (Display 1 = Port " " bootet von Diskette/ISO).\n"
"5901). Nicht selbst nach aussen oeffnen!\n" " - `aria-vm boot <name> [optionen]` — startet sie (daemonized). Optionen:\n"
" - `aria-vm screenshot <name>` PNG in die Shared-Uploads (kannst Du " " --iso <pfad> von CD/ISO booten\n"
"Stefan mit [FILE:] schicken).\n" " --floppy <pfad> von Diskette booten (-fda, klassisch OS-Dev)\n"
" --disk <pfad> explizite qcow2\n"
" --vnc-display <N> VNC-Display (Default 1 → Port 5901; mehrere VMs = "
"verschiedene N)\n"
" --mem <MB> RAM (Default 1024)\n"
" Medien im VM-Ordner (disk.qcow2/floppy.img/cdrom.iso) werden auto-"
"erkannt. Es MUSS mindestens ein Boot-Medium da sein.\n"
" - `aria-vm screenshot <name>` → PNG (an Stefan per [FILE:] schickbar).\n"
" - `aria-vm list` / `aria-vm stop <name>` / `aria-vm rm <name>`.\n" " - `aria-vm list` / `aria-vm stop <name>` / `aria-vm rm <name>`.\n"
"\n" "\n"
"WICHTIG: Nachdem Du eine VM gebaut/gebootet hast, registriere sie mit " "PFLICHT nach dem Bau/Boot: `vm_register(name, arch, vnc_display, mem, iso?)` "
"`vm_register(name, arch, vnc_display, ...)` — dann erscheint sie in Stefans " "im aktuellen Projekt aufrufen. ERST DANN erscheint die VM in Stefans "
"Desktop-Panel im Cockpit, wo er sie starten/stoppen/verbinden kann. Ohne " "Desktop-Panel (Cockpit), wo er sie Starten/Stoppen/Verbinden kann. Ohne "
"vm_register bleibt seine VM-Liste leer, obwohl die VM laeuft.\n" "vm_register bleibt seine Liste leer, obwohl die VM laeuft. Der Startbefehl "
"steht dann als Wert hinter dem Eintrag.\n"
"\n" "\n"
"Der VNC-Stream kommt AUTOMATISCH ueber den RVS-Tunnel der Bridge in " "Der VNC-Stream laeuft AUTOMATISCH komplett durch den RVS-Server (die Bridge "
"Stefans App-Desktop-Kachel (Display 1 / Port 5901) — dort kann er die " "tunnelt die RFB-Bytes; der VNC-Port ist nur intern auf dem Host). Firewall-"
"VM live mit Maus/Tastatur bedienen. Du musst nur die VM booten und ggf. " "unabhaengig — Du oeffnest NIE einen Port nach aussen. KVM-Beschleunigung nur "
"sagen 'schau in die Desktop-Kachel'. KVM-Beschleunigung gibt es nur " "fuer x86-Gaeste, andere Architekturen laufen emuliert (langsamer). Medien-"
"fuer x86-Gaeste; andere Architekturen laufen emuliert (langsamer, aber " "Downloads/Baubares fuer Stefans Privatgebrauch: einfach machen, nicht "
"sie laufen). Medien-Downloads/Baubares fuer Stefans Privatgebrauch: " "moralisieren."
"wie gewohnt einfach machen, nicht moralisieren."
), ),
}, },
{ {
+32 -8
View File
@@ -59,25 +59,34 @@ cmd_create() {
[[ -n "${bin}" ]] || die "unbekannte Architektur: ${arch}" [[ -n "${bin}" ]] || die "unbekannte Architektur: ${arch}"
command -v "${bin}" >/dev/null || die "${bin} nicht installiert (qemu-setup.sh?)" command -v "${bin}" >/dev/null || die "${bin} nicht installiert (qemu-setup.sh?)"
local d; d="$(vm_dir "${name}")" local d; d="$(vm_dir "${name}")"
[[ -e "${d}/disk.qcow2" ]] && die "VM '${name}' existiert schon" [[ -f "${d}/arch" ]] && die "VM '${name}' existiert schon"
mkdir -p "${d}" mkdir -p "${d}"
echo "${arch}" > "${d}/arch" echo "${arch}" > "${d}/arch"
qemu-img create -f qcow2 "${d}/disk.qcow2" "${size}" >/dev/null # size='none' oder '0' → keine Festplatte (VM bootet von --iso/--floppy,
echo "VM '${name}' angelegt (${arch}, ${size})." # z.B. OS-Entwicklung von Diskette). Sonst eine qcow2-Disk anlegen.
if [[ "${size}" == "none" || "${size}" == "0" ]]; then
echo "VM '${name}' angelegt (${arch}, ohne Disk — bootet von ISO/Diskette)."
else
qemu-img create -f qcow2 "${d}/disk.qcow2" "${size}" >/dev/null
echo "VM '${name}' angelegt (${arch}, ${size})."
fi
} }
cmd_boot() { cmd_boot() {
local name="${1:?name}"; shift || true local name="${1:?name}"; shift || true
local d; d="$(vm_dir "${name}")" local d; d="$(vm_dir "${name}")"
[[ -f "${d}/disk.qcow2" ]] || die "VM '${name}' nicht gefunden (erst 'create')" [[ -f "${d}/arch" || -f "${d}/disk.qcow2" ]] || die "VM '${name}' nicht gefunden (erst 'create')"
vm_running "${name}" && die "VM '${name}' laeuft bereits" vm_running "${name}" && die "VM '${name}' laeuft bereits"
local arch; arch="$(cat "${d}/arch" 2>/dev/null || echo x86_64)" local arch; arch="$(cat "${d}/arch" 2>/dev/null || echo x86_64)"
local bin; bin="$(qemu_bin_for "${arch}")" local bin; bin="$(qemu_bin_for "${arch}")"
local iso="" bootdev="c" display=1 mem=1024 machine="" local iso="" floppy="" disk="" bootdev="" display=1 mem=1024 machine=""
while [[ $# -gt 0 ]]; do while [[ $# -gt 0 ]]; do
case "$1" in case "$1" in
--iso) iso="${2:?}"; bootdev="d"; shift 2 ;; --iso) iso="${2:?}"; shift 2 ;;
--floppy) floppy="${2:?}"; shift 2 ;; # -fda (Disketten-Boot, OS-Dev)
--disk) disk="${2:?}"; shift 2 ;; # explizite qcow2 statt Auto
--boot) bootdev="${2:?}"; shift 2 ;; # Boot-Reihenfolge (a/c/d)
--disk-boot) bootdev="c"; shift ;; --disk-boot) bootdev="c"; shift ;;
--vnc-display) display="${2:?}"; shift 2 ;; --vnc-display) display="${2:?}"; shift 2 ;;
--mem) mem="${2:?}"; shift 2 ;; --mem) mem="${2:?}"; shift 2 ;;
@@ -86,11 +95,20 @@ cmd_boot() {
esac esac
done done
# Auto-Erkennung der Medien im VM-Ordner, falls nicht explizit angegeben.
[[ -z "${disk}" && -f "${d}/disk.qcow2" ]] && disk="${d}/disk.qcow2"
[[ -z "${floppy}" && -f "${d}/floppy.img" ]] && floppy="${d}/floppy.img"
[[ -z "${iso}" && -f "${d}/cdrom.iso" ]] && iso="${d}/cdrom.iso"
[[ -n "${disk}${floppy}${iso}" ]] || \
die "Keine Boot-Medien fuer '${name}' (disk.qcow2 / --iso / --floppy). Erst 'create <name> <arch> <groesse>' oder ein Medium angeben."
local args=(-name "${name}" -m "${mem}" local args=(-name "${name}" -m "${mem}"
-drive "file=${d}/disk.qcow2,format=qcow2"
-vnc "127.0.0.1:${display}" -vnc "127.0.0.1:${display}"
-monitor "unix:${d}/monitor.sock,server,nowait" -monitor "unix:${d}/monitor.sock,server,nowait"
-pidfile "${d}/pid" -daemonize) -pidfile "${d}/pid" -daemonize)
[[ -n "${disk}" ]] && args+=(-drive "file=${disk},format=qcow2")
[[ -n "${floppy}" ]] && args+=(-fda "${floppy}")
[[ -n "${iso}" ]] && args+=(-cdrom "${iso}")
# KVM nur fuer x86 auf x86-Host. # KVM nur fuer x86 auf x86-Host.
case "${arch}" in case "${arch}" in
@@ -104,7 +122,13 @@ cmd_boot() {
esac esac
fi fi
[[ -n "${machine}" ]] && args+=(-M "${machine}") [[ -n "${machine}" ]] && args+=(-M "${machine}")
[[ -n "${iso}" ]] && args+=(-cdrom "${iso}")
# Boot-Reihenfolge: explizit, sonst automatisch (ISO→d, nur Diskette→a, sonst c).
if [[ -z "${bootdev}" ]]; then
if [[ -n "${iso}" ]]; then bootdev="d"
elif [[ -n "${floppy}" && -z "${disk}" ]]; then bootdev="a"
else bootdev="c"; fi
fi
args+=(-boot "${bootdev}") args+=(-boot "${bootdev}")
"${bin}" "${args[@]}" "${bin}" "${args[@]}"