Installation Linux fiable et reproductible avec NixOS

Lors de l’utilisation d’un système d’exploitation, la mise à niveau des packages ou l’installation de nouveaux packages sont des tâches courantes qui présentent le risque d’affecter la stabilité du système. NixOS est une distribution Linux qui assure la fiabilité du système d’exploitation et permet une reproductibilité aisée des états actuels et antérieurs du système.

Cet article fait suite à notre Pas d’introduction et déployez NixOS sur votre machine. Il explique comment NixOS fonctionne, comment l’obtenir et l’installer, et comment Nix assure la fiabilité. Votre machine démarrera avec un système NixOS fonctionnel et vous apprendrez comment NixOS, le gestionnaire de packages Nix et Home Manager interagissent ensemble.

Qu’est-ce que NixOS ?

NixOS est une distribution Linux. Il est construit sur Nix, un gestionnaire de paquets fonctionnels, dont le langage est inspiré de la programmation fonctionnelle. NixOS prend la puissance du gestionnaire de packages Nix et l’applique à l’ensemble du système. Cela signifie, entre autres choses, qu’il est facile de restaurer toute la configuration du système à un état antérieur. Complémentaire au système géré par NixOS, Home Manager gère un environnement utilisateur.

Pourquoi NixOS ?

NixOS a appliqué les fondamentaux de Nix à l’ensemble du système. Cela conduit à :

  • Reproductibilité du système : étant donné une spécification d’un système (dans un fichier de configuration NixOS), il est possible de reproduire l’intégralité du système (état modulo mutable, comme le contenu des bases de données par exemple) sur une autre machine.
  • Mises à niveau et restaurations atomiques : les modifications apportées au niveau du système ou au niveau du package sont toujours réversibles.
  • Gestion des dépendances : NixOS utilise la gestion des packages Nix. Nix s’assure que la déclaration des dépendances est complète lors de l’installation d’un package. Étant donné que Nix stocke les packages de manière isolée entre eux, il est possible d’avoir différentes versions du même package installées. Ainsi, différents packages peuvent alors utiliser différentes versions de la même dépendance sans problème. Cette gestion des dépendances ne conduit pas à des applications de tailles énormes comme c’est le cas avec flatpack.

Installation de NixOS

La machine utilisée lors de l’installation est un ordinateur portable Dell Precision 5520 avec un SSD de 1 To et 32 ​​Go de RAM. Les instructions s’appliquent à toute machine, qu’il s’agisse d’un ordinateur de développement, d’un ordinateur portable ou d’une machine virtuelle.

Obtention de l’ISO NixOS

L’image ISO de NixOS peut être téléchargée à partir du Page de téléchargement de NixOS. Le fichier image ISO est disponible en deux options :

  • L’image ISO graphique (choix le plus simple) : avec cette option, l’installation est plus simple car elle dispose de l’interface graphique et de la mise en réseau, prêtes à l’emploi, nécessaires à l’installation.
  • L’image ISO minimale (non graphique) : c’est l’image ISO minimaliste en termes de contenu. L’avantage est la taille inférieure de l’image ISO. Mais l’inconvénient est qu’il y a plus à préparer avant l’installation. Voici comment préparer la mise en réseau dans l’installateur.

La mise en réseau doit être configurée avant l’installation pour télécharger les dépendances demandées.

Mon installation utilise l’image graphique ISO avec le Environnement de bureau Gnome. La taille est relativement petite, environ 2 Go.

Démarrez le programme d’installation

La .iso L’image disque est utilisée pour créer une clé USB amorçable. La Documentation officielle de NixOS couvre le processus. Suivre la documentationUbuntu pour une approche plus conviviale en utilisant balenaGraveur.

Une fois terminé, redémarrez votre machine ciblée et démarrez à partir du lecteur USB. L’écran présente une interface graphique à partir de laquelle NixOS peut être configuré et installé. Un premier écran propose plusieurs variantes de l’installateur, sélectionnez la première proposition. Quelques secondes plus tard, Gnome est opérationnel depuis le système USB. Ouvrez un nouveau terminal.

Partitionnement

Le programme d’installation de NixOS n’effectue aucun partitionnement ni formatage. C’est la responsabilité de l’utilisateur. Pour effectuer cette opération, il est nécessaire de connaître le nom du disque dur. La commande ci-dessous permet de connaitre le nom du disque dur :

Dans notre cas d’installation, le nom du disque dur était /dev/nvme0n1. Mais selon le type de disque (SATA, SSD, NVMe, …), il est possible d’avoir des valeurs alternatives telles que /dev/sda. Pour la suite de cet article, les commandes sont basées sur le nom du lecteur /dev/nvme0n1.

