Retour

Nixos : présentation

Présentation

Nixos est une distribution linux communautaire et basée sur le gestionnaire de paquet Nix.

Le développement de Nixos est piloté par une association (fondation).

Vue rapide de Nix

Le gestionnaire de paquet Nix se démarque des autres gestionnaires de paquets par les éléments suivants :

  • déclaratif : L’installation et la configuration se fait de manière déclarative.
  • reproductibilité : le résultat d’une déclaration, sera toujours identique, peut-importe ce qui est installé sur la machine ou sur quel machine on “l’exécute”.
  • fiabilité : aucun package ou configuration ne peut être incohérent. L’outil fonctionne en créant des versions ou générations. Il est ainsi toujours possible de revenir à une ancienne génération, sans limite.
  • portable : Nix est indépendant de Nixos et peut-être utilisé sur toute distribution linux ou sur MacOS.

Comment ça marche ?

Nix utilise un catalogue, le nix store qui est à la racine /nix/store. Il contient tout les bianaires installés, dans toute les versions. Chaque gestion de génération utilise des hard link pour pointer sur la version voulue. C’est par ce système que nous pouvons avoir des retours arrières.

Nixos

L’installation de Nixos peut se faire de plein de façon. L’iso rend l’installation aussi simple qu’une Fedora. Le script nixos-infect rend le remplacement d’un OS par Nixos trivial. Il est aussi possible de fabriquer une image Ppour LXC ou por Proxmox qui sera utilisée par Terraform pour déployer de nouveaux environnements.

La configuration du système est uniquement dans /etc/nixos et est découpée dans 2 fichiers : configuration.nix et hardware-configuration.nix

Le fichier hardware-configuration.nix ne sera jamais modifié par l’utilisateur. Il inclus la configuration matériel du poste.

Le fichier configuration.nix est la base de la configuration du système. Il sera modifié et pourra inclure des fichiers qu’on va créer.

L’écosystème Nixos est riche. Il existe un outil, nommé home-manager qui reprend le principe de nix mais au niveau de l’utilisateur, donc pas besoin d’avoir les droits root pour avoir firefox.

En d’autres termes, chaque utilisateur va pouvoir customiser son environnement (utilitaires, configuration etc…)

Concrètement, cela signifie que l’on peux créer des fichiers .nix pour chaque applications et l’importer soit au niveau du système soit au niveau du compte et partager ces configurations qui marchent entre plusieurs personnes ou machines et gérer les fichiers dans un dépot git.

Enfin, une commande magique, nix-shell permet d’installer temporairement un utilitaire.

Par exemple nix-shell -p git va créer un environnement virtuel de l’environnement actif, en y ajoutant git. Cela va nous permettre de faire un git clone et donc récupérer des modules qu’on aurait développé.

Pour mes besoins, j’ai un dépot git de fichiers .nix. Dans ce dépot, j’ai un dossier host et un dossier modules. Dans le dossier hosts il y a un sous dossier par machine sous nixos et ce sous dossier contient le contenu de /etc/nixos

nix-shell:~/git/nixos-config]$ tree      
  ── hosts                                 
     ├── backup                            
     │   ├── configuration.nix             
     │   └── hardware-configuration.nix    
     ├── dell-5590                         
     │   ├── nixos                         
     │   │   ├── configuration.nix         
     │   │   ├── hardware-configuration.nix
     │   │   ├── packages.nix              
     │   │   └── services.nix              
     │   └── nixpkgs                       
     │       ├── bat                       
     │       │   └── default.nix           
     │       ├── bat.nix                   
     │       ├── colorschemes              
     │       │   └── nord.theme            

