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 188Rust 55Shell 30Markdown 281211 Definiciones

Etapa metal: USB systemd-boot + kernel diagnóstico (esquiva quirk LoadOptions del firmware)

El boot por EFI-stub DIRECTO se cuelga en el firmware del usuario tras 'Measured initrd
PCR 9' (quirk EFI_LOAD_OPTION del firmware + initrd 100MB por la firmware). Pivote:
- scripts/metal-usb-sdboot.sh: arma work/hammer-metal-usb.img (disco GPT+ESP FAT32) con
  systemd-boot (binario del host, crutch de bringup) como BOOTX64.EFI + loader entry.
  systemd-boot provee el initrd por LoadFile2 (esquiva el parseo de cmdline del firmware)
  y permite EDITAR la cmdline en vivo (tecla 'e') ⇒ iterar sin recompilar 45min.
  ✓ VALIDADO OVMF: menú → 'Loaded initrd from LINUX_EFI_INITRD_MEDIA_GUID' → arje-zero PID1.
- linux-metal.toml: kernel diagnóstico — cmdline +earlyprintk=efi,keep +ignore_loglevel
  +efi=novamap (ve el boot en pantalla post-ExitBootServices) y -DEBUG_WX (saca el trace).

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

1dc5c16fbd255ed836bcb311bc14e7b18afe4513 · por sergio · (hace 4 meses) · padre 30d8c9557 · ver el árbol en este commit

Delta semántico

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

2 archivos · +84 −2

diff --git a/recipes/linux-metal.toml b/recipes/linux-metal.toml
index f791939f..bb9c12b8 100644
--- a/recipes/linux-metal.toml
+++ b/recipes/linux-metal.toml
@@ -75,9 +75,9 @@ scripts/config -d MODULE_SIG -d MODULE_SIG_ALL -d DEBUG_INFO_BTF -d DEBUG_INFO -
   -e USB_NET_DRIVERS -e USB_USBNET -e USB_NET_CDCETHER -e USB_NET_CDC_NCM -e USB_NET_RNDIS_HOST \
   -d DRM_I915 -d DRM_AMDGPU -d DRM_NOUVEAU -d DRM_RADEON -d AGP \
   -d SOUND -d SND -d MEDIA_SUPPORT -d INFINIBAND -d BT -d NFC -d CAN \
-  -d WATCHDOG -d THUNDERBOLT -d FIREWIRE \
+  -d WATCHDOG -d THUNDERBOLT -d FIREWIRE -d DEBUG_WX \
   -d XFS_FS -d BTRFS_FS -d F2FS_FS -d JFS_FS -d REISERFS_FS -d GFS2_FS -d NTFS3_FS && \
