auto-recover al arranque: crate hammer-recover + hook /sbin/init (E4 #4b)
El modelo de generaciones es in-place (sin menu NixOS que ofrecer en GRUB); lo que encaja es auto-sanar un upgrade interrumpido al boot. crates/hammer-recover = mini-binario static-musl (lo unico que el producto necesita, sin el CLI hammer completo): sin pending.json es no-op; con uno completa (roll-forward) o deshace (roll-back) -> FHS siempre consistente; nunca aborta el boot. iso-image.sh INSTALLER=1 lo compila (target musl) y bundlea al payload; hammer-live-install.sh lo copia a /usr/sbin/hammer-recover y el wrapper /sbin/init instalado lo corre tras montar /store y /var/lib/hammer, antes de incarnar arje-zero. iso-install- test.sh valida el hook al boot (marker 'hammer-recover: sin upgrade interrumpido'). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -121,12 +121,20 @@ menuentry "hammer" {
|
||||
linux /boot/bzImage console=ttyS0 root=/dev/vda1 rw rdinit=/sbin/init
|
||||
}
|
||||
CFG
|
||||
# hammer-recover: auto-sana un upgrade interrumpido al arranque (E4 #4b). Lo dejamos en /usr/sbin del
|
||||
# disco; el wrapper lo corre tras montar /store y /var/lib/hammer (que necesita) y antes de incarnar.
|
||||
if [ -x "$PAYLOAD/hammer-recover" ]; then
|
||||
"$BB" mkdir -p "$MNT/usr/sbin"
|
||||
cp "$PAYLOAD/hammer-recover" "$MNT/usr/sbin/hammer-recover"; "$BB" chmod 0755 "$MNT/usr/sbin/hammer-recover"
|
||||
fi
|
||||
"$BB" rm -f "$MNT/sbin/init"
|
||||
cat > "$MNT/sbin/init" <<'INIT'
|
||||
#!/bin/sh
|
||||
# Wrapper PID1: el kernel monta la partición root; montamos las dedicadas y arrancamos el init real.
|
||||
# Wrapper PID1: el kernel monta la partición root; montamos las dedicadas, auto-sanamos un upgrade
|
||||
# interrumpido (si lo hay) y arrancamos el init real.
|
||||
/bin/busybox mount -t ext4 /dev/vda2 /store || echo "init: no pude montar /store (/dev/vda2)"
|
||||
/bin/busybox mount -t ext4 /dev/vda3 /var/lib/hammer || echo "init: no pude montar /var/lib/hammer (/dev/vda3)"
|
||||
[ -x /usr/sbin/hammer-recover ] && /usr/sbin/hammer-recover || true
|
||||
exec /usr/bin/arje-zero
|
||||
INIT
|
||||
"$BB" chmod +x "$MNT/sbin/init"
|
||||
|
||||
@@ -98,6 +98,14 @@ if [ "${INSTALLER:-0}" = 1 ]; then
|
||||
grub-mkimage -O i386-pc -p '(hd0,msdos1)/boot/grub' -o "$IPL/grub/core.img" \
|
||||
biosdisk part_msdos ext2 normal configfile linux echo ls boot search
|
||||
install -m 0755 "$ROOT/scripts/hammer-live-install.sh" "$RFS/root/usr/bin/hammer-install"
|
||||
# hammer-recover (static musl): auto-sana un upgrade interrumpido al arranque del sistema instalado.
|
||||
RECOVER_BIN="$ROOT/target/x86_64-unknown-linux-musl/release/hammer-recover"
|
||||
if [ ! -x "$RECOVER_BIN" ]; then
|
||||
echo "==> compilando hammer-recover (static musl) para el payload"
|
||||
cargo build --release --target x86_64-unknown-linux-musl -p hammer-recover --manifest-path "$ROOT/Cargo.toml" >/dev/null 2>&1
|
||||
fi
|
||||
[ -x "$RECOVER_BIN" ] || { echo "no pude construir hammer-recover (target musl?)" >&2; exit 1; }
|
||||
install -m 0755 "$RECOVER_BIN" "$IPL/hammer-recover"
|
||||
fi
|
||||
|
||||
echo "==> empaquetando initramfs.cpio.gz"
|
||||
|
||||
@@ -53,6 +53,7 @@ echo "==> asserts sobre el arranque del disco:"
|
||||
check "GNU GRUB" "GRUB del disco (MBR→core.img del hueco post-MBR)"
|
||||
check "Linux version 6\.16" "kernel cargado del disco"
|
||||
check "Server listening on .* port 22" "sshd escuchando (producto instalado en servicio)"
|
||||
check "hammer-recover:" "hook de auto-recover de upgrades corrió al arranque (#4b)"
|
||||
reject "ARRANQUE FALLIDO|seed.card no encontrada" "arje-zero arrancó sin fallo de seed"
|
||||
reject "no pude montar" "particiones dedicadas /store y /var/lib/hammer montadas"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user