From 36be67fa9c34ab2601dd30b27dced4778f5c39a2 Mon Sep 17 00:00:00 2001 From: Sergio Date: Thu, 10 Sep 2026 21:33:46 +0000 Subject: [PATCH] =?UTF-8?q?netup:=20levantar=20el=20LOOPBACK=20=E2=80=94?= =?UTF-8?q?=20nadie=20lo=20hac=C3=ADa,=20y=20el=20s=C3=ADntoma=20era=20un?= =?UTF-8?q?=20timeout=20de=2030=20s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit En un sistema con systemd u OpenRC el init levanta `lo`. Con arje-zero no lo hacía **nadie**. Medido en la caja de producción el 2026-09-10: ip -o link show lo => lo: DOWN (y CERO direcciones) caddy escuchando en 0.0.0.0:80 curl http://127.0.0.1/index.json => timeout de 30 s No «connection refused», que se diagnostica en un minuto: un CUELGUE, que parece del servidor. Se descubrió intentando que la caja instalara un paquete de su propio repo — o sea que el primer servicio que habló con 127.0.0.1 fue también el primero en chocarse. Cualquier cosa que use loopback fallaba igual: un backend detrás de un proxy, un socket TCP entre demonios, un repo local. Va en `netup` porque es quien configura la red, y no es fatal: si ya estaba levantado los errores son EEXIST y no deben tumbar el arranque. Probado en un netns, en los dos estados: antes `lo: ` con 0 direcciones; después `lo: ` con `inet 127.0.0.1/8 scope host`. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01RomoxEGZUhaT4pob1QSX5x --- crates/netup/src/main.rs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/crates/netup/src/main.rs b/crates/netup/src/main.rs index e6bff1fa..4ae72cd8 100644 --- a/crates/netup/src/main.rs +++ b/crates/netup/src/main.rs @@ -32,6 +32,27 @@ fn run() -> Result<(), Box> { println!("netup: interfaz {iface} (index {ifindex}, mac {})", fmt_mac(mac)); let mut nl = netlink::Netlink::open()?; + + // ── EL LOOPBACK, PRIMERO. Nadie más lo levanta. ────────────────────────────────────────── + // En un sistema con systemd/OpenRC esto lo hace el init; con arje-zero no lo hacía NADIE, y + // `lo` quedaba `DOWN` y sin dirección. Medido el 2026-09-10 en la caja de producción: caddy + // escuchando en `0.0.0.0:80` y `curl http://127.0.0.1/` **con TIMEOUT de 30 s** — no + // "connection refused", que se diagnostica en un minuto, sino un cuelgue que parece del + // servidor. Cualquier servicio que hable con 127.0.0.1 (un repo local, un backend detrás de un + // proxy, un socket TCP entre demonios) fallaba igual. + // + // Va acá porque `netup` es el que configura la red, y no es fatal: si ya estaba levantado, los + // errores son EEXIST y no deben tumbar el arranque. + if let Ok(lo) = read_sysfs_int("lo", "ifindex") { + let lo = lo as i32; + if let Err(e) = nl.link_up(lo) { + eprintln!("netup: aviso, no pude levantar lo: {e}"); + } + if let Err(e) = nl.add_addr(lo, [127, 0, 0, 1], 8) { + eprintln!("netup: aviso, no pude direccionar lo: {e}"); + } + } + nl.link_up(ifindex)?; // Esperar el carrier (virtio/e1000 lo levantan en ms, pero damos margen). wait_carrier(&iface, std::time::Duration::from_secs(5));