Une fois que le nom du disque est connu, la prochaine étape est le partitionnement. Dans notre cas, une seule partition est entièrement dédiée au système d’exploitation. L’hibernation après le redémarrage persiste état du système sur le disque dans l’espace d’échange. Ainsi, il nécessite la création d’un partition d’échange. Il n’est pas recommandé d’activer l’hibernation sur un système avec de grandes ressources RAM comme un serveur. Si vous choisissez d’activer l’hibernation, définissez la taille d’échange sur 1,5 fois la taille de la RAM.

Le schéma de partition UEFI est utilisé comme méthode de démarrage. La partition swap utilise 50 Gio. Le schéma de partition MBR est également présenté à des fins d’illustration.

Depuis le terminal, connectez-vous en tant que root avec sudo su -. fdisk et Parted sont des outils valides pour partitionner le lecteur.

Mise en page

Récapitulatif rapide, dans notre installation, NixOS cible le /dev/nvme0n1 disque. La /dev/nvme0n1p2 partition est la racine du système Linux. La /dev/nvme0n1p3 partition est le lecteur d’échange.

Dans cette étape, les objectifs sont de formater les partitions, d’activer la partition de swap et de monter le système de fichiers cible sur lequel NixOS va être installé. Voici les commandes pour les méthodes de démarrage UEFI et MBR (démarrage hérité) :

  • Boîtier UEFI

    
    mkfs.ext4 -L nixos /dev/nvme0n1p2
    mkswap -L swap /dev/nvme0n1p3
    mkfs.fat -F 32 -n boot /dev/nvme0n1p1
    
    mount /dev/disk/by-label/nixos /mnt
    swapon /dev/nvme0n1p3
    mkdir -p /mnt/boot
    mount /dev/disk/by-label/boot /mnt/boot
  • Boîtier MBR

    mkfs.ext4 -L nixos /dev/nvme0n1p1
    mkswap -L swap /dev/nvme0n1p2
    mount /dev/disk/by-label/nixos /mnt
    swapon /dev/nvme0n1p2
    nixos-generate-config --root /mnt

Configuration NixOS

L’installation se fait via le fichier de configuration NixOS dans /mnt/etc/nixos/configuration.nix. Les commandes pour générer le fichier de configuration et l’ouvrir pour l’édition :

nixos-generate-config --root /mnt
nano /mnt/etc/nixos/configuration.nix

Dans la philosophie NixOS, le fichier de configuration NixOS reflète l’ensemble du système. Il comprend les packages à installer, le service à exécuter, les paramètres à appliquer, la configuration réseau et potentiellement bien plus encore. Pour faciliter la compréhension de cette introduction, nous allons commencer par une configuration minimale, puis la compléter une fois le système redémarré. À l’avenir, nous vous encourageons à valider cette configuration. Ainsi, sur une nouvelle installation de machine, vous avez la possibilité de cloner votre configuration et de la réappliquer, ou un sous-ensemble de celle-ci, à un nouvel environnement ciblé.

Un fichier de configuration NixOS minimal ciblant l’environnement de bureau Gnome et la méthode de démarrage UEFI est présenté ci-dessous. Si vous souhaitez démarrer avec un système plus complet, vous pouvez enrichir la configuration avec vos propres propriétés ou utiliser le fichier de configuration plus exhaustif proposé à la fin de cet article.

 config, pkgs, ... :


  imports =
    [ 
      ./hardware-configuration.nix
    ];

  
  boot.loader.systemd-boot.enable = true;
  boot.loader.efi.canTouchEfiVariables = true;
  
  
  
  
  networking.useDHCP = false;
  networking.interfaces.wlp2s0.useDHCP = true;
  networking.networkmanager.enable = true;

  
  services.xserver.enable = true;

  
  services.xserver.displayManager.gdm.enable = true;
  services.xserver.desktopManager.gnome.enable = true;
  
  
  services.xserver.layout = "fr";

  
  sound.enable = true;
  hardware.pulseaudio.enable = true;

  
  services.xserver.libinput.enable = true;

  
  
  users.users.florent = 
    isNormalUser = true;
    initialPassword = "secret";  
    extraGroups = [ "wheel" ]; 
  ;

  
  
  environment.systemPackages = with pkgs; [
    vim
  ];

  
  services.openssh.enable = true;

  
  
  
  
  
  
  system.stateVersion = "21.05"; 

Installation

Il s’agit de la dernière étape avant de redémarrer le système. Une connexion Internet est nécessaire pour télécharger les dépendances. L’installation reflète le contenu de la configuration créée précédemment. La commande pour lancer l’installation est :

Un mot de passe root est demandé. Une fois terminé, le système est prêt au redémarrage.

Modification de la configuration NixOS

Lorsque le système sera en place, le système évoluera avec vos besoins. De nouveaux outils sont installés, des services sont démarrés et la configuration est mise à jour. Cela fait partie du cycle de vie du système, que le système cible une machine de développement ou un serveur de production.

