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:
+35
-29
@@ -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."
|
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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"
|
||||||
|
# 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
|
qemu-img create -f qcow2 "${d}/disk.qcow2" "${size}" >/dev/null
|
||||||
echo "VM '${name}' angelegt (${arch}, ${size})."
|
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[@]}"
|
||||||
|
|||||||
Reference in New Issue
Block a user