# crun 1.29.1 — el runtime OCI. Es la HOJA de la única familia que la tabla de # `scripts/mudanza/planear.py` sigue dando vacía: «contenedores». Y entra como hoja a propósito: un # runtime OCI es lo que **cualquiera** de los tres candidatos de esa familia acaba ejecutando por # debajo, así que construirlo no presupone cuál se elige arriba (podman, containerd o nada). La # decisión de qué gestor lleva la distro sigue abierta y no la toma esta receta. # # **Por qué crun y no runc**, que es lo mismo pero en Go: crun está escrito en C, pesa ~300 KB contra # los ~10 MB de runc, y arranca contenedores en menos memoria — que importa en una caja de 7 GiB. Es # además el runtime por defecto de Alpine y de Fedora, o sea que musl es un objetivo probado y no una # aventura. runc sigue siendo una opción válida si alguien la necesita; no son excluyentes. # # ⚠ **`--disable-systemd` NO ES UNA PREFERENCIA: SIN ÉL EL `configure` ABORTA.** Su `configure.ac` # hace `AC_CHECK_HEADERS([systemd/sd-bus.h], [], [AC_MSG_ERROR(*** Missing libsystemd headers)])` — # o sea que systemd es obligatorio salvo que se apague explícitamente. Esta distro no lleva systemd # (el init es arje-zero), así que el cgroup manager de crun va a ser el suyo propio (`cgroupfs`), # no el de systemd. Es coherente con el resto del sistema, no una limitación que se descubra después. # # **Todo lo demás está pineado por la razón de siempre**: `configure` PRUEBA el entorno, y el lab no # entra en `hash_inputs` ⇒ lo que encuentre instalado cambiaría el binario sin mover el hash. # # --enable-embedded-blake3 el default es «autodetect»: si el lab tuviera `libblake3` la usaría, y # si no, cae a la copia embebida. Dos labs ⇒ dos binarios distintos en # la MISMA dirección del store. Se fija en `yes` (embebida), que además # es lo único posible: `libblake3` no está en el corpus. # --disable-criu checkpoint/restore necesita CRIU, que tampoco está. El `configure` lo # probaría con pkg-config y seguiría en silencio si no lo encuentra. # # `libcap` y `libseccomp` SÍ entran como deps y NO se apagan, que es la decisión contraria y # deliberada: son las dos piezas con las que un runtime OCI acota de verdad al contenedor. Un crun # con `--disable-caps --disable-seccomp` compila igual y aísla mucho menos — y el binario no lo # diría. Las dos están selladas en el corpus. # # **`argp-standalone` es la otra dep que no se deduce del proyecto**: crun parsea sus flags con # `argp_parse(3)`, que es una **extensión de glibc** y musl NO tiene. Sin ella `configure` muere con # `*** argp functions not found`. El corpus ya traía la receta (`recipes/argp-standalone.toml`, # sellada) — sólo faltaba que alguien la pidiera. # # **`python3` es dep de BUILD aunque crun sea C puro**, y el fallo lo dice sin ayudar: # `configure: error: no suitable Python interpreter found`. Su `configure.ac` llama a `AM_PATH_PYTHON` # sin marcarlo opcional, así que aborta aunque no se pidan las bindings de Python. Es la misma figura # que meson ([[receta-meson-exige-python3]]): una dep invisible que no se deduce del lenguaje del # proyecto. # # `json-c` es la librería de JSON con la que crun lee el `config.json` del bundle OCI. crun ≤1.2x # usaba yajl; 1.29 ya no (`grep -c yajl configure` → 0). Vale decirlo porque las recetas de otras # distros todavía arrastran yajl y uno la busca sin necesidad. name = "crun" version = "1.29.1" license = "GPL-2.0-or-later" [source] tarball = "https://github.com/containers/crun/releases/download/1.29.1/crun-1.29.1.tar.gz" sha256 = "b6be9fd9613efe5df414c568ddfaf09857c72ec17a00999f15c132a3d9e120fd" [build] compiler = "zig-cc" target = "x86_64-linux-musl" link = "static" flags = [] [build.phases] configure = './configure --build=$CBUILD --host=$CHOST --prefix=/usr --disable-systemd --disable-criu --enable-embedded-blake3 --disable-shared --enable-static' # ⚠ **`-all-static` EN LAS DOS FASES, Y NO ES REDUNDANCIA.** crun enlaza con **libtool**, que lee el # `-static` que el lab exporta por `link = "static"` como «preferí los `.a` de libtool» y NO como # flag al linker ⇒ el binario sale DINÁMICO y la receta jura que es estático. Lo cazó # `scripts/static-audit.sh`, que existe justo para esta mentira: # # ✗ crun dice static, es DINÁMICO (usr/bin/crun) → libc.so # # Va también en `install` porque **libtool RELINKEA al instalar**: ponerlo sólo en `compile` deja un # binario correcto en el árbol de build y uno dinámico en `/out`, que es el que se sella. compile = 'make -j"$(nproc)" LDFLAGS="-all-static -no-pie"' install = 'make install DESTDIR=/out LDFLAGS="-all-static -no-pie" && find /out -name "*.la" -delete' [deps] build = ["binutils", "busybox", "make", "pkgconf", "python3", "json-c", "libcap", "libseccomp", "argp-standalone"]