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 1506Shell 185Rust 107Markdown 983638 Definiciones

Etapa metal: ensamblador del ISO EFI (pieza 4) + hallazgo regresión EFI

- scripts/metal-iso.sh: arma work/hammer-metal.iso (kernel metal + firmware AX201
  + wpa_supplicant + wifi-connect), consola en pantalla (console=tty0).
- VALIDADO BIOS (QEMU): el kernel metal bootea, inicializan usbhid/i8042 (teclado),
  e1000/e1000e/igb, cfg80211+regulatory (stack WiFi), simpledrm/VGA console, y
  arje-zero arranca PID1. iwlwifi/nvme presentes (no bindean en QEMU sin hw real).
- HALLAZGO: la rama UEFI (OVMF) NO bootea el kernel — regresión pre-existente de
  GRUB 2.14 (host rolling): GRUB-EFI dice 'Booting' y el kernel queda mudo, con
  CUALQUIER kernel (el QEMU tmb falla; efi-boot-test FALLA UEFI / PASA BIOS).
  Fix propuesto: boot por EFI-stub directo (sin GRUB-EFI) — requiere kernel con
  CONFIG_CMDLINE embebido + ESP con bzImage como BOOTX64.EFI.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

487d741f08fef5475586cdacaa0fb50c1f992f03 · por sergio · (hace 4 meses) · padre 3aec59ea4 · ver el árbol en este commit

Delta semántico

Ninguna definición cambió: el cambio es de texto, documentación o datos.

1 archivos · +91 −0

