# NixOS

NixOS è una distribuzione GNU/Linux libera e open source basata sul gestore di pacchetti Nix. NixOS adotta un approccio immutabile e un modello di aggiornamento atomico. Si configura in maniera dichiarativa, consentendo così riproducibilità e portabilità.
La configurazione di NixOS è divisa in moduli componibili, ed è scritta in un linguaggio funzionale ad-hoc, chiamato anch'esso Nix. I pacchetti a disposizione sono definiti nel progetto Nixpkgs.

## Storia

Nel 2003, Eelco Dolstra ha iniziato a sviluppare Nix come progetto di ricerca. Lo scopo del progetto era quello di realizzare un sistema per un corretto deploy del software. Ha influito sul progetto anche Eelco Visser, che aveva supervisionato il suo dottorato di ricerca all'Università di Utrecht. Nel 2006, Armijn Hemel presentò NixOS come risultato della sua tesi magistrale al medesimo ateneo.
Nel 2015, è stata istituita la NixOS Foundation, con sede nei Paesi Bassi. Il suo obiettivo è quello di supportare progetti come NixOS che implementano il modello di deploy funzionale puro.

### Versioni

| Versione | Data di rilascio |
| NixOS 13.10 "Aardvark" | ottobre 2013 |
| NixOS 14.04 "Baboon" | aprile 2014 |
| NixOS 14.12 "Caterpillar" | dicembre 2014 |
| NixOS 15.09 "Dingo" | settembre 2015 |
| NixOS 16.03 "Emu" | marzo 2016 |
| NixOS 16.09 "Flounder" | settembre 2016 |
| NixOS 17.03 "Gorilla" | marzo 2017 |
| NixOS 17.09 "Hummingbird" | settembre 2017 |
| NixOS 18.03 "Impala" | marzo 2018 |
| NixOS 18.09 "Jellyfish" | settembre 2018 |
| NixOS 19.03 "Koi" | marzo 2019 |
| NixOS 19.09 "Loris" | settembre 2019 |
| NixOS 20.03 "Markhor" | marzo 2020 |
| NixOS 20.09 "Nightingale" | settembre 2020 |
| NixOS 21.05 "Okapi" | maggio 2021 |
| NixOS 21.11 "Porcupine" | novembre 2021 |
| NixOS 22.05 "Quokka" | maggio 2022 |
| NixOS 22.11 "Raccoon" | novembre 2022 |
| NixOS 23.05 "Stoat" | maggio 2023 |
| NixOS 23.11 "Tapir" | novembre 2023 |
| NixOS 24.05 "Uakari" | maggio 2024 |
| NixOS 24.11 "Vicuna" | novembre 2024 |
NixOS pubblica due versioni stabili l'anno, solitamente verso la fine di maggio e la fine di novembre.

## Funzionalità
### Configurazione dichiarativa

All'interno di NixOS, l'intero sistema operativo viene generato dal gestore dei pacchetti Nix a partire da un file di configurazione, scritto nel linguaggio Nix.
Questo vale anche per il kernel, le applicazioni, i pacchetti di sistema e i file di configurazione.
La creazione di una nuova versione non sovrascriverà le versioni precedenti. Infatti è sempre possibile scegliere di avviare una vecchia configurazione.
Una macchina con NixOS viene configurata scrivendo una specifica delle funzionalità che l'utente desidera in un file di configurazione globale (solitamente in /etc/nixos). Nell'esempio si può vedere una specifica minima di un sistema che esegue un demone SSH:
Dopo aver modificato il file sopracitato, il sistema può essere ricreato utilizzando il comando nixos-rebuild. In questo modo viene eseguito tutto il necessario per creare la nuova versione del sistema, incluso il download e l'installazione dei pacchetti e la generazione dei file di configurazione.

### Aggiornamenti affidabili e atomici

Poiché le configurazioni di Nix sono pure e dichiarative, la loro valutazione produrrà sempre lo stesso risultato, indipendentemente dai pacchetti o dai file di configurazione presenti nel sistema.
NixOS utilizza le transazioni durante l'applicazione della configurazione, rendendo atomiche le modifiche alla configurazione, come gli aggiornamenti. Ad esempio, se l'applicazione di una nuova configurazione viene interrotto da una mancanza di corrente, il sistema sarà comunque in uno stato completamente e correttamente funzionante: si avvierà nella vecchia o nella nuova configurazione.

