NixOS
NixOS es una distribución de Linux basada en el gestor de paquetes y sistema de construcción Nix. Admite la gestión declarativa de la configuración de todo el sistema, así como actualizaciones y reversiones atómicas, aunque también puede admitir la gestión imperativa de paquetes y usuarios. En NixOS, todos los componentes de la distribución; incluido el kernel, los paquetes instalados y los archivos de configuración del sistema; son construidos por Nix a partir de funciones puras llamadas expresiones Nix.
Dado que Nix utiliza caché de binarios, esto proporciona un equilibrio único entre el enfoque orientado a binarios utilizado por distribuciones como Debian y el enfoque orientado al código fuente utilizado por distribuciones como Gentoo. Los binarios pueden utilizarse para componentes estándar, y los paquetes y módulos personalizados pueden utilizarse automáticamente cuando no hay disponible un binario precompilado.
Las versiones estables de NixOS se publican dos veces al año (alrededor de finales de mayo y finales de noviembre). NixOS fue creado por Eelco Dolstra y Armijn Hemel, y publicado inicialmente en 2003. Es desarrollado y mantenido por la comunidad bajo la supervisión de la Fundación NixOS.
Instalación
Para obtener una guía de instalación completa, consulta el capítulo de instalación del manual de NixOS. Esta wiki también incluye guías alternativas o complementarias, como NixOS como escritorio.
La mayoría de los usuarios instalarán NixOS mediante una de las imágenes ISO. Hay disponibles variantes ISO "gráfica" y "mínima" para cada arquitectura compatible; las imágenes "gráficas" son adecuadas para usuarios que planean instalar un entorno de escritorio, mientras que las imágenes "mínimas" son adecuadas para usuarios que desean instalar NixOS como servidor o prefieren una imagen ISO más pequeña.
Las imágenes ISO son imágenes híbridas que pueden grabarse en medios ópticos o copiarse directamente a una unidad USB y arrancarse tal cual. Consulta la guía de instalación para obtener más detalles.
Además de las imágenes ISO, la página de descarga ofrece varios métodos alternativos para instalar NixOS. Estos incluyen:
- Dispositivos virtuales en formato OVA (compatibles con VirtualBox);
- AMI de Amazon EC2;
Additionally, many existing Linux installations can be converted into NixOS installations using nixos-infect or nixos-in-place; this is particularly useful for installing NixOS on hosting providers which do not natively support NixOS.
Arquitecturas del sistema
NixOS ofrece soporte integrado para la mayoría de dispositivos x86_64 y dispositivos ARM64 genéricos.
Arquitecturas 32-bit x86
El soporte para arquitecturas x86 de 32 bits (es decir, i686) ha ido disminuyendo. Aunque la mayoría de los paquetes todavía deberían compilarse y ejecutarse, su disponibilidad en caché se ha reducido considerablemente[1]. La ISO de x86 de 32 bits ya no se ofrece como una imagen preconstruida, pero todavía puede generarse manualmente.
Arquitecturas 64-bit x86
La mayoria de los dispositivos x86_64 deberian ejecutar NixOS sin ningun problema.
Arquitecturas 32-bit ARM
- Main article: NixOS on ARM
NixOS no tiene soporte oficial para dispositivos ARM32 (por ejemplo, armv6 y armv7l); sin embargo, para algunos de estos dispositivos puede existir soporte por parte de la comunidad.
Arquitecturas ARM de 64 bits
- Main article: NixOS on ARM
Siempre que un dispositivo sea compatible con el proceso de arranque genérico de systemd, NixOS debería funcionar sin configuración adicional. Sin embargo, algunos dispositivos específicos con cargadores de arranque propietarios pueden presentar problemas al ejecutarlo.
Arquitecturas MIPS
- Main article: NixOS on MIPS
En el pasado hubo soporte limitado para arquitecturas MIPS en NixOS, y aún pueden encontrarse vestigios de ese soporte en Nixpkgs. Sin embargo, actualmente no existe soporte oficial.
Arquitecturas RISC-V
- Main article: RISC-V
NixOS no ofrece soporte oficial para dispositivos RISC-V. Sin embargo, algunos dispositivos pueden contar con soporte de la comunidad.
Uso
Configuración Declarativa
Una de las características distintivas de NixOS es su modelo de configuración declarativa, donde todo el estado del sistema, incluidos los paquetes instalados, los servicios del sistema y la configuración, se describe en archivos de configuración. El archivo principal suele estar ubicado en /etc/nixos/configuration.nix.
Los cambios en la configuración se aplican de forma atómica mediante nixos-rebuild switch, garantizando la reproducibilidad y la posibilidad de volver a estados anteriores. La mayoría de los usuarios mantienen sus archivos de configuración en un sistema de control de versiones, lo que permite configuraciones del sistema coherentes y portables.
Estas deficiencias suelen corregirse posteriormente, si es que se corrigen, mediante soluciones de gestión de configuración como Puppet, Ansible o Chef. Estas herramientas sincronizan la configuración del sistema con una descripción del estado esperado. Sin embargo, estas herramientas no están integradas en el diseño del sistema operativo, sino que simplemente se superponen sobre él, y la configuración del sistema operativo aún puede variar cuando algún aspecto de dicha configuración no ha sido especificado en la descripción del estado esperado.
A diferencia de las distribuciones convencionales, donde la configuración del sistema suele estar repartida entre archivos editados manualmente, NixOS integra la gestión de configuración directamente en el sistema operativo. Esto elimina las inconcistencias de configuración y hace que NixOS sea especialmente adecuado para despliegues automatizados y reproducibles.
Para obtener más detalles y ejemplos sobre las configuraciones de NixOS, consulta Configuración del sistema NixOS.
Operaciones Imperativas
Aunque NixOS normalmente se configura de forma declarativa siempre que sea posible, hay algunos ámbitos en los que las operaciones imperativas siguen siendo necesarias, como la gestión del entorno de usuario y la gestión de canales.
Entornos de usuario
Además de la configuración declarativa del sistema, los usuarios de NixOS pueden utilizar el comando imperativo nix-env de Nix para instalar paquetes a nivel de usuario, sin modificar el estado del sistema. Consulta la sección de entornos de usuario del artículo sobre Nix para obtener más información.
Canales (Channels)
En el ecosistema Nix, los canales son un mecanismo para distribuir colecciones de paquetes de Nix y definiciones de módulos de NixOS. Un canal representa un conjunto seleccionado y versionado de definiciones de paquetes y configuraciones del sistema, que normalmente corresponde a una versión específica o al estado de desarrollo más reciente disponible.
Al utilizar canales, tu sistema o entorno de usuario obtiene definiciones de paquetes y opciones desde una URL que apunta a una instantánea (snapshot) específica de la colección de paquetes de Nix (Nixpkgs) y los módulos de NixOS asociados.
Para obtener más información sobre el uso y la configuración de los canales de Nix, consulta ramas de canales (channel branches).
Funcionamiento interno
Comparación con las distribuciones Linux tradicionales
Articulo principal: Nix vs. Linux Standard Base
La principal diferencia entre NixOS y otras distribuciones Linux es que NixOS no sigue la estructura del sistema de archivos de la Linux Standard Base. En los sistemas compatibles con LSB, el software se almacena en /{,usr}/{bin,lib,share} y la configuración generalmente se almacena en /etc. Los binarios del software están disponibles en el entorno de usuario si se ubican en uno de los directorios /bin definidos por la LSB. Cuando un programa hace referencia a bibliotecas dinámicas, buscará las bibliotecas necesarias en las carpetas de la LSB (/lib, /usr/lib).
En NixOS, sin embargo, /lib y /usr/lib no existen. En su lugar, todas las bibliotecas del sistema, binarios, kernels, firmware y archivos de configuración se colocan en el Nix store. Los archivos y directorios dentro de /nix/store reciben nombres basados en hashes de la información que describe los datos construidos. Todos los archivos y directorios almacenados en el Nix store son inmutables. /bin y /usr/bin están prácticamente ausentes: solo contienen /bin/sh y /usr/bin/env, respectivamente, para proporcionar compatibilidad mínima con scripts existentes que utilizan líneas shebang. Los entornos a nivel de usuario se implementan mediante una gran cantidad de enlaces simbólicos a todos los paquetes necesarios y archivos auxiliares. Estos entornos se denominan perfiles y se almacenan en /nix/var/nix/profiles, teniendo cada usuario sus propios perfiles. La estructuración del sistema de esta manera es lo que permite a NixOS obtener sus ventajas principales frente a las distribuciones Linux convencionales, como la atomicidad y la compatibilidad con retrocesos.
Uso de Nix store
Gran parte de la confusión entre los nuevos usuarios surge del hecho de que la configuración se almacena en el árbol de solo lectura /nix/store junto con todos los paquetes instalados. Esto hace imposible editar manualmente la configuración del sistema; todos los cambios de configuración deben realizarse modificando el archivo /etc/nixos/configuration.nix y ejecutando nixos-rebuild switch. NixOS proporciona el sistema de módulos para editar todas las configuraciones necesarias. Los usuarios deberían utilizar primero la herramienta de búsqueda de opciones para comprobar si existe la opción que necesitan antes de intentar añadir manualmente archivos o configuración mediante características de bajo nivel de NixOS, como los scripts de activación.
La pureza del sistema permite mantener la configuración del sistema en un lugar centralizado, sin necesidad de editar múltiples archivos. Esta configuración puede distribuirse o mantenerse bajo control de versiones según sea necesario. También proporciona determinismo; si se proporcionan las mismas entradas, la misma versión de Nixpkgs y el mismo archivo /etc/nixos/configuration.nix, se obtiene exactamente el mismo estado del sistema.
Modulos
El sistema de módulos de NixOS, definido en Nixpkgs, proporciona las herramientas necesarias para personalizar la configuración del sistema operativo. Se utiliza para habilitar y configurar servicios como nginx, habilitar firmware y personalizar el kernel.
Por lo general, toda la configuración de los módulos se realiza añadiendo opciones al archivo /etc/nixos/configuration.nix. La mayoría de los ejemplos de la wiki muestran cómo utilizar este archivo para configurar el sistema operativo.
El sistema de módulos de NixOS implementa un sistema de tipos que permite la verificación de tipos de las opciones configuradas. También permite combinar automáticamente opciones definidas en múltiples lugares. Esto permite distribuir la configuración en varios archivos, y las opciones establecidas en todos ellos se combinarán entre sí:
{
imports = [
./basic-webserver.nix
./blog.nix
];
}
{
services.nginx.enable = true;
services.nginx.virtualHosts."example.com" = {
root = "/var/www/example.com";
};
}
{
services.nginx.virtualHosts."blog.example.com" = {
root = "/var/www/blog.example.com";
};
}
Para obtener más detalles, consulta la sección Módulos del Manual de NixOS.
Generaciones
Cada vez que se reconstruye el estado del sistema mediante nixos-rebuild switch, se crea una nueva generación. Puedes volver a una generación anterior en cualquier momento, lo que resulta útil si un cambio en la configuración (o una actualización del sistema) causa problemas.
Puedes volver atrás (roll back) mediante:
$ nix-env --rollback # roll back a user environment
$ nixos-rebuild switch --rollback # roll back a system environment
NixOS también incluye entradas de generaciones anteriores en el menú del cargador de arranque, por lo que, como último recurso, siempre puedes volver a una configuración anterior simplemente reiniciando. Para establecer la generación actualmente arrancada como predeterminada, ejecuta:
$ /run/current-system/bin/switch-to-configuration boot
Como NixOS conserva generaciones anteriores del estado del sistema para permitir retrocesos, las versiones antiguas de los paquetes no se eliminan inmediatamente después de una actualización. Puedes eliminar generaciones antiguas manualmente:
$ # delete generations older than 30 days
$ nix-collect-garbage --delete-older-than 30d
$ # delete ALL previous generations - you can no longer rollback after running this
$ nix-collect-garbage -d
Listar generaciones:
$ # as root
$ nix-env --list-generations --profile /nix/var/nix/profiles/system
Cambiar entre generaciones:
$ # as root switch to generation 204
$ nix-env --profile /nix/var/nix/profiles/system --switch-generation 204
Eliminar generacion(es) dañada(s):
$ # as root delete broken generations 205 and 206
$ nix-env --profile /nix/var/nix/profiles/system --delete-generations 205 206
Puedes configurar la "recolección de basura" (garbage collection GC) automática definiendo las opciones de nix.gc en /etc/nixos/configuration.nix. Esto es recomendable, ya que ayuda a mantener reducido el tamaño del Nix store.
Véase también
- NixOS modules, a library for modular Nix expressions which powers the declarative configuration of NixOS.
- NixOS VM tests, a library for creating reproducible infrastructure tests, based on Nixpkgs, NixOS, QEMU and Perl.
- NixOS & Flakes Book (Ryan4yin, 2023) - 🛠️ ❤️ An unofficial NixOS & Flakes book for beginners.
