# NixOS

NixOS es una distribución de Linux construida sobre el administrador de paquetes Nix. Utiliza configuración declarativa y permite actualizar de manera confiable el sistema. Ofrece varios "canales" de paquetes oficiales, incluida la versión estable actual y la versión inestable que aún continúa en pruebas. NixOS tiene herramientas dedicadas a DevOps y tareas de implementación.

## Historia

Eelco Dolstra inició NixOS como un proyecto de investigación en el año 2003. Posteriormente, en 2015, se fundó Stichting NixOS con el objetivo de respaldar proyectos como NixOS que implementan el modelo de despliegue puramente funcional.

### Versiones

NixOS publica actualizaciones dos veces al año. Anteriormente ocurría en los meses de marzo y septiembre, pero actualmente, a partir del 21.05, NixOS apunta a mayo y noviembre. Cada una de estas versiones tiene el formato "YY. MM", por ejemplo, "20.03" fue la versión lanzada en marzo de 2020. Cada versión de NixOS tiene un nombre, por ejemplo "Markhor" para la versión 20.03.

## Características
### Modelo de configuración declarativa

En NixOS, todo el sistema operativo (el kernel, las aplicaciones, los paquetes, los archivos de configuración, etc.) es creado por el administrador de paquetes de Nix a partir de una descripción en lenguaje funcional. Como consecuencia de esto, la creación de una nueva configuración no puede sobrescribir las configuraciones anteriores.
Un sistema con NixOS se configura escribiendo en un archivo de configuración global la especificación de la funcionalidad que el usuario desea en su máquina. A continuación se puede ver un ejemplo de una configuración mínima de una máquina que ejecuta un demonio SSH:
Una vez el archivo de configuración haya sido cambiado, el sistema se puede actualizar usando el comando nixos-rebuild switch . Este comando hace todo lo necesario para aplicar la nueva configuración, incluida la descarga y compilación de paquetes, así como también la generación de archivos de configuración.

### Actualizaciones confiables

Dado que los archivos Nix son puros y declarativos, evaluarlos siempre producirá el mismo resultado, independientemente de los paquetes o archivos de configuración que haya en el sistema. Por lo tanto, actualizar un sistema es tan confiable como reinstalarlo desde cero.

### Actualizaciones atómicas

NixOS tiene un enfoque transaccional para la gestión de la configuración al realizar cambios de configuración, como actualizaciones atómicas. Esto significa que si se interrumpe la actualización a una nueva configuración, el sistema aún permanecerá en un estado de consistencia: se iniciará con la configuración anterior o nueva. En otros sistemas, una máquina puede terminar en un estado de inconsistencia y es probable que ya no arranque.

### Reversiones

Si luego de una actualización del sistema, la nueva configuración no es la esperada, es posible revertir el cambio usando un comando especial ( nixos-rebuild switch --rollback ). Cada versión de configuración del sistema aparece de forma automática en el menú de inicio del sistema. Si la nueva configuración falla o presenta algún tipo de problema al iniciar, se puede seleccionar una versión anterior. Las reversiones son operaciones ligeras que no implican la restauración de archivos a partir de copias.

### Configuraciones de sistema reproducibles

El modelo de configuración declarativa que presenta NixOS facilita la replicación de una configuración particular en otras máquinas. Copiando el archivo de configuración en la máquina de destino y ejecutando el comando de actualización del sistema, genera la misma configuración del sistema (núcleo, aplicaciones, servicios del sistema, etc.), exceptuando por las partes del sistema que no son administradas por el administrador de paquetes, los datos del usuario son un ejemplo de esto.

### Modelo basado en fuente con caché binario

El lenguaje de compilación Nix que utiliza NixOS especifica cómo compilar paquetes desde el origen. Esto hace más fácil que el sistema se adapte a las necesidades del usuario. Sin embargo, debido a que la compilación desde la fuente es un proceso lento, el administrador de paquetes descarga de manera automática los binarios preconstruidos de un servidor de caché cuando estén disponibles. Esto brinda la flexibilidad de un modelo de administración de paquetes basado en fuente con la eficiencia de un modelo binario.

### Consistencia

El administrador de paquetes de Nix se asegurará que el sistema en ejecución sea consistente con la especificación lógica del sistema, esto significa que reconstruirá todos los paquetes que deban ser reconstruidos. Por ejemplo, si se cambia el kernel, el administrador de paquetes se asegurará de que se reconstruyan todos los módulos externos del kernel. De forma similar, cuando una biblioteca es actualizada, se asegura de que los paquetes del sistema utilicen esta nueva versión, incluso los paquetes vinculados de forma estática a la misma.

### Gestión de paquetes multiusuario

No se necesitan privilegios especiales para instalar software en NixOS. Además del perfil de todo el sistema, cada usuario tiene un perfil dedicado en el que puede instalar sus propios paquetes. Nix permite también la coexistencia de múltiples versiones de un mismo paquete, por lo tanto, distintos usuarios pueden tener distintas versiones de un mismo paquete instaladas en sus respectivos perfiles. Si dos usuarios instalan la misma versión de un paquete, solo será creada o descargada una sola copia. El modelo de seguridad de Nix garantiza que esto sea seguro porque solo los usuarios en los cuales la configuración del sistema confía de forma explícita pueden usar parámetros de compilación que les permitirían controlar el contenido de la salida de una derivación (como agregar impurezas a la caja de arena o usar un sustituto no confiable). Sin estos parámetros, las rutas solo pueden sustituirse por un sustituto confiable para el sistema o una compilación de espacio aislado local en la que se confíe implícitamente.

## Implementación

NixOS se basa en el administrador de paquetes Nix, quien guarda en el almacén de paquetes todos los paquetes aislados entre sí.
Los paquetes instalados se identifican mediante un código hash único proveniente de todas las entradas utilizadas para su compilación. Al cambiar las instrucciones de compilación de un paquete, modifica su hash dando como resultado un paquete diferente el cual será instalado en el almacén de paquetes. Este sistema es también usado para administrar los archivos de configuración, garantizando que las configuraciones más nuevas no sobrescriban las más antiguas.
Esto implica que NixOS no siga el estándar de jerarquía del sistema de archivos. Las únicas excepciones son enlaces simbólicos /bin/sh a la versión de bash en la tienda Nix (como se muestra a continuación: /nix/store/s/5rnfzla9kcx4mj5zdc7nlnv8na1najvg-bash-4.3.43/ ); A pesar de que NixOS tiene un directorio /etc para guardar los archivos de configuración de todo el sistema, la mayor parte de los archivos que están en este directorio son enlaces simbólicos a archivos generados en /nix/store como /nix/store/s2sjbl85xnrc18rl4fhn56irkxqxyk4p-sshd_config . El no usar directorios globales como /bin es una parte de lo que permite que coexistan múltiples versiones de un mismo paquete.

## Recepción

Jesse Smith, al revisar NixOS 15.09 para DistroWatch Weekly escribió:
DistroWatch Weekly tiene también una revisión de NixOS 17.03 escrita por Ivan Sanders.
Una revisión de NixOS 21.11 "Porcupine", la cual fue realizada en 2022 en la revista Full Circle concluyó: