Bug détecté en runtime : sshd OpenSSH 9.8 sur Redox cherche
authorized_keys dans le homedir de l'utilisateur, qui sur Redox est
/home/root/ et NON /root/ comme sur Linux. Le déploiement précédent
mettait le fichier au mauvais endroit → ssh tombait toujours en password.
Fix : injecter dans \$MOUNT/home/root/.ssh/authorized_keys avec perms
700/600. Le path Linux /root/.ssh/ est laissé non-touché (vide ou
inexistant).
Validé : après ce fix le `ssh root@localhost -p 8022` connecte directement
sans password.
Leyoda 2026 – GPLv3
Permet ssh -p 8022 root@localhost depuis l'hôte sans password une fois
openssh installé et sshd lancé dans Redox. Scanne ~/.ssh/ de l'hôte pour
id_ed25519.pub / id_rsa.pub / id_ecdsa.pub, append toutes celles trouvées
dans /root/.ssh/authorized_keys avec permissions correctes (700 et 600).
Bénéfice : le copier-coller depuis CachyOS vers Redox devient trivial
via la session SSH, plus besoin de retaper les commandes dans la fenêtre
QEMU graphique sans copier-coller.
Warning explicite si aucune pubkey hôte n'est trouvée (ssh par password
sera toujours possible, juste moins pratique).
Leyoda 2026 – GPLv3
Permet ssh root@localhost -p 8022 depuis l'hôte vers le guest Redox une
fois qu'openssh y est configuré (host keys + sshd_config + sshd lancé).
Le hostfwd 8022→22 est déjà câblé dans mk/qemu.mk côté Redox-src mais
gated par `make qemu net=redir`. On l'active toujours dans run-qemu.sh
car le coût est nul si on ne se connecte pas en SSH.
Autres ports forward bénéficiaires (cf mk/qemu.mk) :
- 8080 → 80 (HTTP)
- 8081-8083, 64126 (gdbserver, autres)
Pas de changement comportemental côté compositor ; juste la préparation
réseau pour atteindre un futur sshd Redox.
Leyoda 2026 – GPLv3
Pour éviter de retaper 3 lignes à chaque test runtime dans la fenêtre
QEMU graphique (sans copier-coller possible), ajout de 3 scripts ion
prêts à l'emploi dans tools/redox-scripts/ :
- test-sw : compositor + simple_window client (phase 13.1.b)
- test-subc : compositor + subcompositor client visuel (phase 13.2.b.3)
- test-out : compositor + wl_output gating test (phase 13.2.a)
Tous suivent le même pattern :
rm -f /tmp/redox-wl-comp.sock
redox-wl-compositor &
sleep 1
<client>
run-qemu.sh copie maintenant tout tools/redox-scripts/* dans /usr/bin
de l'image (cp -p pour conserver +x), donc le user peut taper juste
`test-subc` ⏎ dans le shell ion Redox.
Shebang #!/usr/bin/ion : Redox sait exécuter le script directement
(le chemin /usr/bin/ion est stable).
Leyoda 2026 – GPLv3
Nouveau crate redox-wl-test-client-subcompositor : client Wayland qui
crée un toplevel parent 300×200 bleu nuit avec bordure noire, et lui
attache une subsurface 60×60 rouge à l'offset (50, 50).
Si le rendering 13.2.b.2 fonctionne, on doit voir visuellement dans la
fenêtre QEMU : la fenêtre bleue avec un carré rouge incrusté en haut-
gauche, exactement 50px depuis le bord du parent.
Cycle complet :
1. Bind 5 globals : wl_compositor, wl_shm, xdg_wm_base, wl_seat,
wl_subcompositor (le client échouera si compositor manque l'un d'eux)
2. Parent xdg_toplevel avec ack_configure
3. SHM buffer 300×200 bleu + attach + commit parent
4. wl_compositor.create_surface pour le child
5. wl_subcompositor.get_subsurface(child, parent) + set_position(50,50)
+ set_desync (pour qu'un commit child suffise à rendre les changements)
6. SHM buffer 60×60 rouge + attach + commit child
7. Re-commit parent (force redraw)
8. Event loop avec ESC → exit propre
Reprend le pattern d'event-loop tolérant Interrupted/BrokenPipe de la
phase 13.1.b (5e adaptation Redox côté client).
run-qemu.sh copie maintenant aussi ce binaire dans /usr/bin de l'image
(optionnel, skip silencieux si non compilé).
Les 2 tests natifs continuent de PASSer en non-régression.
Leyoda 2026 – GPLv3
Dette protocolaire transversale comblée : wl_output n'était pas déclaré
comme global, plusieurs toolkits client (sctk, GTK, Qt) le considèrent
implicitement requis. Maintenant exposé à v3 avec gating conforme :
- geometry, mode : envoyés à toutes les versions (>= 1)
- scale : seulement si bind >= 3 (gating conservateur)
- done : seulement si bind >= 2
Mode flags = CURRENT | PREFERRED, refresh 60 000 mHz, scale_factor=1,
transform Normal, subpixel Unknown, make=Redox, model=redox-wl-output:0.
Position (0,0), single output, taille pixel issue de screen_w/screen_h
(setté par set_screen_size au boot compositor).
Nouveau crate de validation : redox-wl-test-wl-output. Deux niveaux :
1. Client autonome pour test runtime dans QEMU (bind aux 3 versions,
dump events, PASS/FAIL via exit code)
2. Test natif (cargo test, tourne sur l'hôte sans QEMU) qui simule
serveur+client en-process via UnixStream::pair() et valide les 11
assertions du gating. Vérifié PASS le 2026-05-16 sur CachyOS.
Le test natif sert de garde-fou anti-régression pour CI ultérieur. Plus
besoin de relancer QEMU pour valider ce path.
run-qemu.sh : copie maintenant aussi le test client si compilé (skip
silencieux sinon).
Leyoda 2026 – GPLv3
B.2 (ion page fault) : pas fixable dans ce repo. Source d'ion clonée
depuis upstream et inspectée : pas de commit récent visant ce pattern
de crash, binaire stripped sur l'image (impossible de mapper RIP=0x2335ae
à une fonction sans non-stripped build). Rapport upstream-ready rédigé
dans docs/phase13-1-c-ion-bug-b2-upstream.md, à coller sur
gitlab.redox-os.org/redox-os/ion quand on aura un compte.
Bonus diagnostic noté : warning relibc « Cancellation for unknown id »
apparaît juste avant le crash ion, peut être lié à un side-effect dans
procmgr (à investiguer côté relibc aussi).
Workaround documenté pour utilisateurs : quitter les clients background
AVANT le serveur Wayland (ESC sur le client, puis Ctrl+Q sur le compo).
B.4 (image étroite) : run-qemu.sh warn maintenant si harddrive.img <
4 GiB, avec les commandes de resize prêtes à copier-coller. Continue
sans bloquer (image actuelle de l'utilisateur fait 10 GiB, no-op pour
notre setup, mais utile pour quelqu'un qui clone le repo et utilise
l'image desktop par défaut de Redox.)
Leyoda 2026 – GPLv3
4 bugs identifiés et corrigés grâce au client tiers :
- ESC mangée par le compositor au lieu d'être forwardée (raccourci compo
déplacé sur Ctrl+Q + tracking ctrl_held)
- Cursor accumulait les deltas PS/2 hors-écran (ajout screen_w/h +
clamp_cursor + set_screen_size au boot)
- Keycode envoyé scancode+8 au lieu d'evdev brut (bug racine — le +8
est entre evdev et X11, pas entre PS/2 et evdev)
- Event loop client ne tolérait pas Interrupted/BrokenPipe transitoires
→ FAIL au lieu de PASS sur sortie normale (5e adaptation Redox côté
client, upstream-compatible)
Plus : tick log compo passé en debug! pour silencer la console série,
run-qemu.sh durci (check /dev/fuse, IMAGE/REDOXFS overridables).
6/6 checkpoints 13.1 verts. Bugs secondaires (curseur stuck en bas-droite,
ion page fault sur broken pipe d'un job background) listés dans le doc
pour follow-up en 13.1.c.
Leyoda 2026 – GPLv3
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