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 1383Shell 129Rust 79Markdown 732473 Sutichaykuna

⎇ b405fc77dfee7904f5f78f838cd6479854419522 scripts/metal-iso.sh Shell · 99 siq'ikuna · 4.7 KB Ñawpa willay ch'uya

Etapa metal: ✓ VALIDADO boot UEFI por EFI-stub (ISO como disco USB) + nota Secure Boot 30d8c9557 · sergio ·

1#!/usr/bin/env sh
2# metal-iso.sh — arma el ISO live EFI para HARDWARE REAL (no QEMU): producto + kernel metal + firmware
3# AX201 + wpa_supplicant, con la consola en la PANTALLA (console=tty0) y un helper `wifi-connect`.
4#
5# Se apoya en scripts/iso-image.sh (EFI=1, híbrido BIOS+UEFI) pero:
6#   - KERNEL = bzImage de recipes/linux-metal.toml (drivers reales =y), no el QEMU-tuned.
7#   - ROOTFS = product-rootfs AUMENTADO: /lib/firmware (iwlwifi+reg.db) + /usr/sbin/wpa_supplicant*
8#              + /usr/bin/wifi-connect. iso-image.sh hace cp -al ⇒ no muta el store.
9#   - CMDLINE = "console=ttyS0,115200 console=tty0 ...": /dev/console → tty0 (pantalla) ⇒ la console-getty
10#               de arje da shell en el monitor del portátil; el serial queda para logs/QEMU.
11#
12# Uso:   scripts/metal-iso.sh                 # crea work/hammer-metal.iso
13# Vars:  PRODUCT  hash/prefijo del product-rootfs (default: el más reciente)
14#        KERNEL   bzImage metal (default: store/*-linux-metal/boot/bzImage)
15#        ISO      salida (default work/hammer-metal.iso)
16#        CMDLINE  override del cmdline
17set -eu
18ROOT="$(cd "$(dirname "$0")/.." && pwd)"; cd "$ROOT"
19
20if [ -n "${PRODUCT:-}" ]; then
21  PDIR=$(ls -d store/"${PRODUCT#b3:}"*-product-rootfs 2>/dev/null | head -1)
22else
23  PDIR=$(ls -dt store/*-product-rootfs 2>/dev/null | head -1)
24fi
25[ -n "${PDIR:-}" ] && [ -d "$PDIR" ] || { echo "no encuentro product-rootfs (corré 'hammer bootstrap product')" >&2; exit 1; }
26
27KERNEL="${KERNEL:-$(ls -dt store/*-linux-metal/boot/bzImage 2>/dev/null | head -1)}"
28[ -n "${KERNEL:-}" ] && [ -r "$KERNEL" ] || { echo "no encuentro el kernel metal (build recipes/linux-metal.toml)" >&2; exit 1; }
29
30WPADIR=$(ls -dt store/*-wpa_supplicant/usr/sbin 2>/dev/null | head -1)
31[ -n "${WPADIR:-}" ] || { echo "no encuentro wpa_supplicant (build recipes/wpa_supplicant.toml)" >&2; exit 1; }
32
33ISO="${ISO:-work/hammer-metal.iso}"
34CMDLINE="${CMDLINE:-console=ttyS0,115200 console=tty0 rdinit=/init}"
35AUG="work/metal-rootfs"
36
37echo "==> product-rootfs : $PDIR"
38echo "==> kernel metal   : $KERNEL"
39echo "==> wpa_supplicant : $WPADIR"
40
41# 1) rootfs aumentado (hardlinks, no copia datos)
42echo "==> aumentando rootfs en $AUG (firmware + wpa_supplicant + wifi-connect)"
43rm -rf "$AUG"; cp -al "$PDIR" "$AUG"
44
45# 2) firmware AX201
46scripts/metal-firmware.sh "$AUG"
47
48# 3) wpa_supplicant (estáticos)
49mkdir -p "$AUG/usr/sbin"
50cp "$WPADIR"/wpa_supplicant "$WPADIR"/wpa_cli "$WPADIR"/wpa_passphrase "$AUG/usr/sbin/"
51
52# 4) helper de conexión WiFi (busybox ip/udhcpc + wpa_supplicant)
53cat > "$AUG/usr/bin/wifi-connect" <<'WC'
54#!/bin/sh
55# wifi-connect SSID [PASSPHRASE] — asocia el WiFi y pide IP por DHCP.
56# Sin PASSPHRASE: red abierta. Detecta la interfaz wireless automáticamente.
57set -eu
58SSID="${1:?uso: wifi-connect SSID [PASSPHRASE]}"; PSK="${2:-}"
59IF=""
60for d in /sys/class/net/*; do
61  [ -e "$d/wireless" ] && IF=$(basename "$d") && break
62done
63[ -n "$IF" ] || { echo "no hay interfaz wireless (¿cargó iwlwifi? revisá 'dmesg | grep iwlwifi')"; exit 1; }
64echo "==> interfaz: $IF"
65ip link set "$IF" up 2>/dev/null || ifconfig "$IF" up
66if [ -n "$PSK" ]; then
67  wpa_passphrase "$SSID" "$PSK" > /tmp/wpa.conf
68else
69  printf 'network={\n\tssid="%s"\n\tkey_mgmt=NONE\n}\n' "$SSID" > /tmp/wpa.conf
70fi
71pkill wpa_supplicant 2>/dev/null || true
72wpa_supplicant -B -i "$IF" -c /tmp/wpa.conf -D nl80211
73echo "==> asociando… (espera unos segundos; 'wpa_cli status' para ver el estado)"
74sleep 4
75udhcpc -i "$IF" -q -n || udhcpc -i "$IF"
76echo "==> listo. IP:"; ip addr show "$IF" 2>/dev/null | grep -w inet || ifconfig "$IF"
77WC
78chmod +x "$AUG/usr/bin/wifi-connect"
79
80# 5) banner de marca para el login de consola (icono martillo+# + acrónimo + uso WiFi)
81mkdir -p "$AUG/etc"
82cp scripts/hammer-banner.txt "$AUG/etc/motd"
83
84# 6) armar el ISO híbrido con iso-image.sh:
85#    - rama UEFI por EFI-STUB DIRECTO (EFI_STUB=1): bzImage=BOOTX64.EFI, esquiva el GRUB 2.14 roto.
86#      El cmdline EFI va horneado en el kernel (CONFIG_CMDLINE); CMDLINE acá es para la rama BIOS (GRUB).
87#    - rama BIOS por GRUB El Torito (la que ya funciona en metal con CSM).
88echo "==> armando ISO híbrido (BIOS GRUB + UEFI EFI-stub directo)"
89ROOTFS="$AUG" KERNEL="$KERNEL" ISO="$ISO" CMDLINE="$CMDLINE" EFI=1 EFI_STUB=1 ./scripts/iso-image.sh
90
91echo
92echo "✓ ISO metal: $ISO ($(du -h "$ISO" | cut -f1))"
93echo "  Quemar a USB:  sudo dd if=$ISO of=/dev/sdX bs=4M oflag=sync status=progress"
94echo "  (reemplazá /dev/sdX por tu pendrive — ¡cuidado, borra el disco!)"
95echo
96echo "  UEFI: arranca por EFI-stub directo desde la ESP de la GPT isohybrid (el bug de"
97echo "        GRUB 2.14 NO afecta). En la BIOS del portátil: DESACTIVÁ Secure Boot (el"
98echo "        kernel no está firmado por Microsoft). BIOS/CSM también arranca (GRUB El Torito)."
99echo "  WiFi: una vez en consola →  wifi-connect \"TU_SSID\" \"TU_CLAVE\""