gioser

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 1572Shell 203Rust 109Markdown 993728 Sutichaykuna

⎇ b89695739b0547d8d01b3438a9d800affd2fdf61 scripts/metal-usb-sdboot.sh Shell · 123 siq'ikuna · 7.3 KB Ñawpa willay ch'uya

paso 4: el ensamblado de imagen toma sus herramientas del STORE — y estaba roto en las 3 máquinas e30ffbbf0 · Sergio ·

1#!/usr/bin/env sh
2# metal-usb-sdboot.sh — USB raw (GPT + ESP FAT32) que arranca takana en metal vía systemd-boot.
3#
4# Alternativa de BRINGUP al boot por EFI-stub directo (que en el firmware del usuario se cuelga tras
5# 'Measured initrd PCR 9', por el quirk de LoadOptions del firmware). systemd-boot:
6#   - pasa una cmdline LIMPIA al kernel (esquiva el quirk EFI_LOAD_OPTION del firmware),
7#   - provee el initrd por LoadFile2 (sin depender del initrd= de la cmdline),
8#   - permite EDITAR la cmdline en vivo (tecla 'e' en el menú) ⇒ iterar sin recompilar.
9#
10# ⚠️ systemd-bootx64.efi es un BINARIO AJENO (del host) — crutch de bringup. TODO: loader soberano.
11#
12# Salida: una IMAGEN DE DISCO (no ISO) para dd directo al pendrive:
13#   sudo dd if=work/hammer-metal-usb.img of=/dev/sdX bs=4M oflag=sync status=progress
14#
15# Uso:   scripts/metal-usb-sdboot.sh
16# Vars:  ROOTFS (def work/metal-rootfs)  KERNEL (def store/*-linux-metal más reciente)
17#        SDBOOT (def systemd-bootx64.efi del host)  IMG (def work/hammer-metal-usb.img)
18#        OPTIONS (cmdline del loader entry)
19set -eu
20ROOT="$(cd "$(dirname "$0")/.." && pwd)"; cd "$ROOT"
21
22ROOTFS="${ROOTFS:-work/metal-rootfs}"
23[ -d "$ROOTFS" ] || { echo "no existe ROOTFS=$ROOTFS (corré scripts/metal-iso.sh primero)" >&2; exit 1; }
24KERNEL="${KERNEL:-$(ls -dt store/*-linux-metal/boot/bzImage 2>/dev/null | head -1)}"
25[ -n "${KERNEL:-}" ] && [ -r "$KERNEL" ] || { echo "no encuentro kernel metal" >&2; exit 1; }
26SDBOOT="${SDBOOT:-/home/sergio/.local/share/shuma/rootfs/arch/usr/lib/systemd/boot/efi/systemd-bootx64.efi}"
27[ -r "$SDBOOT" ] || { echo "no encuentro systemd-bootx64.efi en $SDBOOT" >&2; exit 1; }
28# Las herramientas salen del STORE por HASH VIGENTE (2026-09-22): `cpio` no existe en ninguna de las
29# tres máquinas del proyecto y mtools se resolvía por el primer glob, no por el hash de la receta de
30# hoy. Ver `scripts/lib/herramientas-desde-store.sh` y `scripts/vigia-ensamblado.sh`.
31. "$(dirname "$0")/lib/herramientas-desde-store.sh"
32MFORMAT=$(herramienta mtools usr/bin/mformat mformat) || exit 1
33MCOPY=$(herramienta   mtools usr/bin/mcopy   mcopy)   || exit 1
34MMD=$(herramienta     mtools usr/bin/mmd     mmd)     || exit 1
35MDIR=$(herramienta    mtools usr/bin/mdir    mdir)    || exit 1
36CPIO=$(herramienta libarchive usr/bin/bsdcpio cpio)   || exit 1
37GZIP=$(herramienta gzip bin/gzip gzip)                || exit 1
38if [ -n "${MT:-}" ]; then
39    MFORMAT="${MT}/mformat"; MCOPY="${MT}/mcopy"; MMD="${MT}/mmd"; MDIR="${MT}/mdir"
40    [ -x "$MFORMAT" ] || { echo "MT=$MT no tiene mformat" >&2; exit 1; }
41fi
42# ⚠ Y el GESTOR DE ARRANQUE de esta ruta tampoco es nuestro: `SDBOOT` apunta a un
43# `systemd-bootx64.efi` sacado de un rootfs de Arch en el home del usuario — un binario ajeno, sin
44# hash y fuera del store, en el camino de arranque del metal. La alternativa soberana ya existe y no
45# lleva gestor (`install-image-efi.sh`: el bzImage ES el binario EFI, ADR 0018). Anotado, no tocado:
46# esta ruta se usa para bringup con menú y cambiarla es su propia decisión.
47IMG="${IMG:-work/hammer-metal-usb.img}"
48# /dev/console=tty0 al FINAL ⇒ la getty de arje da shell en la PANTALLA. earlyprintk=efi para diagnóstico.
49OPTIONS="${OPTIONS:-earlyprintk=efi,keep ignore_loglevel efi=novamap console=ttyS0,115200 console=tty0}"
50WORK="$ROOT/work/metal-sdboot"; rm -rf "$WORK"; mkdir -p "$WORK"
51
52echo "==> kernel: $KERNEL"
53echo "==> rootfs: $ROOTFS  ($(du -sh "$ROOTFS" | cut -f1))"
54
55# 1) staging del initramfs: hardlinks del rootfs + /init del medio live (rdinit=/init lo corre)
56echo "==> staging initramfs (+ /init marcador live)"
57STG="$WORK/rfs"; cp -al "$ROOTFS" "$STG"
58cat > "$STG/init" <<'INIT'
59#!/bin/sh
60/bin/busybox mount -t proc     proc /proc 2>/dev/null || true
61/bin/busybox mount -t sysfs    sys  /sys  2>/dev/null || true
62/bin/busybox mount -t devtmpfs dev  /dev  2>/dev/null || true
63echo "HAMMER-METAL-LIVE-OK: arranque por systemd-boot"
64exec /sbin/init
65INIT
66chmod +x "$STG/init"
67
68# 2) empaquetar initramfs.cpio.gz (root-owned, igual que iso-image.sh)
69echo "==> empaquetando initramfs.cpio.gz"
70( cd "$STG" && find . -print0 | "$CPIO" --null -o -H newc -R 0:0 2>/dev/null | "$GZIP" -1 ) > "$WORK/initramfs.cpio.gz"
71IRD="$WORK/initramfs.cpio.gz"; echo "    initramfs: $(du -h "$IRD" | cut -f1)"
72
73# 3) ESP FAT32: BOOTX64.EFI=systemd-boot + loader.conf + entry + kernel + initrd
74espkb=$(( ( $(stat -c%s "$KERNEL") + $(stat -c%s "$IRD") ) / 1024 + 16384 ))
75# FAT32 (-F) exige ~33 MiB mínimos; con initramfs chico (bisección) la ESP cae por debajo y la firmware
76# no la lee ("Not Found"). Piso de 48 MiB para que el FAT32 siempre sea válido.
77[ "$espkb" -lt 49152 ] && espkb=49152
78ESP="$WORK/esp.img"; rm -f "$ESP"; truncate -s "$(( espkb * 1024 ))" "$ESP"
79"$MFORMAT" -F -v HAMMER -i "$ESP" ::
80"$MMD" -i "$ESP" ::/EFI ::/EFI/BOOT ::/loader ::/loader/entries
81"$MCOPY" -i "$ESP" "$SDBOOT" ::/EFI/BOOT/BOOTX64.EFI
82printf 'default hammer\ntimeout 8\neditor yes\n' > "$WORK/loader.conf"
83printf 'title   hammer (metal)\nlinux   /bzImage\ninitrd  /initramfs.cpio.gz\noptions %s\n' "$OPTIONS" > "$WORK/hammer.conf"
84"$MCOPY" -i "$ESP" "$WORK/loader.conf"   ::/loader/loader.conf
85"$MCOPY" -i "$ESP" "$WORK/hammer.conf"   ::/loader/entries/hammer.conf
86"$MCOPY" -i "$ESP" "$KERNEL"             ::/bzImage
87"$MCOPY" -i "$ESP" "$IRD"                ::/initramfs.cpio.gz
88echo "==> ESP poblada ($(du -h "$ESP" | cut -f1)):"
89"$MDIR" -i "$ESP" ::/ ::/EFI/BOOT ::/loader/entries 2>/dev/null | grep -iE 'BOOTX64|bzImage|initram|hammer|loader' || true
90
91# 4) imagen de disco GPT: GPT primaria (1MiB) + ESP (en sector 2048) + GPT backup
92esp_sectors=$(( espkb * 2 ))                       # KiB→sectores de 512
93
94# Partición de DATOS opcional (DATA_MB>0): FAT32 con etiqueta, para que el sistema live escriba ahí lo
95# que deba SOBREVIVIR al apagado (telemetría/logs). El rootfs de esta imagen es un initramfs = RAM pura:
96# sin esta partición NO queda rastro de nada al cortar la luz. FAT32 (no ext4) a propósito: el pendrive
97# se lee después desde CUALQUIER máquina (Windows/Mac/Linux) sin herramientas.
98DATA_MB="${DATA_MB:-0}"
99DATA_LABEL="${DATA_LABEL:-HAMMERLOG}"
100data_sectors=0
101if [ "$DATA_MB" -gt 0 ]; then
102  DATA="$WORK/data.img"; rm -f "$DATA"; truncate -s "$(( DATA_MB * 1024 * 1024 ))" "$DATA"
103  "$MFORMAT" -F -v "$DATA_LABEL" -i "$DATA" ::
104  data_sectors=$(( DATA_MB * 2048 ))
105  echo "==> partición de datos FAT32 ${DATA_MB}M etiqueta=$DATA_LABEL (telemetría persistente)"
106fi
107
108rm -f "$IMG"; truncate -s "$(( (2048 + esp_sectors + data_sectors + 2048) * 512 ))" "$IMG"
109{
110  echo "label: gpt"
111  echo "start=2048, size=$esp_sectors, type=C12A7328-F81F-11D2-BA4B-00A0C93EC93B, name=\"EFI System Partition\""
112  [ "$data_sectors" -gt 0 ] && \
113    echo "start=$(( 2048 + esp_sectors )), size=$data_sectors, type=EBD0A0A2-B9E5-4433-87C0-68B6B72699C7, name=\"$DATA_LABEL\""
114} | sfdisk --quiet "$IMG"
115dd if="$ESP" of="$IMG" bs=512 seek=2048 conv=notrunc status=none
116[ "$data_sectors" -gt 0 ] && dd if="$DATA" of="$IMG" bs=512 seek=$(( 2048 + esp_sectors )) conv=notrunc status=none
117
118echo
119echo "✓ USB metal (systemd-boot): $IMG ($(du -h "$IMG" | cut -f1))"
120[ "$data_sectors" -gt 0 ] && echo "  + partición $DATA_LABEL (FAT32 ${DATA_MB}M) para telemetría — legible en cualquier SO"
121echo "  Quemar:  sudo dd if=$IMG of=/dev/sdX bs=4M oflag=sync status=progress"
122echo "  Bootear: el menú de systemd-boot aparece; ENTER arranca. Tecla 'e' = EDITAR la cmdline en vivo."
123echo "  Secure Boot OFF. WiFi (en consola):  wifi-connect \"SSID\" \"CLAVE\""