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…

⎇ main recipes/util-linux.toml TOML · 96 lines · 4.1 KB History raw

fix(privilegio): el bit de los reemplazos de busybox, y el symlink del piso que los tapaba c51c2bf32 · sergio ·

1# Importada de nixpkgs por `takana import-nix` (Etapa G). PUNTO DE PARTIDA, no final:
2# de-Alpinizada al lab de takana (zig-cc / musl estático). Objetivo mínimo:
3# mount/umount/lsblk/blkid/fdisk/lscpu (utilería base del sistema).
4name    = "util-linux"
5version = "2.42.2"
6license = "GPL-2.0-or-later AND LGPL-2.1-or-later AND BSD-3-Clause"
7
8[source]
9tarball = "https://www.kernel.org/pub/linux/utils/util-linux/v2.42/util-linux-2.42.2.tar.xz"
10sha256  = "03a05d3adf9602ef128f2da05b84b3205ce60c351e5737c0370f74000679ce8a"
11
12[build]
13compiler = "zig-cc"
14target   = "x86_64-linux-musl"
15link     = "static"
16flags    = []
17
18[build.phases]
19# fase configure EXPLÍCITA: si la receta no la define, takana autogenera su propio
20# `./configure --prefix=/usr` (sin nuestros --disable-*) e ignora estos flags.
21#
22# ESTÁTICO: libtool se COME el `-static` de LDFLAGS (lo lee como "static libtool
23# libs", no como link real) ⇒ el único camino a binarios musl 100% estáticos es
24# `--enable-static-programs`, que SÓLO soporta
25# blkid,fdisk,losetup,mount,nsenter,partx,sfdisk,umount,unshare. Produce
26# {mount,umount,blkid,fdisk}.static (verificados corriendo en el host). lsblk y
27# lscpu NO están en esa lista ⇒ quedan dinámicos-musl: construyen y corren en la
28# distro musl, pero en un host glibc segfaultean por loader-skew (no verificables
29# acá). El resto de binarios (lsblk/lscpu/...) son musl-dinámicos.
30configure = '''
31./configure \
32	--build=$CBUILD \
33	--host=$CHOST \
34	--prefix=/usr \
35	--localstatedir=/var \
36	--sysconfdir=/etc \
37	--disable-shared \
38	--enable-static \
39	--enable-static-programs=blkid,fdisk,mount,umount \
40	--disable-nls \
41	--disable-rpath \
42	--disable-liblastlog2 \
43	--disable-pylibmount \
44	--disable-makeinstall-setuid \
45	--disable-makeinstall-chown \
46	--without-python \
47	--without-systemd \
48	--without-systemdsystemunitdir \
49	--without-udev \
50	--without-cryptsetup \
51	--without-ncursesw \
52	--without-ncurses \
53	--without-tinfo \
54	--without-readline \
55	--without-libz \
56	--without-selinux \
57	--without-audit \
58	--without-econf
59'''
60compile = '''
61# zig cc traduce `-mcpu=baseline` a un `-mcpu=` VACÍO en modo preprocesador
62# (`-dM -E -`), que zig rechaza. Los generadores errnos.h/syscalls.h de
63# util-linux invocan `$(CC) -dM -E -` ⇒ filtramos ese flag (irrelevante para
64# extraer #defines) sólo en esos dos scripts; el resto del build lo conserva.
65for f in tools/all_errnos tools/all_syscalls; do
66	sed -i 's#^"$@" -MD#a=(); for x in "$@"; do [ "$x" = "-mcpu=baseline" ] || a+=("$x"); done\n"${a[@]}" -MD#' "$f"
67done
68make LDFLAGS="-all-static -no-pie"
69'''
70install = '''
71make DESTDIR="/out" install LDFLAGS="-all-static -no-pie"
72'''
73
74# deps de Alpine/nix remapeadas al catálogo canónico. AUSENTES quitadas:
75# autoconf/automake/po4a/libxcrypt/sqlite/linux-pam/libcap-ng/systemd-minimal-libs.
76[deps]
77build = ["linux-headers", "make"]
78
79# ── EL BIT DE PRIVILEGIO (SDD 28 §5.11, `[[setuid]]`) ─────────────────────────────────────────────
80# Declarado el 2026-10-15, al medir los artefactos del store: los binarios de abajo salen todos
81# `-rwxr-xr-x` y en cualquier otra distro son setuid. El hueco estaba ANOTADO —el encabezado de
82# `crates/takana-core/src/setuid.rs` los lista uno por uno— y era LATENTE mientras el instalador
83# solo pusiera contrasena de root. Desde que `lib/cuenta.sh` crea una cuenta de persona, dejo de
84# ser latente: hay un humano no-root que los choca a todos.
85#
86# Es metadato (fuera de `hash_inputs`), asi que entra en una receta YA SELLADA sin mover un solo
87# `ArtifactHash` — comprobado con `takana hash --check` antes y despues.
88[[setuid]]
89path = "bin/mount"
90mode = "4755"
91why  = "montar sin ser root lo que /etc/fstab marque `user`, que es como una persona usa un pendrive en una imagen que NO trae udisks. El bit no da mas que eso: mount rechaza cualquier punto que fstab no haya autorizado, y esa es la costura que lo hace defendible."
92
93[[setuid]]
94path = "bin/umount"
95mode = "4755"
96why  = "el par del anterior: poder montar y no poder desmontar deja el dispositivo tomado hasta reiniciar, y la persona tira del cable — que es la forma de perder datos."