Nix sin dolor: que va donde y por que
La confusion es normal
Llegas a Nix y te encuentras con: nixpkgs, NixOS, flakes, home-manager, configuration.nix, flake.nix, nix run, nix shell, nix develop, overlays, derivations, comma... Y nadie te explica como encajan las piezas.
Este post es el que me hubiera gustado leer cuando empece. Sin jerga innecesaria, con ejemplos reales.
Las capas de Nix (de abajo a arriba)
Piensa en Nix como una torre de capas. Cada capa resuelve un problema distinto. No necesitas usar todas.
Capa 1: Nix (el gestor de paquetes)
Esto es la base. Nix es un gestor de paquetes como apt o pacman, pero con un superpoder: no rompe nada. Cada paquete se instala en su propia ruta unica (/nix/store/abc123-htop-3.2/) y nunca pisa a otro paquete.
Se instala en cualquier Linux o macOS. No necesitas NixOS.
# Instalar Nix en Ubuntu/Fedora/macOS
curl -L https://nixos.org/nix/install | shCon Nix instalado ya puedes usar:
nix run nixpkgs#programa-- ejecutar sin instalarnix shell nixpkgs#programa-- tener disponible en el shell actual, programa-- ejecutar sin saber el paquete (comma)
Esto es suficiente para empezar. No necesitas nada mas.
Capa 2: nixpkgs (el repositorio)
nixpkgs es un repositorio de GitHub con mas de 100.000 paquetes definidos en Nix. Cuando escribes nixpkgs#htop, estas diciendo "del repo nixpkgs, dame htop".
Tiene varias ramas:
- nixos-unstable: paquetes recientes, lo que la mayoria usa
- master: lo ultimo, puede estar roto
- nixos-24.11: estable, conservador
No tienes que preocuparte de esto al principio. Solo saber que existe.
Capa 3: NixOS (el sistema operativo)
Opcional. NixOS es un Linux donde TODO el sistema se define en un archivo de configuracion. No hay apt install. No hay editar archivos sueltos en /etc/. Todo esta en un solo sitio.
El archivo magico: /etc/nixos/configuration.nix
# Quieres instalar firefox, git y htop?
environment.systemPackages = with pkgs; [
firefox
git
htop
];
# Quieres habilitar SSH?
services.openssh.enable = true;
# Quieres un usuario?
users.users.pascual = {
isNormalUser = true;
extraGroups = [ "wheel" ];
};Aplicas los cambios con:
sudo nixos-rebuild switchY el sistema entero se reconstruye. Si algo falla, reinicias y eliges la generacion anterior en el boot. Imposible dejar el sistema roto.
Si usas Ubuntu con Nix, no tienes configuration.nix. No pasa nada. Las capas 1 y 2 ya te dan mucho.
Capa 4: Flakes (el formato moderno)
Flakes es una forma de organizar la configuracion de Nix con dependencias fijadas. En vez de un configuration.nix suelto, tienes un flake.nix que declara:
- inputs: de donde vienen las cosas (que version de nixpkgs, que modulos extra)
- outputs: que produces (configuraciones NixOS, shells de desarrollo, paquetes)
# flake.nix basico
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
};
outputs = { self, nixpkgs }: {
nixosConfigurations.mi-maquina = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [ ./configuration.nix ];
};
};
}La ventaja: un flake.lock fija las versiones exactas de todo. Dos personas con el mismo flake.lock obtienen exactamente el mismo sistema. Reproducible al 100%.
Puedes tener multiples fuentes de paquetes (esto es clave):
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; # La mayoria de paquetes
nixpkgs-master.url = "github:NixOS/nixpkgs/master"; # Los mas nuevos
home-manager.url = "github:nix-community/home-manager"; # Config de usuario
};Asi puedes tener la mayoria del sistema en "unstable" (estable en la practica) y traer paquetes puntuales de "master" cuando necesitas la ultima version.
Capa 5: home-manager (configuracion de usuario)
home-manager gestiona tu configuracion personal: programas de usuario, dotfiles, shell, editor, etc. La diferencia con NixOS:
- NixOS (configuration.nix): sistema, servicios, kernel, usuarios
- home-manager (home.nix): tu shell, tus programas, tus configs
# home.nix
programs.git = {
enable = true;
userName = "Pascual";
userEmail = "[email protected]";
};
programs.fish.enable = true;
home.packages = with pkgs; [
ripgrep
fd
jq
];home-manager funciona con o sin NixOS. Si estas en Ubuntu con Nix instalado, puedes usar home-manager standalone para gestionar tu entorno de usuario sin tocar el sistema.
Capa 6: nix develop (entornos de desarrollo)
Para proyectos. Cada proyecto puede tener su propio flake.nix que define exactamente que herramientas necesita:
# flake.nix de un proyecto PHP
devShells.default = pkgs.mkShell {
packages = [ pkgs.php83 pkgs.composer pkgs.mariadb ];
};Entras con nix develop y tienes PHP 8.3, Composer y MariaDB disponibles. Sales y desaparecen. Cada proyecto tiene su entorno aislado, sin conflictos.
Entonces, que va donde?
| Quiero... | Va en... | Comando |
|---|---|---|
| Probar un programa rapido | Nada, no se instala | nix run nixpkgs#programa o , programa |
| Un programa siempre disponible (sistema) | configuration.nix | environment.systemPackages |
| Un programa para mi usuario | home.nix | home.packages |
| Un servicio del sistema (ssh, docker...) | configuration.nix | services.openssh.enable |
| Config de un programa (git, fish, vim...) | home.nix | programs.git.enable |
| Herramientas para un proyecto | flake.nix del proyecto | nix develop |
| Fijar versiones de nixpkgs | flake.nix + flake.lock | nix flake update |
| Un paquete que no esta en unstable | nixpkgs-master como input | pkgsMaster.programa |
Errores tipicos de novato
- Meter todo en configuration.nix: los programas de usuario van en home-manager. El sistema solo necesita servicios, kernel, y poco mas
- No usar flakes: si, funcionan sin flakes. Pero las versiones quedan al aire. Con flakes todo queda fijado y reproducible
- Instalar paquetes con nix-env: olvidate de
nix-env -i. Es el "apt install" de Nix y va en contra de la filosofia declarativa. Pon los paquetes en configuration.nix o home.nix - Editar /etc/ directamente: en NixOS, todo lo que edites en /etc/ se sobreescribe en el proximo rebuild. La configuracion va en los .nix
- No leer el error: los errores de Nix son verbosos pero informativos. La ultima linea suele decir exactamente que falta
La ruta recomendada
- Instala Nix en tu sistema actual (Ubuntu, Fedora, lo que sea)
- Prueba
nix runy,para ejecutar programas sin instalar - Monta home-manager standalone para gestionar tus configs
- Si te convence, considera NixOS como sistema principal
- Cuando tengas NixOS, migra a flakes para tener todo fijado
No hace falta saltar a NixOS desde el dia uno. Nix es util desde la primera capa.
Comentarios (0)
Sin comentarios todavia. Se el primero!
Deja un comentario