-scripts/config --set-str CMDLINE "console=ttyS0,115200 console=tty0 initrd=/initramfs.cpio.gz rdinit=/init" && \
+scripts/config --set-str CMDLINE "console=ttyS0,115200 console=tty0 earlyprintk=efi,keep ignore_loglevel efi=novamap initrd=/initramfs.cpio.gz rdinit=/init" && \
 make ARCH=x86_64 olddefconfig
 """
 compile = "make ARCH=x86_64 CC=gcc HOSTCC=gcc -j\"$(nproc)\" bzImage"
diff --git a/scripts/metal-usb-sdboot.sh b/scripts/metal-usb-sdboot.sh
new file mode 100755
index 00000000..b19d4fa7
--- /dev/null
+++ b/scripts/metal-usb-sdboot.sh
@@ -0,0 +1,82 @@
+#!/usr/bin/env sh
+# metal-usb-sdboot.sh — USB raw (GPT + ESP FAT32) que arranca hammer en metal vía systemd-boot.
+#
+# Alternativa de BRINGUP al boot por EFI-stub directo (que en el firmware del usuario se cuelga tras
+# 'Measured initrd PCR 9', por el quirk de LoadOptions del firmware). systemd-boot:
+#   - pasa una cmdline LIMPIA al kernel (esquiva el quirk EFI_LOAD_OPTION del firmware),
+#   - provee el initrd por LoadFile2 (sin depender del initrd= de la cmdline),
+#   - permite EDITAR la cmdline en vivo (tecla 'e' en el menú) ⇒ iterar sin recompilar.
+#
+# ⚠️ systemd-bootx64.efi es un BINARIO AJENO (del host) — crutch de bringup. TODO: loader soberano.
+#
+# Salida: una IMAGEN DE DISCO (no ISO) para dd directo al pendrive:
+#   sudo dd if=work/hammer-metal-usb.img of=/dev/sdX bs=4M oflag=sync status=progress
+#
+# Uso:   scripts/metal-usb-sdboot.sh
+# Vars:  ROOTFS (def work/metal-rootfs)  KERNEL (def store/*-linux-metal más reciente)
+#        SDBOOT (def systemd-bootx64.efi del host)  IMG (def work/hammer-metal-usb.img)
+#        OPTIONS (cmdline del loader entry)
+set -eu
+ROOT="$(cd "$(dirname "$0")/.." && pwd)"; cd "$ROOT"
+
+ROOTFS="${ROOTFS:-work/metal-rootfs}"
+[ -d "$ROOTFS" ] || { echo "no existe ROOTFS=$ROOTFS (corré scripts/metal-iso.sh primero)" >&2; exit 1; }
+KERNEL="${KERNEL:-$(ls -dt store/*-linux-metal/boot/bzImage 2>/dev/null | head -1)}"
+[ -n "${KERNEL:-}" ] && [ -r "$KERNEL" ] || { echo "no encuentro kernel metal" >&2; exit 1; }
+SDBOOT="${SDBOOT:-/home/sergio/.local/share/shuma/rootfs/arch/usr/lib/systemd/boot/efi/systemd-bootx64.efi}"
+[ -r "$SDBOOT" ] || { echo "no encuentro systemd-bootx64.efi en $SDBOOT" >&2; exit 1; }
+MT=$(ls -d store/*-mtools/usr/bin 2>/dev/null | head -1)
+[ -n "$MT" ] && [ -x "$MT/mformat" ] || { echo "no encuentro mtools de hammer (build recipes/mtools.toml)" >&2; exit 1; }
+IMG="${IMG:-work/hammer-metal-usb.img}"
+# /dev/console=tty0 al FINAL ⇒ la getty de arje da shell en la PANTALLA. earlyprintk=efi para diagnóstico.
+OPTIONS="${OPTIONS:-earlyprintk=efi,keep ignore_loglevel efi=novamap console=ttyS0,115200 console=tty0}"
+WORK="$ROOT/work/metal-sdboot"; rm -rf "$WORK"; mkdir -p "$WORK"
+
+echo "==> kernel: $KERNEL"
+echo "==> rootfs: $ROOTFS  ($(du -sh "$ROOTFS" | cut -f1))"
+
+# 1) staging del initramfs: hardlinks del rootfs + /init del medio live (rdinit=/init lo corre)
+echo "==> staging initramfs (+ /init marcador live)"
+STG="$WORK/rfs"; cp -al "$ROOTFS" "$STG"
+cat > "$STG/init" <<'INIT'
+#!/bin/sh
+/bin/busybox mount -t proc     proc /proc 2>/dev/null || true
+/bin/busybox mount -t sysfs    sys  /sys  2>/dev/null || true
+/bin/busybox mount -t devtmpfs dev  /dev  2>/dev/null || true
+echo "HAMMER-METAL-LIVE-OK: arranque por systemd-boot"
+exec /sbin/init
+INIT
+chmod +x "$STG/init"
+
+# 2) empaquetar initramfs.cpio.gz (root-owned, igual que iso-image.sh)
+echo "==> empaquetando initramfs.cpio.gz"
+( cd "$STG" && find . -print0 | cpio --null -o -H newc -R 0:0 2>/dev/null | gzip -1 ) > "$WORK/initramfs.cpio.gz"
+IRD="$WORK/initramfs.cpio.gz"; echo "    initramfs: $(du -h "$IRD" | cut -f1)"
+
+# 3) ESP FAT32: BOOTX64.EFI=systemd-boot + loader.conf + entry + kernel + initrd
+espkb=$(( ( $(stat -c%s "$KERNEL") + $(stat -c%s "$IRD") ) / 1024 + 16384 ))
+ESP="$WORK/esp.img"; rm -f "$ESP"; truncate -s "$(( espkb * 1024 ))" "$ESP"
+"$MT/mformat" -F -v HAMMER -i "$ESP" ::
+"$MT/mmd" -i "$ESP" ::/EFI ::/EFI/BOOT ::/loader ::/loader/entries
+"$MT/mcopy" -i "$ESP" "$SDBOOT" ::/EFI/BOOT/BOOTX64.EFI
+printf 'default hammer\ntimeout 8\neditor yes\n' > "$WORK/loader.conf"
+printf 'title   hammer (metal)\nlinux   /bzImage\ninitrd  /initramfs.cpio.gz\noptions %s\n' "$OPTIONS" > "$WORK/hammer.conf"
+"$MT/mcopy" -i "$ESP" "$WORK/loader.conf"   ::/loader/loader.conf
+"$MT/mcopy" -i "$ESP" "$WORK/hammer.conf"   ::/loader/entries/hammer.conf
+"$MT/mcopy" -i "$ESP" "$KERNEL"             ::/bzImage
+"$MT/mcopy" -i "$ESP" "$IRD"                ::/initramfs.cpio.gz
+echo "==> ESP poblada ($(du -h "$ESP" | cut -f1)):"
+"$MT/mdir" -i "$ESP" ::/ ::/EFI/BOOT ::/loader/entries 2>/dev/null | grep -iE 'BOOTX64|bzImage|initram|hammer|loader' || true
+
+# 4) imagen de disco GPT: GPT primaria (1MiB) + ESP (en sector 2048) + GPT backup
+esp_sectors=$(( espkb * 2 ))                       # KiB→sectores de 512
+rm -f "$IMG"; truncate -s "$(( (2048 + esp_sectors + 2048) * 512 ))" "$IMG"
+echo "label: gpt
+start=2048, size=$esp_sectors, type=C12A7328-F81F-11D2-BA4B-00A0C93EC93B, name=\"EFI System Partition\"" | sfdisk --quiet "$IMG"
+dd if="$ESP" of="$IMG" bs=512 seek=2048 conv=notrunc status=none
+
+echo
+echo "✓ USB metal (systemd-boot): $IMG ($(du -h "$IMG" | cut -f1))"
+echo "  Quemar:  sudo dd if=$IMG of=/dev/sdX bs=4M oflag=sync status=progress"
+echo "  Bootear: el menú de systemd-boot aparece; ENTER arranca. Tecla 'e' = EDITAR la cmdline en vivo."
+echo "  Secure Boot OFF. WiFi (en consola):  wifi-connect \"SSID\" \"CLAVE\""