# NixOS

NixOS est une distribution Linux basée sur le gestionnaire de paquet Nix. Elle utilise une configuration déclarative et permet des mises à jour fiables du système. Deux branches principales sont proposées : une version stable et une version instable comprenant les derniers ajouts.
Bien que NixOS ait commencé comme un projet de recherche, il est reconnu comme un système d'exploitation suffisamment fonctionnel et utilisable.
NixOS dispose d'outils dédiés aux Devops et aux tâches de déploiement$^,$.

## Histoire

NixOS a commencé comme un projet de recherche par Eelco Dolstra en 2003.
La fondation NixOS a été fondée en 2015 et vise à soutenir des projets comme NixOS qui mettent en œuvre le modèle de déploiement purement fonctionnel.

### Versions

NixOS suit une cadence de publication de deux versions par an. Ces versions sont habituellement publiées vers mars et septembre, mais à partir de la version 21.05, NixOS vise désormais mai et novembre. Chaque numéro de versions a le format « YY.MM ». Par exemple, la version 20.03 de NixOS correspond à la version publiée en mars 2020. De plus, chaque version est identifiée par un nom de code comme « Markhor » pour la version 20.03.
Listes des versions de NixOS :
| Date de publication | Version | Nom | Version du kernel |
| 2013-10-31 | 13.10 | Aardvark | ??? |
| 2014-04-30 | 14.04 | Baboon | 3.12 |
| 2014-12-30 | 14.12 | Caterpillar | 3.14 |
| 2015-09-30 | 15.09 | Dingo | 3.18 |
| 2016-03-31 | 16.03 | Emu | 4.4 |
| 2016-09-30 | 16.09 | Flounder | 4.4 |
| 2017-03-31 | 17.03 | Gorilla | 4.9 |
| 2017-09-29 | 17.09 | Hummingbird | 4.9 |
| 2018-04-04 | 18.03 | Impala | 4.14 |
| 2018-10-05 | 18.09 | Jellyfish | 4.14 |
| 2019-04-11 | 19.03 | Koi | 4.19 |
| 2019-10-09 | 19.09 | Loris | 4.19 |
| 2020-04-20 | 20.03 | Markhor | 5.4 |
| 2020-10-27 | 20.09 | Nightingale | 5.4 |
| 2021-05-31 | 21.05 | Okapi | 5.10 |
| 2021-11-30 | 21.11 | Porcupine | 5.10 |
| 2022-05-30 | 22.05 | Quokka | 5.15 |
| 2022-11-30 | 22.11 | Raccoon | 5.15 |
| 2023-05-31 | 23.05 | Stoat | 6.1 |
| 2023-11-29 | 23.11 | Tapir | 6.1 |
| 2024-05-31 | 24.05 | Uakari | 6.6 |
| 2024-11-30 | 24.11 | Vicuña | 6.6 |

## Fonctionnalité
### Modèle de configuration déclarative du système

Dans NixOS, l'ensemble du système d'exploitation — le noyau, les applications, les composants système, les fichiers de configuration, etc. — est construit par le gestionnaire de paquets Nix à partir d'une description dans un langage de construction fonctionnel. La création d'une nouvelle configuration ne peut pas remplacer les configurations précédentes.
Un système NixOS est configuré en écrivant une spécification des fonctionnalités, que l'utilisateur souhaite sur sa machine, dans un fichier de configuration globale. Par exemple, voici une configuration minimale d'une machine exécutant un daemon SSH :
Après avoir modifié le fichier de configuration, le système peut être mis à jour à l'aide de la commande nixos-rebuild switch. Cette commande fait tout ce qui est nécessaire pour appliquer la nouvelle configuration, y compris le téléchargement et la compilation des paquets et la génération des fichiers de configuration.

### Mises à jour fiables

Étant donné que les fichiers Nix sont purs et déclaratifs, leur évaluation produira toujours le même résultat, quels que soient les paquets ou fichiers de configuration présents sur le système. Ainsi, la mise à jour d'un système est aussi fiable que sa réinstallation.

### Mises à jour atomiques

