Primera prueba de `atuq` dentro de una imagen de disco arrancada, y el resultado no es el de la jaula. La cadena previa funcionó, y eso también es medición: el perfil `escritorio-cosmic` hidratado con el cierre de hoy (275 nodos, 8,4 G) trae `/usr/bin/atuq`, `/usr/bin/llama-server` y el modelo — declarar en el perfil SÍ pone las cosas en la imagen—, la imagen EFI de 12 G arranca en QEMU y COSMIC pinta panel y dock en ~2 min. Y `atuq` arranca —sus extensiones inician, la del foco sondea cada minuto, WebRender inicializa— sin que la ventana aparezca nunca. Descartado, para que nadie lo repita: no es el sandbox de Gecko (relanzado con los cinco MOZ_DISABLE_* puestos, idéntico), no es que el proceso muera (sigue ejecutando el JS de las extensiones), y no es la IA (pasa con about:blank). La pista: bajo sway headless el MISMO artefacto pinta perfecto y hay capturas del panel contestando. La diferencia son el compositor (cosmic-comp+llvmpipe contra sway+pixman) y el arranque real contra bwrap. Es su propia unidad de trabajo, no un parche apurado. ⚠ La lección del método: quince guardianes en verde, `vigia-imagen.py` en ✓, y el navegador igual no se puede usar en la imagen. «Sella», «hidrata» y «los tests pasan» son tres cosas distintas de «arranca y se ve». De paso, `metal-iso.sh` acepta ahora STORE y AUG por entorno, porque en esta máquina no funcionaba: arma el rootfs con `cp -al` desde el store y el store es un BIND-MOUNT del volumen — `linkat` rechaza cruzar mounts aunque sea el mismo disco, así que hay que nombrar los dos lados dentro del mismo mount. Es la cuarta vez que aparece el mismo EXDEV hoy.
113 lines
5.7 KiB
Bash
Executable File
113 lines
5.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"
|
|
|
|
# ⚠ STORE se puede apuntar a la ruta REAL del store, y en esta máquina hace falta. Este script arma
|
|
# el rootfs con `cp -al` —hardlinks, para no copiar gigabytes— y `linkat` **rechaza cruzar mounts**
|
|
# aunque sean el mismo disco. El store está bind-mounteado en `./store` desde el volumen, así que
|
|
# con el default nada enlaza: hay que nombrar los dos lados dentro del MISMO mount.
|
|
# STORE=/mnt/cosecha/store AUG=/mnt/cosecha/metal-rootfs scripts/metal-iso.sh
|
|
STORE="${STORE:-store}"
|
|
|
|
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 se puede mover, y en esta máquina HAY QUE MOVERLO. El rootfs se arma con `cp -al` desde el
|
|
# store —hardlinks, para no copiar gigabytes— y el store es un **bind-mount del volumen**: `linkat`
|
|
# rechaza cruzar mounts aunque sea el mismo disco, así que con el default en `work/` esto muere con
|
|
# `Invalid cross-device link` en el primer fichero. Con AUG en el mismo filesystem que el store,
|
|
# los hardlinks vuelven a funcionar y no se copia nada.
|
|
# AUG=/mnt/cosecha/metal-rootfs scripts/metal-iso.sh
|
|
AUG="${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\""
|