1# ADR 0005 — Hidratación por hardlinks
2
3- **Estado:** aceptada
4- **Fecha:** 2026-06-06
5
6## Contexto
7
8Hay que llevar artefactos del store content-addressed al FHS real. Tres opciones:
9
101. **Symlinks al store** (estilo Nix): rutas crípticas, `/bin` lleno de enlaces a un almacén
11 oculto. Es justo el "pueblo fantasma" que rechazamos.
122. **Copia ciega** al FHS: rutas reales, pero se pierde el dedup y la relación con el store
13 (rollback más torpe, más disco).
143. **Hardlinks** del store al FHS.
15
16## Decisión
17
18**Hidratación por hardlinks** como modo por defecto (con `patchelf` para normalizar el caso
19dinámico antes del enlace).
20
21## Razones
22
23- **Rutas reales:** `/bin/grep` es un archivo de verdad, no un symlink a `/store/...`.
24 Estructura familiar, control total en la terminal.
25- **Dedup:** el hardlink comparte el inode del store; cero copia mientras no se modifique.
26- **Mutabilidad con red de seguridad:** pisar `/bin/grep` en caliente **rompe el hardlink**
27 (copy-on-write manual); el artefacto del store queda intacto como base de rollback.
28- **Rollback simple:** re-hidratar restaura el hardlink original desde el store.
29
30## Consecuencias
31
32- Hardlinks requieren que store y FHS estén en el **mismo filesystem**. En la fase Alpine viven
33 ambos en el rootfs → OK. En la distro propia se tendrá en cuenta al particionar
34 ([SDD 10](../10-roadmap.md)).
35- El caso dinámico necesita `patchelf` (set-interpreter + set-rpath) **antes** del hardlink
36 ([SDD 03](../03-hydration.md) §4).
37- El GC del store debe contar hardlinks/alcanzabilidad para no borrar artefactos vivos.
0005-hardlink-hydration.md
ADR 0005 — Hidratación por hardlinks
- Estado: aceptada
- Fecha: 2026-06-06
Contexto
Hay que llevar artefactos del store content-addressed al FHS real. Tres opciones:
- Symlinks al store (estilo Nix): rutas crípticas,
/bin lleno de enlaces a un almacén
oculto. Es justo el "pueblo fantasma" que rechazamos.
- Copia ciega al FHS: rutas reales, pero se pierde el dedup y la relación con el store
(rollback más torpe, más disco).
- Hardlinks del store al FHS.
Decisión
Hidratación por hardlinks como modo por defecto (con patchelf para normalizar el caso
dinámico antes del enlace).
Razones
- Rutas reales:
/bin/grep es un archivo de verdad, no un symlink a /store/....
Estructura familiar, control total en la terminal.
- Dedup: el hardlink comparte el inode del store; cero copia mientras no se modifique.
- Mutabilidad con red de seguridad: pisar
/bin/grep en caliente rompe el hardlink
(copy-on-write manual); el artefacto del store queda intacto como base de rollback.
- Rollback simple: re-hidratar restaura el hardlink original desde el store.
Consecuencias
- Hardlinks requieren que store y FHS estén en el mismo filesystem. En la fase Alpine viven
ambos en el rootfs → OK. En la distro propia se tendrá en cuenta al particionar
(SDD 10).
- El caso dinámico necesita
patchelf (set-interpreter + set-rpath) antes del hardlink
(SDD 03 §4).
- El GC del store debe contar hardlinks/alcanzabilidad para no borrar artefactos vivos.