NixOS

NixOS
sistema operativo
Logo
Logo
SviluppatoreNixOS contributors

NixOS Foundation[1][2]

FamigliaUnix-like
Release iniziale0.1 (3 giugno 2003)
Release corrente24.05 (31 maggio 2024) e 24.11-pre (22 maggio 2024)
Tipo di kernelLinux (monolitico modulare)
Piattaforme supportatei686, AMD64, AArch64
Gestore dei pacchettiNix
Interfacce graficheVarie
Tipo licenzaSoftware libero
LicenzaMIT[3] e GNU GPL[4]
Stadio di sviluppoStabile
Sito webnixos.org/

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.[5] Si configura in maniera dichiarativa, consentendo così riproducibilità e portabilità.[6]

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.

Nel 2003, Eelco Dolstra ha iniziato a sviluppare Nix come progetto di ricerca.[7] Lo scopo del progetto era quello di realizzare un sistema per un corretto deploy del software.[8] Ha influito sul progetto anche Eelco Visser, che aveva supervisionato il suo dottorato di ricerca all'Università di Utrecht.[9] Nel 2006, Armijn Hemel presentò NixOS come risultato della sua tesi magistrale al medesimo ateneo.[10]

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.[11]

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.[12][13][14]

Funzionalità

[modifica | modifica wikitesto]
Installazione grafica guidata di NixOS

Configurazione dichiarativa

[modifica | modifica wikitesto]

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.[15] 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:[16]

{
  boot.loader.grub.device = "/dev/sda";
  fileSystems."/".device = "/dev/sda1";
  services.sshd.enable = true;
}

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

[modifica | modifica wikitesto]

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.[17]

Ripristino di vecchie configurazioni

[modifica | modifica wikitesto]

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.[18]

Configurazioni riproducibili

[modifica | modifica wikitesto]

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

[modifica | modifica wikitesto]

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.[19]

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

[modifica | modifica wikitesto]

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

[modifica | modifica wikitesto]

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.

  1. ^ Community - nixos.org, su nixos.org. URL consultato il 23 settembre 2022 (archiviato dall'url originale il 23 settembre 2022).
  2. ^ NixOS/nixos-foundation - Github, su GitHub. URL consultato il 23 settembre 2022 (archiviato dall'url originale il 23 settembre 2022).
  3. ^ nixpkgs/COPYING at master · NixOS/nixpkgs · GitHub, su github.com. URL consultato il 19 settembre 2015.
  4. ^ I software distribuiti possono avere altre licenze. Alcuni sono proprietari, ma il loro uso va abilitato.
  5. ^ howtogeek.com, https://www.howtogeek.com/what-is-an-immutable-linux-distro/. URL consultato il 7 dicembre 2023.
  6. ^ distrowatch.com, http://distrowatch.com/table.php?distribution=nixos. URL consultato il 19 settembre 2015.
  7. ^ Eelco Dolstra, Software Configuration Management, Lecture Notes in Computer Science, vol. 2649, 2003, pp. 102–117, DOI:10.1007/3-540-39195-9_8, ISBN 978-3-540-14036-8.
  8. ^ Jonatha Lorimer, jonathanlorimer.dev, https://jonathanlorimer.dev/posts/nix-thesis.html.
  9. ^ Sander van der Burg's blog, https://sandervanderburg.blogspot.com/2022/04/in-memoriam-eelco-visser-1966-2022.html. URL consultato il 3 aprile 2024.
  10. ^ usenix.org, https://www.usenix.org/legacy/event/hotos07/tech/full_papers/dolstra/dolstra_html/. URL consultato il 4 marzo 2024.
  11. ^ nixos.org, http://nixos.org/nixos/foundation.html. URL consultato il 19 settembre 2015.
  12. ^ nixos.org, https://nixos.org/governance.html. URL consultato il 28 agosto 2020.
  13. ^ GitHub, https://github.com/NixOS/rfcs/blob/master/rfcs/0080-nixos-release-schedule.md.
  14. ^ nixos.org, https://nixos.org/blog/announcements. URL consultato il 9 dicembre 2023.
  15. ^ https://edolstra.github.io/pubs/hotos-final.pdf.
  16. ^ nixos.org, http://nixos.org/nixos/about.html. URL consultato il 19 settembre 2015.
  17. ^ DOI:10.1145/1490283.1490294, ISBN 978-1-60558-304-4, https://edolstra.github.io/pubs/atomic-hotswup2008-final.pdf.
  18. ^ https://nixos.org/manual/nixos/stable/#sec-rollback.
  19. ^ DOI:10.1145/1101908.1101933, ISBN 978-1-58113-993-8, https://edolstra.github.io/pubs/secsharing-ase2005-final.pdf.

Altri progetti

[modifica | modifica wikitesto]

Collegamenti esterni

[modifica | modifica wikitesto]