Le fichier de configuration NixOS reflète la configuration au niveau du système, affectant tous les utilisateurs créés sur la machine. De plus, Home Manager fonctionne au niveau de l’utilisateur. Il installe le logiciel et la configuration pour un utilisateur spécifique.

Ajout du paquet curl au niveau système se fait avec la configuration ci-dessous :

 config, pkgs, ... :


  ...
  environment.systemPackages = with pkgs; [
    vim 
    curl
  ];
  ...

Toute modification du fichier de configuration NixOS entraîne une nouvelle configuration de démarrage. Les commandes ci-dessous construisent la configuration déclarée dans le fichier de configuration NixOS et en font la configuration par défaut pour le démarrage :

A toute application de la commande nixos-rebuild switch, une nouvelle configuration de démarrage est disponible au démarrage du système d’exploitation. Voici un exemple d’écran au redémarrage :




options de démarrage

Commande pour répertorier les configurations de démarrage sur NixOS :

sudo nix-env -p /nix/var/nix/profiles/system --list-generations

Notre Pas d’introduction répertorie les commandes les plus courantes.

Qu’est-ce que le gestionnaire de domicile ?

Home Manager est un outil permettant de gérer un environnement utilisateur à l’aide du gestionnaire de packages Nix. En tant que tel, il complète NixOS. Il existe deux manières d’utiliser Home Manager :

  • Utilisation de l’autonome home-manager outil

    Il permet de gérer le répertoire personnel d’un utilisateur indépendamment du système dans son ensemble. Il y a deux fichiers de configuration à gérer : un fichier pour la configuration au niveau du système (/etc/nixos/configuration.nix) et un fichier pour la configuration au niveau utilisateur (~/config/nixpkgs/home.nix). Le premier nécessite des privilèges root tandis que le second est exécuté par l’utilisateur sans sudoers autorisations.

  • En tant que module dans une configuration système NixOS

    Il permet de gérer la configuration au niveau du système et la configuration au niveau de l’utilisateur dans un seul fichier (/etc/nixos/configuration.nix). Des privilèges de niveau racine sont requis pour appliquer les mises à jour de Home Manager.

J’ai trouvé plus facile de conserver la configuration de mon système dans un seul fichier. Après tout, je suis le seul utilisateur de ma machine de développement. Nous couvrons ci-dessous l’installation de Home Manager en tant que module dans la configuration du système NixOS.

Home Manager en tant que module de NixOS

L’installation de Home Manager en tant que module NixOS nécessite des privilèges de niveau racine. Depuis le terminal, connectez-vous en tant que root avec sudo su -. Suivez ensuite les étapes ci-dessous pour configurer Home Manager :

  • Utilisez les commandes ci-dessous pour ajouter le canal Home Manager :

    nix-channel --add https://github.com/nix-community/home-manager/archive/master.tar.gz home-manager
    
    nix-channel --update
  • Ajouter dans le imports section du fichier de configuration NixOS. Une nouvelle option NixOS appelée home-manager.users est désormais disponible.

Étant donné l’exemple du fichier de configuration NixOS dans la section Génération et configuration du fichier de configuration NixOSen ajoutant le module Home Manager pour installer le python3 package et pour configurer le dotfile .git pour un utilisateur nommé florent donne :

 config, pkgs, ... :


  imports =
    [
      ./hardware-configuration.nix
            <home-manager/nixos>    ];

  boot.loader.systemd-boot.enable = true;
  boot.loader.efi.canTouchEfiVariables = true;
  networking.useDHCP = false;
  networking.interfaces.wlp2s0.useDHCP = true;
  networking.networkmanager.enable = true;
  services.xserver.enable = true;
  services.xserver.displayManager.gdm.enable = true;
  services.xserver.desktopManager.gnome.enable = true;
  services.xserver.layout = "fr";
  sound.enable = true;
  hardware.pulseaudio.enable = true;
  services.xserver.libinput.enable = true;
  users.users.florent = 
    isNormalUser = true;
    initialPassword = "titi"  
    extraGroups = [ "wheel" ]; 
  ;
    home-manager.users.florent =  pkgs, ...:         home.packages = [       pkgs.python3    ];        programs.git =       enable = true;      userName = "Florent";      userEmail = "[email protected]";    ;  ;
  environment.systemPackages = with pkgs; [
    vim 
    curl
  ];
  services.openssh.enable = true;
  system.stateVersion = "21.05"; 

Comme précédemment, utilisez nixos-rebuild switch pour appliquer les changements.

Conclusion

NixOS applique les principes fondamentaux de Nix à l’ensemble du système pour une expérience Nix holistique. Nix simplifie le processus de sauvegarde, de partage ou de réplication de la configuration des machines. Appliqué à l’ensemble du système, il crée une distribution Linux flexible, fiable et reproductible. On peut facilement imaginer l’attrait de ces avantages appliqués aux environnements CI/CD et aux clusters distribués.

Leave a Reply