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!)"