diff --git a/scripts/metal-iso.sh b/scripts/metal-iso.sh
new file mode 100755
index 00000000..693828d4
--- /dev/null
+++ b/scripts/metal-iso.sh
@@ -0,0 +1,91 @@
+#!/usr/bin/env sh
+# metal-iso.sh — arma el ISO live EFI para HARDWARE REAL (no QEMU): producto + kernel metal + firmware
+# AX201 + wpa_supplicant, con la consola en la PANTALLA (console=tty0) y un helper `wifi-connect`.
+#
+# Se apoya en scripts/iso-image.sh (EFI=1, híbrido BIOS+UEFI) pero:
+#   - KERNEL = bzImage de recipes/linux-metal.toml (drivers reales =y), no el QEMU-tuned.
+#   - ROOTFS = product-rootfs AUMENTADO: /lib/firmware (iwlwifi+reg.db) + /usr/sbin/wpa_supplicant*
+#              + /usr/bin/wifi-connect. iso-image.sh hace cp -al ⇒ no muta el store.
+#   - CMDLINE = "console=ttyS0,115200 console=tty0 ...": /dev/console → tty0 (pantalla) ⇒ la console-getty
+#               de arje da shell en el monitor del portátil; el serial queda para logs/QEMU.
+#
+# Uso:   scripts/metal-iso.sh                 # crea work/hammer-metal.iso
+# Vars:  PRODUCT  hash/prefijo del product-rootfs (default: el más reciente)
+#        KERNEL   bzImage metal (default: store/*-linux-metal/boot/bzImage)
+#        ISO      salida (default work/hammer-metal.iso)
+#        CMDLINE  override del cmdline
+set -eu
+ROOT="$(cd "$(dirname "$0")/.." && pwd)"; cd "$ROOT"
+
+if [ -n "${PRODUCT:-}" ]; then
+  PDIR=$(ls -d store/"${PRODUCT#b3:}"*-product-rootfs 2>/dev/null | head -1)
+else
+  PDIR=$(ls -dt store/*-product-rootfs 2>/dev/null | head -1)
+fi
+[ -n "${PDIR:-}" ] && [ -d "$PDIR" ] || { echo "no encuentro product-rootfs (corré 'hammer bootstrap product')" >&2; exit 1; }
+
+KERNEL="${KERNEL:-$(ls -dt store/*-linux-metal/boot/bzImage 2>/dev/null | head -1)}"
+[ -n "${KERNEL:-}" ] && [ -r "$KERNEL" ] || { echo "no encuentro el kernel metal (build recipes/linux-metal.toml)" >&2; exit 1; }
+
+WPADIR=$(ls -dt store/*-wpa_supplicant/usr/sbin 2>/dev/null | head -1)
+[ -n "${WPADIR:-}" ] || { echo "no encuentro wpa_supplicant (build recipes/wpa_supplicant.toml)" >&2; exit 1; }
+
+ISO="${ISO:-work/hammer-metal.iso}"
+CMDLINE="${CMDLINE:-console=ttyS0,115200 console=tty0 rdinit=/init}"
+AUG="work/metal-rootfs"
+
+echo "==> product-rootfs : $PDIR"
+echo "==> kernel metal   : $KERNEL"
+echo "==> wpa_supplicant : $WPADIR"
+
+# 1) rootfs aumentado (hardlinks, no copia datos)
+echo "==> aumentando rootfs en $AUG (firmware + wpa_supplicant + wifi-connect)"
+rm -rf "$AUG"; cp -al "$PDIR" "$AUG"
+
+# 2) firmware AX201
+scripts/metal-firmware.sh "$AUG"
+
+# 3) wpa_supplicant (estáticos)
+mkdir -p "$AUG/usr/sbin"
+cp "$WPADIR"/wpa_supplicant "$WPADIR"/wpa_cli "$WPADIR"/wpa_passphrase "$AUG/usr/sbin/"
+
+# 4) helper de conexión WiFi (busybox ip/udhcpc + wpa_supplicant)
+cat > "$AUG/usr/bin/wifi-connect" <<'WC'
+#!/bin/sh
+# wifi-connect SSID [PASSPHRASE] — asocia el WiFi y pide IP por DHCP.
+# Sin PASSPHRASE: red abierta. Detecta la interfaz wireless automáticamente.
+set -eu
+SSID="${1:?uso: wifi-connect SSID [PASSPHRASE]}"; PSK="${2:-}"
+IF=""
+for d in /sys/class/net/*; do
+  [ -e "$d/wireless" ] && IF=$(basename "$d") && break
+done
+[ -n "$IF" ] || { echo "no hay interfaz wireless (¿cargó iwlwifi? revisá 'dmesg | grep iwlwifi')"; exit 1; }
+echo "==> interfaz: $IF"
+ip link set "$IF" up 2>/dev/null || ifconfig "$IF" up
+if [ -n "$PSK" ]; then
+  wpa_passphrase "$SSID" "$PSK" > /tmp/wpa.conf
+else
+  printf 'network={\n\tssid="%s"\n\tkey_mgmt=NONE\n}\n' "$SSID" > /tmp/wpa.conf
+fi
+pkill wpa_supplicant 2>/dev/null || true
+wpa_supplicant -B -i "$IF" -c /tmp/wpa.conf -D nl80211
+echo "==> asociando… (espera unos segundos; 'wpa_cli status' para ver el estado)"
+sleep 4
+udhcpc -i "$IF" -q -n || udhcpc -i "$IF"
+echo "==> listo. IP:"; ip addr show "$IF" 2>/dev/null | grep -w inet || ifconfig "$IF"
+WC
+chmod +x "$AUG/usr/bin/wifi-connect"
+
+# 5) banner para el login de consola (recordar el comando)
+printf '\nhammer live (metal). WiFi:  wifi-connect "TU_SSID" "TU_CLAVE"\n\n' >> "$AUG/etc/motd" 2>/dev/null || \
+printf '\nhammer live (metal). WiFi:  wifi-connect "TU_SSID" "TU_CLAVE"\n\n' > "$AUG/etc/motd"
+
+# 6) armar el ISO híbrido EFI con iso-image.sh
+echo "==> armando ISO EFI (iso-image.sh EFI=1)"
+ROOTFS="$AUG" KERNEL="$KERNEL" ISO="$ISO" CMDLINE="$CMDLINE" EFI=1 ./scripts/iso-image.sh
+
+echo
+echo "✓ ISO metal: $ISO ($(du -h "$ISO" | cut -f1))"
+echo "  Quemar a USB:  sudo dd if=$ISO of=/dev/sdX bs=4M oflag=sync status=progress"
+echo "  (reemplazá /dev/sdX por tu pendrive — ¡cuidado, borra el disco!)"