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 1389Shell 137Markdown 80Rust 802602 Definiciones

Etapa metal: arranque UEFI por EFI-stub directo (esquiva GRUB 2.14 roto)

La rama GRUB-EFI cuelga (bug GRUB 2.14 del host rolling, afecta a cualquier kernel).
Solución: bootear el kernel por su EFI-STUB directo, sin GRUB-EFI.

- linux-metal.toml: CONFIG_CMDLINE_BOOL=y + CMDLINE horneado
  ('console=tty0 ... initrd=/initramfs.cpio.gz rdinit=/init'). Sin FORCE ⇒ en BIOS
  GRUB sigue mandando su cmdline. Confirmado en fuente (libstub/file.c:50): el
  EFI-stub convierte '/'→'\' y efi_load_initrd cae a la carga por cmdline sin loader.
- iso-image.sh: modo EFI_STUB=1 ⇒ la ESP lleva el bzImage como \EFI\BOOT\BOOTX64.EFI
  + initramfs.cpio.gz en su raíz (FAT32). La firmware lanza el kernel directo.
- metal-iso.sh: pasa EFI=1 EFI_STUB=1 (híbrido: BIOS GRUB + UEFI EFI-stub).

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

b1e2eb95cebe8c0986f6593349051cb9c4078236 · por sergio · (hace 4 meses) · padre 487d741f0 · ver el árbol en este commit

Delta semántico

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

3 archivos · +45 −20

diff --git a/recipes/linux-metal.toml b/recipes/linux-metal.toml
index 907c86ce..f791939f 100644
--- a/recipes/linux-metal.toml
+++ b/recipes/linux-metal.toml
@@ -15,6 +15,12 @@
 #                compilables; se inyectan en /lib/firmware del rootfs (ver scripts/metal-firmware.sh).
 #   - Red extra: e1000e/r8169/igb/igc/tg3 (Ethernet común) + USB-CDC/RNDIS (tether del celu) — baratos.
 #   - Boot:      EFI_STUB + EFI_PARTITION + VFAT (ESP) + ISO9660/Joliet (leer el medio live).
+#                CMDLINE EMBEBIDO (CONFIG_CMDLINE_BOOL, sin FORCE): el bzImage se arranca por EFI-STUB
+#                DIRECTO como \EFI\BOOT\BOOTX64.EFI (la firmware lo lanza sin GRUB — esquiva el bug de
+#                GRUB 2.14 que cuelga la rama UEFI). Sin bootloader no hay LoadOptions, así que el cmdline
+#                va horneado: console=tty0 (pantalla) + initrd=/initramfs.cpio.gz (el EFI-stub lo carga de
+#                la ESP; file.c convierte '/'→'\'). En boot BIOS, GRUB provee su propio cmdline (se
+#                antepone el embebido, inocuo) y su propio initrd ⇒ ambas ramas conviven.
 #
 # Conserva TODO lo que hammer necesita (de linux.toml): E1000/OVERLAY_FS(+subfeatures)/USER_NS/
 # NAMESPACES/FANOTIFY/VIRTIO* ⇒ esta misma imagen sigue booteando en QEMU (para poder testear el boot
@@ -59,7 +65,7 @@ scripts/config -d MODULE_SIG -d MODULE_SIG_ALL -d DEBUG_INFO_BTF -d DEBUG_INFO -
   -e SERIO -e SERIO_I8042 -e VT -e VT_CONSOLE \
   -e DRM -e DRM_SIMPLEDRM -e SYSFB_SIMPLEFB -e FB -e FB_EFI \
   -e FRAMEBUFFER_CONSOLE -e FRAMEBUFFER_CONSOLE_DETECT_PRIMARY \
-  -e EFI -e EFI_STUB -e EFI_PARTITION -e EFIVAR_FS \
+  -e EFI -e EFI_STUB -e EFI_PARTITION -e EFIVAR_FS -e CMDLINE_BOOL \
   -e VFAT_FS -e FAT_FS -e MSDOS_FS -e NLS_CODEPAGE_437 -e NLS_ISO8859_1 -e NLS_UTF8 \
   -e ISO9660_FS -e JOLIET \
   -e WLAN -e WIRELESS -e CFG80211 -e MAC80211 -e RFKILL \