NixOS a une approche transactionnelle de la gestion des configurations, permettant de faire des mises à jours atomiques. Par exemple, en cas d'échec de mise à jour due à une coupure de l'alimentation ou du réseau, le système sera toujours dans un état cohérent : il démarrera dans l'ancienne ou la nouvelle configuration. Dans d'autres systèmes, une machine peut se retrouver dans un état incohérent et peut même ne plus démarrer.

### Rollbacks

Si après une mise à jour du système, la nouvelle configuration n'est pas souhaitée, elle peut être annulée à l'aide d'une commande spéciale (nixos-rebuild switch --rollback). Toutes les configurations du système s'affichent automatiquement dans le menu de démarrage. Si la nouvelle configuration plante ou ne démarre pas correctement, une ancienne version peut être sélectionnée. Les restaurations sont des opérations légères qui n'impliquent pas la restauration de fichiers à partir de copies.

### Configurations système reproductibles

Le modèle de configuration déclarative de NixOS facilite la reproduction d'une configuration système sur une autre machine. La copie du fichier de configuration sur la machine cible et l'exécution de la commande de mise à jour du système génèrent la même configuration système (noyau, applications, services système, etc.), sauf pour les parties du système non gérées par le gestionnaire de packages telles que les données utilisateur.

### Modèle basé sur la source, avec des binaires

Le langage Nix utilisé par NixOS spécifie comment construire des paquets à partir des sources. Cela facilite l'adaptation du système aux besoins des utilisateurs. Cependant, la construction à partir de la source étant un processus lent, le gestionnaire de paquets télécharge automatiquement les fichiers binaires pré-compilés à partir d'un serveur de cache lorsqu'ils sont disponibles. Cela donne la flexibilité d'un modèle de gestion de paquets basé sur la source avec l'efficacité d'un modèle binaire.

### Cohérence

Le gestionnaire de packages Nix garantit que le système en cours d'exécution est cohérent avec les spécifications logiques du système, ce qui signifie qu'il va reconstruire tous les paquets qui ont besoin d'être reconstruits. Par exemple, si le noyau est modifié, le gestionnaire de paquets s'assurera que les modules externes du noyau seront reconstruits. De même, lorsqu'une bibliothèque est mise à jour, elle garantit que tous les paquets système utilisent la nouvelle version, même les paquets qui y sont liés statiquement.

### Gestion de paquets multi-utilisateurs

Il n'est pas nécessaire de disposer de privilèges spéciaux pour installer des logiciels dans NixOS. En plus du profil à l'échelle du système, chaque utilisateur dispose d'un profil dédié dans lequel il peut installer des paquets. Nix permet également à plusieurs versions d'un paquet de coexister, de sorte que différents utilisateurs peuvent avoir différentes versions du même paquet installées dans leurs profils respectifs. Si deux utilisateurs installent la même version d'un paquet, une seule copie sera créée ou téléchargée, et le modèle de sécurité de Nix garantit que cela est sécurisé.

## Mise en œuvre

NixOS est basé sur le gestionnaire de packages Nix qui stocke tous les paquets de manière isolée, dans le magasin de paquets.
Les paquets installés sont identifiés par un hachage cryptographique de toutes les entrées utilisées pour leur construction. La modification des instructions de construction d'un package modifie son hachage et cela entraînera l'installation d'un paquet différent dans le magasin de paquets. Ce système est également utilisé pour gérer les fichiers de configuration en veillant à ce que les configurations plus récentes n'écrasent pas les anciennes.
Cela implique que NixOS ne respecte pas la norme de hiérarchie du système de fichiers. Les seules exceptions sont un lien symbolique /bin/sh vers une version de bash dans le magasin Nix (par exemple : /nix/store/5rnfzla9kcx4mj5zdc7nlnv8na1najvg-bash-4.3.43/bin/bash) ; et bien que NixOS ait un répertoire /etc pour conserver les fichiers de configuration à l'échelle du système, la plupart des fichiers de ce répertoire sont des liens symboliques vers des fichiers stockées dans /nix/store tels que /nix/store/s2sjbl85xnrc18rl4fhn56irkxqxyk4p-sshd_config. Ne pas utiliser de répertoires globaux tels que /bin fait partie de ce qui permet à plusieurs versions d'un paquet de coexister.