Le dossier modules contien des fichiers autonome qui pourront être appelé par 1 ou plusieurs configuration.nix, comme par exemple la configuration de prometheus, ou un fishier users.nix dans lequel je mets les comptes utilisateurs que je souhaite sur mes machines (donc le miens avec les alias fish, la clé public ou encore la configuration de git. J’ai également un fichier common.nix qui contient la liste des utilitaires que je souhaite avoir sur chaque PC, comme lsb, tmux etc…

La doc, c’est le code

Au delà des fichiers nix sur lesquels nous travaillons, le github du projet permet de connaitre les détails et les possibilités de customisation de configuration déclarative. En plus de ces fichiers, il y a le site : https://search.nixos.org/packages et l’onglet Options

La page du manuel est également très bien faite et complète : https://nixos.org/manual/nixos/stable/

Les difficultés rencontrés

J’ai jamais lu la doc officielle nixos ou nix. Donc forcément j’ai des lacunes. Je m’inspire beaucoup de dépots git des autres. C’est pas forcément le meileur truc, mais c’est celui qui ME correspond.

Faire les choses bien c’est long. Par exemple, la conf tmux ou vim peut-être 100% déclarative. Ou la conf de i3status. Il faut donc plus de temps pour la coder que la récupération d’un simple fichier .vimrc qu’on va modifier au fur et à mesure de l’usage.

Et demain ?

Comme dit plus haut, l’univers nixos est riche. Cela va des outils de déploiement, au générateur d’images AWS ou Proxmox, Flake qui permet de faire du déploiement est la techno qui avance. Est ce que Nixos va remplacer tous les linux ? C’est fort peu probable. C’est un bon complément à Debian ;-)

Quelques exemples

Installation d’un gitea

{ config, pkgs, lib, ... }:                                                       
{                                                                             
  services.gitea = {                                                          
    enable = true;                               # Enable Gitea               
    appName = "git.atlanticaweb.fr";         # Give the site a name           
    database = {                                                              
      type = "sqlite3";                         # Database type               
    };                                                                        
    domain = "git.atlanticaweb.fr";            # Domain name                  
    rootUrl = "https://git.atlanticaweb.fr/";   # Root web URL                
    httpPort = 3001;                             # Provided unique port       
    dump.enable = true;                                                       
    dump.backupDir = "/srv/backup/gitea";                                     
    lfs.enable = true;                                                        
    disableRegistration = true; # comment this line for the first user admin  
  };                                                                          
}                                                                              

Ajouter node-exporter

{ config, pkgs, lib, ... }:                       
{                                             
     services.prometheus = {                  
        exporters = {                         
          node = {                            
            enable = true;                    
            enabledCollectors = [ "systemd" ];
            port = 9002;                      
          };                                  
        };                                    
      };                                      
 }                                            

Ajout d’un compte utilisateur avec sa clé publique, sa configuration git, les droits sudo, un shell fish et des alias

{ config, pkgs, ...}:
{
  users = { 
    groups = {
      alexandre = {};
    };
    users = {
      alexandre = {
        isNormalUser = true;
	createHome = true;
        home = "/home/alexandre";
        description = "Alexandre LUCAZEAU";
        extraGroups = [ "wheel" ];
        group = "alexandre";
        shell = pkgs.fish;
	openssh.authorizedKeys.keys = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKUA1RW6JwZasspAp8qmFRFnlV5WXjhLfStAAkM+KYLv lucazeau.alexandre@gmail.com" ];
      };
    };
  };
  programs.git = {
	enable = true;
	config.user.email = "lucazeau.alexandre@gmail.com";
	config.user.name = "Alexandre LUCAZEAU";
	config.init.defaultBranch = "main";
	config.core.sshCommand = "ssh -i ~/.ssh/id_ed25519-perso";
  };
  programs.fish.enable = true;
  programs.fish.shellAliases = {
	ll = "ls -l";
	ls = "lsd";
	vi = "nvim";
	vim = "nvim";
  };
  security.sudo = {
	enable = true;
	execWheelOnly = true;
	extraRules = [
	{ users = [ "alexandre" ]; commands = [ { command = "ALL"; options = [ "NOPASSWD" ]; } ]; }
	];
  };
}
Généré avec Hugo
Thème Stack conçu par Jimmy