@@ -71,6 +77,7 @@ scripts/config -d MODULE_SIG -d MODULE_SIG_ALL -d DEBUG_INFO_BTF -d DEBUG_INFO -
   -d SOUND -d SND -d MEDIA_SUPPORT -d INFINIBAND -d BT -d NFC -d CAN \
   -d WATCHDOG -d THUNDERBOLT -d FIREWIRE \
   -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" && \
 make ARCH=x86_64 olddefconfig
 """
 compile = "make ARCH=x86_64 CC=gcc HOSTCC=gcc -j\"$(nproc)\" bzImage"
diff --git a/scripts/iso-image.sh b/scripts/iso-image.sh
index 3e9b955e..ab5c8a81 100755
--- a/scripts/iso-image.sh
+++ b/scripts/iso-image.sh
@@ -138,27 +138,42 @@ grub-mkimage -O i386-pc-eltorito -p '/boot/grub' -o "$ISO_ROOT/boot/grub/i386-pc
 #     EFI_STUB; aquí GRUB EFI es el cargador (espeja la rama BIOS). xorriso añade un 2º El Torito (EFI). ---
 EFI_ARGS=""
 if [ "${EFI:-0}" = 1 ]; then
-    [ -d "$GRUB_EFI_LIB" ] || { echo "faltan módulos GRUB x86_64-efi en $GRUB_EFI_LIB" >&2; exit 1; }
     MFORMAT="$MTOOLS_DIR/mformat"; MCOPY="$MTOOLS_DIR/mcopy"; MMD="$MTOOLS_DIR/mmd"
     [ -x "$MFORMAT" ] && [ -x "$MCOPY" ] || MFORMAT="$(command -v mformat 2>/dev/null || true)"
     [ -n "$MFORMAT" ] && [ -x "$MFORMAT" ] || { echo "no encuentro mtools (build recipes/mtools.toml)" >&2; exit 1; }
     [ -x "$MCOPY" ] || { MCOPY="$(command -v mcopy)"; MMD="$(command -v mmd)"; }
-    echo "==> EFI=1: grub-mkimage x86_64-efi + ESP FAT (mtools: $MFORMAT)"
-    mkdir -p "$STAGE/efi"
-    grub-mkimage -O x86_64-efi -p '/boot/grub' -o "$STAGE/efi/bootx64.efi" \
-        part_gpt part_msdos fat iso9660 normal configfile linux echo ls boot search search_fs_uuid efi_gop efi_uga
-    # ESP FAT: dimensionada al grubx64.efi (+ holgura). mformat sobre una imagen truncada (FAT sin
-    # particionar; el El Torito EFI arranca el FS plano). Poblamos EFI/BOOT/BOOTX64.EFI con mcopy.
     ESP="$ISO_ROOT/boot/grub/efi.img"
-    # Tamaño ≥ 1.44 MiB (mínimo razonable); mformat SIN -F auto-elige FAT12/16 por nº de clusters. NO
-    # forzar FAT32 (-F): exige ~33 MiB mínimos y sobre una imagen chica deja un FAT inválido que la
-    # firmware no lee ("failed to load ... Not Found").
-    espkb=$(( ( $(stat -c%s "$STAGE/efi/bootx64.efi") / 1024 ) + 512 ))
-    [ "$espkb" -lt 1440 ] && espkb=1440
-    rm -f "$ESP"; truncate -s "$(( espkb * 1024 ))" "$ESP"
-    "$MFORMAT" -i "$ESP" ::
-    "$MMD"   -i "$ESP" ::/EFI ::/EFI/BOOT
-    "$MCOPY" -i "$ESP" "$STAGE/efi/bootx64.efi" ::/EFI/BOOT/BOOTX64.EFI
+    if [ "${EFI_STUB:-0}" = 1 ]; then
+        # --- EFI_STUB=1: arranque por EFI-STUB DIRECTO (sin GRUB-EFI). El bzImage ES el BOOTX64.EFI; la
+        #     firmware lo lanza por el path de medio removible \EFI\BOOT\BOOTX64.EFI. El cmdline va
+        #     HORNEADO en el kernel (CONFIG_CMDLINE, recipes/linux-metal.toml) con initrd=/initramfs.cpio.gz
+        #     ⇒ el EFI-stub carga el initrd de la PROPIA ESP (file.c convierte '/'→'\'). Esquiva el bug de
+        #     GRUB 2.14 que cuelga la rama UEFI con cualquier kernel. ---
+        INITRAMFS="$ISO_ROOT/boot/initramfs.cpio.gz"
+        [ -r "$INITRAMFS" ] || { echo "no encuentro $INITRAMFS para la ESP EFI-stub" >&2; exit 1; }
+        echo "==> EFI=1 EFI_STUB=1: kernel→BOOTX64.EFI + initramfs en la ESP (FAT32, sin GRUB-EFI)"
+        # ESP grande (kernel + initramfs + holgura) ⇒ FAT32 (-F), válido y recomendado para ESP en metal.
+        espkb=$(( ( $(stat -c%s "$KERNEL") + $(stat -c%s "$INITRAMFS") ) / 1024 + 8192 ))
+        rm -f "$ESP"; truncate -s "$(( espkb * 1024 ))" "$ESP"
+        "$MFORMAT" -F -i "$ESP" ::
+        "$MMD"   -i "$ESP" ::/EFI ::/EFI/BOOT
+        "$MCOPY" -i "$ESP" "$KERNEL"    ::/EFI/BOOT/BOOTX64.EFI
+        "$MCOPY" -i "$ESP" "$INITRAMFS" ::/initramfs.cpio.gz
+    else
+        # --- EFI=1 (default): GRUB EFI como cargador (espeja la rama BIOS, lee kernel+initrd del iso9660). ---
+        [ -d "$GRUB_EFI_LIB" ] || { echo "faltan módulos GRUB x86_64-efi en $GRUB_EFI_LIB" >&2; exit 1; }
+        echo "==> EFI=1: grub-mkimage x86_64-efi + ESP FAT (mtools: $MFORMAT)"
+        mkdir -p "$STAGE/efi"
+        grub-mkimage -O x86_64-efi -p '/boot/grub' -o "$STAGE/efi/bootx64.efi" \
+            part_gpt part_msdos fat iso9660 normal configfile linux echo ls boot search search_fs_uuid efi_gop efi_uga
+        # Tamaño ≥ 1.44 MiB; mformat SIN -F auto-elige FAT12/16 por nº de clusters (FAT32 exige ~33 MiB).
+        espkb=$(( ( $(stat -c%s "$STAGE/efi/bootx64.efi") / 1024 ) + 512 ))
+        [ "$espkb" -lt 1440 ] && espkb=1440
+        rm -f "$ESP"; truncate -s "$(( espkb * 1024 ))" "$ESP"
+        "$MFORMAT" -i "$ESP" ::
+        "$MMD"   -i "$ESP" ::/EFI ::/EFI/BOOT
+        "$MCOPY" -i "$ESP" "$STAGE/efi/bootx64.efi" ::/EFI/BOOT/BOOTX64.EFI
+    fi
     EFI_ARGS="-eltorito-alt-boot -e boot/grub/efi.img -no-emul-boot -isohybrid-gpt-basdat"
 fi
 
diff --git a/scripts/metal-iso.sh b/scripts/metal-iso.sh
index 693828d4..6855d9b5 100755
--- a/scripts/metal-iso.sh
+++ b/scripts/metal-iso.sh
@@ -81,9 +81,12 @@ chmod +x "$AUG/usr/bin/wifi-connect"
 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
+# 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))"