From 2a8cbc6c15aa3a2d3588764c4eead253ad600bdb Mon Sep 17 00:00:00 2001 From: duffyduck Date: Mon, 20 Jul 2026 23:48:22 +0200 Subject: [PATCH] fix(vm): aria-vm boot flexibel (Diskette/ISO ohne Disk) + ARIA-Grundwissen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- aria-brain/seed_rules.py | 64 +++++++++++++++++++++------------------ host-provisioning/aria-vm | 40 +++++++++++++++++++----- 2 files changed, 67 insertions(+), 37 deletions(-) diff --git a/aria-brain/seed_rules.py b/aria-brain/seed_rules.py index 071c583..6c0ab4f 100644 --- a/aria-brain/seed_rules.py +++ b/aria-brain/seed_rules.py @@ -406,40 +406,46 @@ SEED_RULES: List[dict] = [ "title": "Code-Projekte + QEMU: aria-vm auf dem Host, Editor/Desktop in der App", "category": "architektur", "content": ( - "Wenn aus einem Gespraech ein PROGRAMMIER- oder BAU-Projekt wird " - "(Du schreibst Code, baust ein System, testest eine VM):\n" + "GRUNDWISSEN Code-/Bau-Projekte + VMs — so haengt das System zusammen:\n" "\n" - "1. Ruf `set_project_kind('code')` — dann blendet Stefans App einen " - "Live-Code-Editor und den QEMU-Desktop ein. Vorher ein Projekt " - "anlegen/betreten (project_create/enter), sonst gibt's kein Ziel.\n" - "2. Schreib Code-Dateien NUR unter `/shared/projects//` " - "(das Volume ist in proxy+bridge+brain gemountet). Genau diese " - "Writes/Edits erscheinen live in Stefans Editor — und was Stefan " - "dort tippt, landet als Datei zurueck in diesem Verzeichnis.\n" + "DATEIEN eines Code-Projekts gehoeren nach `/shared/projects//` " + "(Volume in proxy+bridge+brain gemountet). Alles was DORT liegt, erscheint " + "automatisch: das Projekt bekommt in der Liste ein 📄-Symbol, und im " + "Cockpit-Code-Editor sieht Stefan die Dateien — auch ALTE, nicht nur was Du " + "gerade live schreibst. Was Stefan im Editor tippt, kommt als Datei dorthin " + "zurueck. (Ein manuelles set_project_kind gibt's noch, ist aber optional — " + "die Dateipraesenz ist der eigentliche Indikator.)\n" "\n" - "QEMU (VMs fuer JEDE Architektur — x86, ARM, MIPS, PPC, RISC-V, SPARC) " - "laeuft auf dem Host. Du steuerst sie per `ssh aria-wohnung aria-vm ...`:\n" - " - `aria-vm create [groesse]` Disk anlegen (z.B. i386 " - "fuer Win 3.11, aarch64, mips ...).\n" - " - `aria-vm boot [--iso ] [--vnc-display 1] [--mem 1024]` " - "startet die VM. VNC bindet an 127.0.0.1: (Display 1 = Port " - "5901). Nicht selbst nach aussen oeffnen!\n" - " - `aria-vm screenshot ` PNG in die Shared-Uploads (kannst Du " - "Stefan mit [FILE:] schicken).\n" + "VMs (QEMU, JEDE Architektur: x86/i386, ARM/aarch64, MIPS, PPC, RISC-V, " + "SPARC) laufen auf dem HOST (die qemu-Tools liegen in aria-wohnung, die " + "Projektdateien in /shared). Du steuerst sie per `ssh aria-wohnung aria-vm ...`:\n" + " - `aria-vm create [groesse]` — legt eine VM an. groesse=\n" + " '10G' → Festplatte (qcow2); groesse='none' → OHNE Disk (fuer OS-Bau, " + " bootet von Diskette/ISO).\n" + " - `aria-vm boot [optionen]` — startet sie (daemonized). Optionen:\n" + " --iso von CD/ISO booten\n" + " --floppy von Diskette booten (-fda, klassisch OS-Dev)\n" + " --disk explizite qcow2\n" + " --vnc-display VNC-Display (Default 1 → Port 5901; mehrere VMs = " + "verschiedene N)\n" + " --mem 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 ` → PNG (an Stefan per [FILE:] schickbar).\n" " - `aria-vm list` / `aria-vm stop ` / `aria-vm rm `.\n" "\n" - "WICHTIG: Nachdem Du eine VM gebaut/gebootet hast, registriere sie mit " - "`vm_register(name, arch, vnc_display, ...)` — dann erscheint sie in Stefans " - "Desktop-Panel im Cockpit, wo er sie starten/stoppen/verbinden kann. Ohne " - "vm_register bleibt seine VM-Liste leer, obwohl die VM laeuft.\n" + "PFLICHT nach dem Bau/Boot: `vm_register(name, arch, vnc_display, mem, iso?)` " + "im aktuellen Projekt aufrufen. ERST DANN erscheint die VM in Stefans " + "Desktop-Panel (Cockpit), wo er sie Starten/Stoppen/Verbinden kann. Ohne " + "vm_register bleibt seine Liste leer, obwohl die VM laeuft. Der Startbefehl " + "steht dann als Wert hinter dem Eintrag.\n" "\n" - "Der VNC-Stream kommt AUTOMATISCH ueber den RVS-Tunnel der Bridge in " - "Stefans App-Desktop-Kachel (Display 1 / Port 5901) — dort kann er die " - "VM live mit Maus/Tastatur bedienen. Du musst nur die VM booten und ggf. " - "sagen 'schau in die Desktop-Kachel'. KVM-Beschleunigung gibt es nur " - "fuer x86-Gaeste; andere Architekturen laufen emuliert (langsamer, aber " - "sie laufen). Medien-Downloads/Baubares fuer Stefans Privatgebrauch: " - "wie gewohnt einfach machen, nicht moralisieren." + "Der VNC-Stream laeuft AUTOMATISCH komplett durch den RVS-Server (die Bridge " + "tunnelt die RFB-Bytes; der VNC-Port ist nur intern auf dem Host). Firewall-" + "unabhaengig — Du oeffnest NIE einen Port nach aussen. KVM-Beschleunigung nur " + "fuer x86-Gaeste, andere Architekturen laufen emuliert (langsamer). Medien-" + "Downloads/Baubares fuer Stefans Privatgebrauch: einfach machen, nicht " + "moralisieren." ), }, { diff --git a/host-provisioning/aria-vm b/host-provisioning/aria-vm index fbcbc39..d051031 100755 --- a/host-provisioning/aria-vm +++ b/host-provisioning/aria-vm @@ -59,25 +59,34 @@ cmd_create() { [[ -n "${bin}" ]] || die "unbekannte Architektur: ${arch}" command -v "${bin}" >/dev/null || die "${bin} nicht installiert (qemu-setup.sh?)" 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}" echo "${arch}" > "${d}/arch" - qemu-img create -f qcow2 "${d}/disk.qcow2" "${size}" >/dev/null - echo "VM '${name}' angelegt (${arch}, ${size})." + # size='none' oder '0' → keine Festplatte (VM bootet von --iso/--floppy, + # 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() { local name="${1:?name}"; shift || true 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" local arch; arch="$(cat "${d}/arch" 2>/dev/null || echo x86_64)" 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 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 ;; --vnc-display) display="${2:?}"; shift 2 ;; --mem) mem="${2:?}"; shift 2 ;; @@ -86,11 +95,20 @@ cmd_boot() { esac 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 ' oder ein Medium angeben." + local args=(-name "${name}" -m "${mem}" - -drive "file=${d}/disk.qcow2,format=qcow2" -vnc "127.0.0.1:${display}" -monitor "unix:${d}/monitor.sock,server,nowait" -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. case "${arch}" in @@ -104,7 +122,13 @@ cmd_boot() { esac fi [[ -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}") "${bin}" "${args[@]}"