### Ripristino di vecchie configurazioni

Se dopo un aggiornamento del sistema la nuova configurazione non funziona o non è quella desiderata, è possibile ripristinarla utilizzando un comando speciale ( nixos-rebuild switch --rollback ). Ogni versione della configurazione del sistema viene automaticamente visualizzata nel menu di avvio del sistema. Se la nuova configurazione si blocca o non si avvia correttamente, è possibile selezionare una versione precedente. I rollback sono operazioni veloci che non comportano la ricreazione del sistema.

### Configurazioni riproducibili

Il modello dichiarativo di configurazione di NixOS semplifica la riproduzione di una configurazione di sistema su un'altra macchina. Copiando il file di configurazione sul computer di destinazione ed eseguendo il comando di aggiornamento del sistema viene generata la stessa identica configurazione di sistema (kernel, applicazioni, servizi di sistema, ...), ad eccezione delle parti del sistema non gestite dal gestore pacchetti, come i dati dell'utente.

### Compilazione dal codice sorgente con cache binaria

Col linguaggio Nix si specifica come compilare i pacchetti a partire dal codice sorgente. Questo permette all'utente di poter modificare facilmente i programmi, come in altre distribuzioni basate sul codice sorgente dei programmi (ad esempio Gentoo). Tuttavia, poiché la compilazione dal codice sorgente è un processo lento, il gestore dei pacchetti scarica automaticamente i binari precompilati da un server cache quando sono disponibili. È possibile disabilitare la cache binaria e forzare la compilazione dal sorgente utilizzando l'argomento --option substitute false. Questa modalità fornisce la flessibilità di un modello di gestione dei pacchetti basato sul codice sorgente, con l'efficienza di uno basato sugli eseguibili binari.

### Coerenza

Il gestore dei pacchetti Nix garantisce che il sistema in esecuzione sia coerente con le specifiche fornite, il che significa che ricreerà tutti i pacchetti che non sono più validi. Ad esempio, se il kernel viene modificato, il gestore dei pacchetti garantirà che i moduli del kernel esterni vengano ricostruiti. Allo stesso modo, quando una libreria viene aggiornata, si garantisce che tutti i pacchetti di sistema utilizzino la nuova versione, anche i pacchetti ad essa collegati staticamente.

### Gestione pacchetti multiutente

Non sono necessari privilegi speciali per installare software in NixOS. Oltre al profilo di sistema, ogni utente ha un profilo dedicato in cui può installare pacchetti. Nix consente inoltre la coesistenza di più versioni dello stesso pacchetto, in modo che utenti diversi possano avere versioni diverse dello stesso pacchetto installate nei rispettivi profili. Se due utenti installano la stessa versione di un pacchetto, verrà creata o scaricata solo una copia.

## Implementazione

NixOS si basa sul gestore di pacchetti Nix, che salva tutti i pacchetti isolati l'uno dall'altro nell'archivio dei pacchetti (detto store).
I pacchetti installati sono identificati da un hash crittografico di tutti gli input utilizzati per la loro compilazione. La modifica delle istruzioni di compilazione di un pacchetto ne modifica l'hash e ciò comporterà l'installazione di un pacchetto diverso nell'archivio pacchetti. Questa soluzione viene utilizzata anche per gestire i file di configurazione, assicurando così che le configurazioni più recenti non sovrascrivano quelle più vecchie.
NixOS non segue lo standard FHS per le cartelle principali nel file system. Le uniche eccezioni sono il collegamento simbolico /bin/sh creato alla versione di bash nello store Nix (ad esempio /nix/store/s/5rnfzla9kcx4mj5zdc7nlnv8na1najvg-bash-4.3.43/ ) e alcuni collegamenti simbolici in /etc ai file generati nello store, come /nix/store/s2sjbl85xnrc18rl4fhn56irkxqxyk4p-sshd_config. Proprio grazie al fatto che non si utilizzino directory globali come /bin è possibile la coesistenza di più versioni di un pacchetto.