Beryl::Bootstrap::QemuInRescue
Bootstrap complet FreeBSD via mfsBSD-in-QEMU + post-install no-chroot.
Flux validé manuellement sur loulou le 21 avril 2026 :
. SSH rescue Linux → apt install qemu-system-x86 ovmf sshpass curl
. Download mfsBSD SE (cache)
. NOGO si BSD déjà sur le disque cible
. Upload rescue-run-vm.sh via scp (évite Process.run stdin-pipe)
. Exécute le driver shell sur le rescue (UN seul ssh outer, zéro nested
côté Crystal → zéro hang macOS). Le driver :
.. systemd-run QEMU UEFI (survit à la fermeture ssh)
.. attend SSH mfsBSD
.. pré-fetch txz + bsdinstall PRÉAMBULE SEUL (pas de post-install chroot)
.. remonte ZFS + post-install HORS chroot ciblant /mnt (contourne Capsicum)
.. unmount + poweroff
. OVH API boot_from_disk + wait SSH FreeBSD (admin user)
Voir ADR-013 pour la justification détaillée du pattern no-chroot.
Constants
Template URL GitHub releases (source officielle actuelle mfsBSD).
L'endpoint /releases/latest/download/<asset> redirige toujours
vers la release la plus récente — pas besoin de tag à maintenir.
Matche tous les mfsBSD-SE quelle que soit leur version / extension (.iso côté GitHub, .img côté ancien vx.sk).
Constructors
Class methods
Instance methods
Ordre global des disques passés à QEMU : boot d'abord, puis pools data dans l'ordre de déclaration. Les index QEMU correspondent : vtbd0 = mfsBSD, vtbd1..vtbd(N) = boot, vtbd(N+1).. = data.
Script shell (non base64) qui crée les pools data sous /mnt via
zpool create. Vide si aucun pool data. Pour chaque pool :
zpool create -f -R /mnt -m <mountpoint> <nom> <vdev...> zpool set cachefile=/mnt/boot/zfs/zpool.cache <nom>
-R /mnt = altroot : les cache files ZFS écrivent sous /mnt
(bon emplacement au reboot bare metal). -f car les disques
sont neufs, mais zpool create chipote parfois sur résidus.
Le zpool set cachefile est INDISPENSABLE : sans lui,
l'export final (zpool export -a) retire le pool du cache,
et au reboot bare-metal FreeBSD ne retrouve plus que zroot
dans /boot/zfs/zpool.cache. Le pool data existe sur disque
(visible via zpool import) mais doit être importé à la main.
Constaté terrain quantas.aloli.net 24 avril 2026.
Pointer vers /mnt/boot/zfs/zpool.cache (le cachefile du
système cible, dans zroot altroot /mnt) garantit qu'au reboot,
le rc.d/zfs du FreeBSD installé importe les deux pools.
Pools chiffrés : si encryption_key_hex est posé, on génère :
- Un bloc
{ ... }qui décode la clé base64 dans une variable localeKEY(jamais en argument de commande). zpool create -O encryption=on -O keyformat=hex -O keylocation=prompt …avec la clé fournie sur stdin.unset KEYpour libérer la mémoire shell après l'usage.- PAS de
zpool set cachefile: on EXCLUT le pool chiffré du cache pour qu'au reboot bare-metal, FreeBSD ne tente pas d'importer un pool dont la clé n'est pas chargée. L'opérateur feraberyl unlock(qui appellezpool import+zfs load-key). Voirzpool-encryption-architecture.adoc§ « Au bootstrap ».
Le script complet est ensuite encodé en base64 et exécuté côté VM
via bash -c "$(echo ... | base64 -d)" — la clé hex n'apparaît
jamais dans la ligne de commande.
Version base64 du script pour injection dans le template shell (évite les problèmes de quoting). Vide si aucun pool data.
Nom à suggérer dans le hint beryl follow-install <name>
(typiquement FQDN ou <société>/<host>). nil → fallback « <host> ».
Chemin local (côté rescue) où l'image mfsBSD SE est téléchargée. Inclut la version pour qu'un changement de version upstream (ex: 14.2 → 15.0) force un nouveau téléchargement au lieu de réutiliser un cache périmé d'une version précédente. L'extension provient de l'URL (.iso GitHub, .img vx.sk).
Args -drive pour chaque disque cible passthrough dans QEMU.
Inclut boot ET pools data : on veut que la VM voie tout pour
créer les pools data post-install dans le même qemu-system-x86_64.
Chaque disque devient un vtbd* dans la VM (vtbd0=mfsBSD, vtbd1+=cibles).
Rend l'installerconfig minimaliste (préambule seul, pas de chroot).
ZFSBOOT_DISKS : dans la VM QEMU, les disques passthrough sont
vtbd1, vtbd2, … (vtbd0 est l'image mfsBSD elle-même). Ordre =
ordre d'apparition dans le -drive côté QEMU.
Rend le driver shell. Tous les placeholders de la template sont substitués ici (noms mfsbsd, OVMF, QEMU args, users, packages, sudoers).
Contenu base64 du fichier sudoers (chaque ligne == une règle). Vide si aucune règle → le driver shell skip la création du fichier.