From 0d8032b5ff62e5c9a34de3ef2387ed3a12455eca Mon Sep 17 00:00:00 2001 From: Votre Nom Date: Fri, 15 May 2026 08:37:57 +0200 Subject: [PATCH] =?UTF-8?q?Phase=2013.1=20=E2=80=94=20script=20run-qemu.sh?= =?UTF-8?q?=20pour=20le=20test=20runtime?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bootstrap automatique des étapes 1 et 2 de la procédure 13.1 : mount harddrive.img via redoxfs (FUSE) → copy compositor + client dans /usr/bin → umount → exec make qemu. Sécurité : - set -euo pipefail - trap EXIT/INT/TERM garantit l'umount même sur Ctrl+C - pré-vérifs sur les 4 fichiers requis (image, redoxfs, 2 binaires) - mountpoint -q + boucle 5 s pour confirmer le mount FUSE - sync avant umount Options : - ./run-qemu.sh cycle complet - ./run-qemu.sh --no-qemu juste mount + copy + umount (CI / itération) - ./run-qemu.sh --help affiche le bloc de doc en tête de fichier - REDOX_SRC=... override le chemin du checkout redox-src Une fois Redox bootée : Ctrl+Alt+F2 → root/password → RUST_LOG=info redox-wl-compositor & sleep 1 ; redox-wl-real-client-simple-window Leyoda 2026 – GPLv3 --- run-qemu.sh | 119 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100755 run-qemu.sh diff --git a/run-qemu.sh b/run-qemu.sh new file mode 100755 index 0000000..d971aa5 --- /dev/null +++ b/run-qemu.sh @@ -0,0 +1,119 @@ +#!/usr/bin/env bash +# Phase 13.1 — bootstrap runtime test : copie compositor + client tiers +# dans l'image Redox, démonte, lance `make qemu`. +# +# Usage : +# ./run-qemu.sh # cycle complet (mount, copy, umount, qemu) +# ./run-qemu.sh --no-qemu # juste mount + copy + umount (pas de boot) +# REDOX_SRC=/autre/chemin ./run-qemu.sh +# +# Pré-requis : +# - Avoir cross-compilé les deux binaires : +# cd crates/redox-wl-compositor && redoxer build --release +# cd crates/redox-wl-real-client-simple-window && redoxer build --release +# - redoxfs accessible dans REDOX_SRC/build/fstools/bin/ +# - L'image harddrive.img présente dans REDOX_SRC/build/x86_64/desktop/ +# - PAS de QEMU déjà ouvert sur la même image (corromprait le disque). +# +# Une fois Redox bootée : +# Ctrl+Alt+F2 → VT 2 (texte, sans Orbital) +# login root / password +# RUST_LOG=info redox-wl-compositor & +# sleep 1 +# redox-wl-real-client-simple-window +set -euo pipefail + +ROOT="$(cd "$(dirname "$0")" && pwd)" +REDOX_SRC="${REDOX_SRC:-$HOME/Projets/Redox/redox-src}" +IMAGE="$REDOX_SRC/build/x86_64/desktop/harddrive.img" +REDOXFS="$REDOX_SRC/build/fstools/bin/redoxfs" +MOUNT="${MOUNT:-/tmp/redox-mnt}" + +COMPOSITOR_BIN="$ROOT/crates/redox-wl-compositor/target/x86_64-unknown-redox/release/redox-wl-compositor" +CLIENT_BIN="$ROOT/crates/redox-wl-real-client-simple-window/target/x86_64-unknown-redox/release/redox-wl-real-client-simple-window" + +NO_QEMU=0 +for arg in "$@"; do + case "$arg" in + --no-qemu) NO_QEMU=1 ;; + -h|--help) + awk '/^# / { sub(/^# ?/, ""); print; next } /^[^#]/ { exit }' "$0" + exit 0 + ;; + *) + echo "ERR : option inconnue : $arg" >&2 + exit 1 + ;; + esac +done + +cleanup() { + local exit_code=$? + if mountpoint -q "$MOUNT" 2>/dev/null; then + echo "==> cleanup : umount $MOUNT" + fusermount -u "$MOUNT" 2>/dev/null || true + fi + if [[ -d "$MOUNT" ]] && ! mountpoint -q "$MOUNT" 2>/dev/null; then + rmdir "$MOUNT" 2>/dev/null || true + fi + exit $exit_code +} +trap cleanup EXIT INT TERM + +# --- 1. Pré-vérifs --- +missing=0 +for f in "$IMAGE" "$REDOXFS" "$COMPOSITOR_BIN" "$CLIENT_BIN"; do + if [[ ! -e "$f" ]]; then + echo "ERR : introuvable : $f" >&2 + missing=1 + fi +done +if [[ $missing -ne 0 ]]; then + echo >&2 + echo "Si un binaire manque, cross-compile via :" >&2 + echo " cd crates/ && redoxer build --release" >&2 + echo "Si redoxfs/image manquent, ajuste REDOX_SRC=... (actuel : $REDOX_SRC)" >&2 + exit 1 +fi + +# --- 2. Mount --- +mkdir -p "$MOUNT" +echo "==> monter $IMAGE -> $MOUNT" +"$REDOXFS" "$IMAGE" "$MOUNT" & +REDOXFS_PID=$! + +# Attendre que le mount soit effectif (redoxfs prend ~100-500 ms à se setup) +for i in {1..50}; do + if mountpoint -q "$MOUNT"; then + break + fi + sleep 0.1 + if [[ $i -eq 50 ]]; then + echo "ERR : mount $MOUNT n'a pas abouti après 5s" >&2 + kill $REDOXFS_PID 2>/dev/null || true + exit 2 + fi +done +echo " monté (pid redoxfs=$REDOXFS_PID)" + +# --- 3. Copy --- +echo "==> copier les binaires dans /usr/bin/" +cp -v "$COMPOSITOR_BIN" "$MOUNT/usr/bin/" +cp -v "$CLIENT_BIN" "$MOUNT/usr/bin/" + +# --- 4. umount avant make qemu (sinon QEMU et FUSE se battent sur le même fichier) --- +echo "==> démonter $MOUNT" +sync +fusermount -u "$MOUNT" +rmdir "$MOUNT" 2>/dev/null || true +trap - EXIT INT TERM # plus rien à cleaner + +if [[ $NO_QEMU -eq 1 ]]; then + echo "==> --no-qemu : on s'arrête là." + exit 0 +fi + +# --- 5. Boot QEMU --- +echo "==> lancer make qemu (Ctrl+Alt+F2 pour VT2 ; login root / password)" +cd "$REDOX_SRC" +exec make qemu audio=no QEMU_USER_FLAGS="-k fr"