ADR 0016 los listaba entre los CONGELADOS; el usuario pidió descongelarlos al abrir el SDD 28. La
enmienda queda escrita en el propio ADR, que si no la etiqueta deja de describir el hecho.
`hammer-install.sh` → `takana-install.sh`, `hammer-live-install.sh` → `takana-live-install.sh`,
`hammer-banner.txt` → `takana-banner.txt`, `BRIEFING-hammer.md` → `BRIEFING-takana.md`.
**Lo que hacía caro esto no es el nombre del fichero.** El instalador se inyecta en el ISO como
`/usr/bin/hammer-install` y su éxito se detecta con un `grep` de `HAMMER-INSTALL-OK` desde TRES
scripts de prueba. Renombrar un solo lado los deja casando NADA — sin fallar —, que es literalmente
el modo en que `atribuir-fallos.py` quedó mudo cuando el renombre movió el target de `tracing`.
Se renombraron las dos puntas en el mismo commit (`/usr/bin/takana-install`,
`TAKANA-INSTALL-OK/FAIL`, `TAKANA_INSTALL_*`, `work/takana-install.img`, `/run/takana-install`),
se comprobó por `grep` que no quede ningún token viejo fuera del ADR, y —lo que decide— se CORRIÓ
`install-tui-test.sh`: 4/4 casos verdes.
Las tres `TAKANA_INSTALL_*` caen al nombre viejo (`${TAKANA_INSTALL_X:-${HAMMER_INSTALL_X:-}}`):
el llamador puede ser un ISO anterior al renombre. Misma convención que `TAKANA_ROOT_PW` unas
líneas más arriba en ese mismo script.
NO se tocó `/usr/sbin/hammer-recover` ni su hook de arranque —renombrarlo rompe máquinas YA
INSTALADAS, no el repo—: sobrevive intacto dentro del script renombrado, verificado por conteo
antes y después (8 ocurrencias). Tampoco `hammerd`, `hammer-edit` (su `name` está en la ruta del
store), `/var/lib/hammer`, `HAMMER_LIVE` ni los siete literales de hash.
De paso: `scripts/.hammer-banner.txt.kate-swp` era un swap de editor commiteado por error. Fuera.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RomoxEGZUhaT4pob1QSX5x
100 lines
4.7 KiB
Bash
Executable File
100 lines
4.7 KiB
Bash
Executable File
#!/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 de marca para el login de consola (icono martillo+# + acrónimo + uso WiFi)
|
|
mkdir -p "$AUG/etc"
|
|
cp scripts/takana-banner.txt "$AUG/etc/motd"
|
|
|
|
# 6) armar el ISO híbrido con iso-image.sh:
|
|
# - rama UEFI por EFI-STUB DIRECTO (EFI_STUB=1): bzImage=BOOTX64.EFI, esquiva el GRUB 2.14 roto.
|
|
# El cmdline EFI va horneado en el kernel (CONFIG_CMDLINE); CMDLINE acá es para la rama BIOS (GRUB).
|
|
# - rama BIOS por GRUB El Torito (la que ya funciona en metal con CSM).
|
|
echo "==> armando ISO híbrido (BIOS GRUB + UEFI EFI-stub directo)"
|
|
ROOTFS="$AUG" KERNEL="$KERNEL" ISO="$ISO" CMDLINE="$CMDLINE" EFI=1 EFI_STUB=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!)"
|
|
echo
|
|
echo " UEFI: arranca por EFI-stub directo desde la ESP de la GPT isohybrid (el bug de"
|
|
echo " GRUB 2.14 NO afecta). En la BIOS del portátil: DESACTIVÁ Secure Boot (el"
|
|
echo " kernel no está firmado por Microsoft). BIOS/CSM también arranca (GRUB El Torito)."
|
|
echo " WiFi: una vez en consola → wifi-connect \"TU_SSID\" \"TU_CLAVE\""
|