El ensamblado dejaba de ser reproducible en cuanto se cerraba la terminal: cuatro pasos, tres de ellos con una trampa que no se ve. Ahora es un script, con las trampas escritas en su cabecera: 1. **El kernel.** `linux.toml` NO sirve para hcloud (apaga SCSI y el disco de Hetzner es virtio-SCSI). Va `linux-generic`, que sí trae `CONFIG_SCSI_VIRTIO=y` — dato que no está en la receta, lo pone `make defconfig`, y sólo se ve en el `.config` que el artefacto publica. 2. **El init se pisa.** La clausura del perfil trae busybox y su `/sbin/init` gana por hidratarse después. El script lo restaura e IMPRIME la reparación (`../bin/busybox → /usr/bin/arje-zero`), que es la diferencia entre arreglarlo y creer que estaba bien. 3. **EXDEV.** Comprueba con `findmnt` que STORE y WORKDIR estén en el MISMO montaje y aborta con un mensaje que dice qué hacer, en vez de fallar fichero por fichero a mitad de un `cp -al`. 4. **La clave es obligatoria.** Sin `AUTHKEYS` no arma nada: una instalación remota sin `authorized_keys` deja una máquina viva e INALCANZABLE, que es peor que una que no arrancó. Y el cmdline va SIN `init=`, a propósito: así corre el wrapper que escribe `install-image.sh`, que es quien monta `/store` y `/var/lib/hammer`. **`netup` entra como raíz de `perfil.servidor`** aunque su binario ya venga dentro del `product-rootfs`. La razón es concreta y se pagó hoy: el del producto está congelado en el artefacto sellado del bootstrap, así que el arreglo de la ruta on-link NO llegaba a la imagen. Declarado como raíz, la hidratación lo proyecta encima y la imagen lleva el vigente — verificado por sha256: la imagen trae `a23df20e…` y el product-rootfs `a84b0a0d…`. `recipes/netup.toml` re-pineado a `be383ea4` (el commit del arreglo). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RomoxEGZUhaT4pob1QSX5x
25 lines
1.1 KiB
TOML
25 lines
1.1 KiB
TOML
# netup — configuración de red mínima Rust-nativa (link up + cliente DHCPv4 + addr/route/resolv).
|
|
#
|
|
# Etapa C pieza 5 (userland Rust-nativo): a diferencia de uutils/findutils/ripgrep (ADOPCIÓN de un
|
|
# binario maduro), netup es código takana-PROPIO (no hay cliente DHCP Rust maduro para adoptar al estilo
|
|
# ripgrep, y el workspace es 100% sync ⇒ rtnetlink/tokio quedan fuera). Mismo patrón de receta que
|
|
# hammerd/arje-zero: construye un crate del workspace takana a un commit fijado, deps vendoreadas para
|
|
# build hermético --offline, link con zig cc. Sólo depende de libc ⇒ vendor mínimo.
|
|
#
|
|
# Reemplaza el `ip` estático de busybox. Validado in-VM contra el DHCP de QEMU slirp (lease+ruta+DNS).
|
|
|
|
name = "netup"
|
|
version = "0.0.1"
|
|
license = "MIT"
|
|
|
|
[source]
|
|
# Repo del propio takana (origin). El commit es el identificador inmutable; subirlo cuando netup avance.
|
|
repo = "ssh://gitea@git.tawasuyu.net:2345/sergio/takana.git"
|
|
commit = "be383ea485def684cb5886530efcd5333548743d"
|
|
|
|
[build]
|
|
compiler = "zig-cc"
|
|
target = "x86_64-linux-musl"
|
|
link = "static"
|
|
flags = ["-p", "netup"]
|