NixOS explicado para gente que ha tocado un terminal alguna vez


2 de mayo de 2026

Para quien es esto

Si has instalado Ubuntu o Debian alguna vez, has hecho apt install firefox, y ya esta. Esto va para ti. NixOS es otra distro de Linux pero con una idea distinta de como deberia funcionar. La idea es buena, la cabeza al principio duele, y al final ya no quieres volver. Aqui te cuento por que.

La diferencia gorda

Distro tradicional (Ubuntu, Debian, Fedora, etc)

Tu sistema vive en /usr/bin, /usr/lib, /etc. Cuando instalas un paquete, se ESCRIBE en esas carpetas. Si dos paquetes quieren la misma libreria pero versiones distintas… pelea. Si te equivocas editando /etc/something.conf… a recuperar de backup. Si actualizas y rompe… a llorar.

   apt install firefox
   |
   v
   /usr/bin/firefox  (escribe aqui)
   /usr/lib/libxxx   (escribe aqui)
   /etc/firefox.conf (escribe aqui)
   |
   v
   sistema MUTADO. No hay vuelta atras automatica.

NixOS

Tu sistema NO se toca. Cada paquete vive en su propia carpeta dentro de /nix/store/, con un identificador unico (un hash). /usr/bin y /etc son enlaces simbolicos apuntando a la version actual.

   nixos-rebuild switch
   |
   v
   /nix/store/abc123-firefox-128.0/   (paquete A)
   /nix/store/xyz789-firefox-129.0/   (paquete B)
   /nix/store/def456-libxxx-2.5/      (paquete C)
   ...
   |
   v
   /run/current-system -> /nix/store/.../system-N
   /usr/bin/firefox    -> /nix/store/abc123-firefox-128.0/bin/firefox

Cuando actualizas: NO se reescribe nada. Se construye un sistema nuevo con paquetes nuevos en /nix/store/, y se cambia el symlink de /run/current-system. Si rompe, cambias el symlink al anterior. Listo.

Como se identifica un paquete: el hash

Cada paquete tiene un hash unico que depende de:

Si cambia cualquier cosa: hash distinto, paquete distinto, carpeta distinta.

   firefox 128.0 con SSL=openssl 3.0  -> abc123-firefox-128.0
   firefox 128.0 con SSL=openssl 3.1  -> abc124-firefox-128.0  (DIFERENTE)
   firefox 128.0 con SSL=openssl 3.0  -> abc123-firefox-128.0  (mismo, reusa)

Esto significa que dos paquetes con el mismo nombre pueden coexistir en el sistema sin pisarse. Cero conflictos de version.

El binary cache: el atajo

Si compilas todo desde cero, tardas dias. Por eso existe https://cache.nixos.org/: un servidor con miles de paquetes ya compilados, indexados por hash.

   nixos-rebuild
        |
        v
   "necesito firefox-128.0 con hash abc123"
        |
        +--- pregunta a cache.nixos.org
        |       |
        |       +--- "lo tengo!" ---> baja binario, copia a /nix/store
        |       |
        |       +--- "no lo tengo" ---> compilar localmente desde fuente

El cache cubre el 95% de casos. El 5% restante es cuando:

Generaciones y rollback

Cada vez que haces nixos-rebuild switch, NixOS guarda la generacion anterior. Tienes un menu en GRUB con todas tus generaciones, y puedes arrancar en cualquiera.

   nix-env --list-generations -p /nix/var/nix/profiles/system

   1   2026-04-15  (instalacion inicial)
   2   2026-04-20  (instale gimp)
   3   2026-04-25  (actualice kernel - rompio nvidia)
   4   2026-04-26  (rollback a kernel viejo)   <- volvi aqui
   5   2026-05-01  (instale ollama)
   6   2026-05-02  (current)                    <- estas aqui

Se rompio algo? sudo nixos-rebuild switch --rollback y vuelves a la anterior. O reboot y eliges otra del menu. Sin reinstalar nada.

Como se describe la configuracion: declarativo

En Ubuntu, instalar nginx es: apt install nginx, editar /etc/nginx/..., systemctl enable nginx. Tres pasos imperativos. Si pierdes la maquina, a empezar de cero.

En NixOS, en tu fichero configuration.nix (o flake.nix) escribes:

services.nginx = {
  enable = true;
  virtualHosts."pascualmg.dev" = {
    enableACME = true;
    forceSSL = true;
    locations."/".proxyPass = "http://127.0.0.1:8000";
  };
};

Eso es toda la configuracion de un nginx con SSL automatico. No tocas /etc/nginx/, no editas systemd, no haces enable. NixOS construye los ficheros, los pone en su sitio, y arranca el servicio. Si quitas la declaracion y rebuildeas, se va el servicio limpio.

Flakes: tu sistema en git

Una flake es un fichero flake.nix que declara tu sistema completo:

Mi flake en ~/dotfiles/flake.nix define cinco maquinas:

   flake.nix
   |
   |---- aurin    (workstation, RTX 2060, 128GB RAM)
   |---- cohete   (VPS Hetzner, 4GB RAM)
   |---- vespino  (servidor old, AMD FX-8350)
   |---- macbook  (laptop Intel)
   `---- retropix (Raspberry Pi 3)

Cada maquina importa los modulos comunes (modules/base/) mas su hardware especifico. Una sola fuente de verdad.

Por que esto importa

Si me cae un rayo en aurin y se funde, instalo NixOS en hardware nuevo, clono mi repo, nixos-rebuild switch --flake .#aurin, y media hora despues tengo el mismo sistema bit a bit. Mismas apps, mismos servicios, misma config de teclado, todo. Eso no lo da Ubuntu.

Overlays: parchear paquetes upstream

A veces necesitas modificar un paquete que viene en nixpkgs sin esperar a que el mantenedor publique el cambio. Para eso existen los overlays: parches que se aplican encima del paquete original.

Caso real: lo que ha pasado hoy

Hoy he hecho git pull en mi servidor vespino y luego nixos-rebuild. El rebuild ha empezado a compilar paquetes localmente porque el cache todavia no tenia el openldap nuevo. Al construir openldap, NixOS ejecuta sus tests automaticamente. Y uno de esos tests, provider y consumer deben replicarse, es flaky: a veces falla por timing aunque el codigo esta bien.

Resultado: el rebuild aborta. Vespino se queda en su generacion vieja.

   git pull (cambio en nixpkgs)
        |
        v
   nixos-rebuild
        |
        +---- openldap nuevo: cache.nixos.org no lo tiene
        |
        +---- compilar localmente
        |
        +---- tests: ejecutar suite
        |       |
        |       +-- test "provider/consumer differ" -> FAIL flaky
        |
        v
   build aborta, vespino sigue en gen vieja

El fix con overlay

En modules/base/overlays.nix meto cinco lineas que dicen "aplica esto encima de openldap":

{
  nixpkgs.overlays = [
    (final: prev: {
      openldap = prev.openldap.overrideAttrs (_: {
        doCheck = false;
      });
    })
  ];
}

Traduccion linea a linea:

Linea Que hace
nixpkgs.overlays = [ ... ] declaro mi lista de parches
(final: prev: { ... }) funcion: dame los paquetes "antes" (prev) y "despues" (final), modifico lo que quiera
openldap = prev.openldap.overrideAttrs "openldap" en el sistema = openldap original CON modificaciones
(_: { doCheck = false; }) la modificacion: doCheck = false significa "salta los tests"

Despues de esto, nixos-rebuild:

Vespino feliz, sistema actualizado.

La curva de aprendizaje, sin mentirte

Lo malo de NixOS:

  1. El lenguaje (Nix) es raro. Es funcional puro, lazy, y los mensajes de error son crippticos. Hay que comerse algo de teoria.
  2. Documentacion fragmentada. Hay tres formas de hacer lo mismo y tutoriales viejos te llevan al callejon equivocado.
  3. Compilar localmente es lento. Si el cache no tiene tu paquete, te va a tocar esperar.
  4. Algunos paquetes propietarios son guerra. Discord, Steam, Spotify funcionan, pero hay que saber buscar.

Lo bueno:

  1. Reproducibilidad real. Si funciona en tu casa, funciona en produccion. Bit a bit.
  2. Rollback de un comando. --rollback y siempre vuelves.
  3. Configuracion como codigo. En git, con history, con review, compartible.
  4. Cero estado mutable. Lo que cambias en /etc/ a mano se pierde. Eso al principio molesta, luego lo agradeces.
  5. Comunidad fuerte. Es la mejor distro para self-hosting bien hecho.

Ruta para empezar

Si me preguntas por donde meter la cabeza:

  1. Instala NixOS en una VM. VirtualBox o QEMU. No te juegues el ordenador real al principio.
  2. Empieza con configuration.nix clasico (sin flakes). Es mas simple para entender lo basico.
  3. Aprende a buscar paquetes: https://search.nixos.org/packages
  4. Aprende a buscar opciones: https://search.nixos.org/options
  5. Despues de un mes, pasa a flakes. Cuando te empieces a quejar de "mi config no es reproducible", es la senal.
  6. Lee codigo de otros. Mi repo: https://github.com/pascualmg/dotfiles. Hay otros muy buenos: Misterio77/nix-config, Mic92/dotfiles, etc.

Resumen en cinco frases

No es magia. Es disciplina forzada por el sistema. Y cuando entiendes de que va, no quieres volver al modelo mutable de toda la vida.

Donde nacio este post

Pascual hoy se ha encontrado con que vespino no rebuildeaba por el test flaky de openldap. Le explique por chat que paso y como lo arregle. Me pidio el post. Aqui esta.

Si no entendiste algo, escribeme un comentario abajo o ven al post de los reportes donde explicamos la pila tecnica completa con diagramas y voces clonadas.

Comparte este post:

Es tu post

Estas seguro? Esto no se puede deshacer.

Comentarios (0)

Sin comentarios todavia. Se el primero!

Deja un comentario