Aller au contenu

Introduction à Nix

Mise à jour :

Nix Logo

Nix est un gestionnaire de paquets qui fonctionne sur n’importe quelle distribution Linux et macOS. Contrairement à APT, DNF ou Pacman, Nix adopte une approche radicalement différente : chaque paquet est isolé dans son propre répertoire avec toutes ses dépendances. Cette isolation garantit qu’un paquet ne peut jamais “casser” un autre programme.

Ce guide présente les bases de Nix : concepts fondamentaux, installation, et utilisation quotidienne.

Qu’est-ce que Nix ?

Nix est à la fois :

  • Un gestionnaire de paquets universel (comme apt ou dnf)
  • Un langage de programmation fonctionnel pour décrire des paquets
  • Une philosophie de gestion du logiciel basée sur l’immutabilité

Pourquoi utiliser Nix ?

Reproductibilité garantie

Deux machines avec la même configuration Nix obtiennent exactement le même résultat, byte pour byte. Fini le “ça marche sur ma machine”.

Isolation totale

Chaque paquet est stocké dans /nix/store/ avec ses dépendances exactes. Cela élimine le fameux “dependency hell” :

# Avec apt : conflit !
Projet A → nécessite libssl 1.1
Projet B → nécessite libssl 3.0
# Avec Nix : coexistence
/nix/store/abc123-openssl-1.1.1/
/nix/store/def456-openssl-3.0.0/

Rollback instantané

Chaque modification crée une nouvelle génération. En cas de problème, retour arrière en une commande.

Environnements temporaires

Tester un outil sans l’installer globalement :

Terminal window
nix-shell -p cowsay --run 'cowsay "Test rapide !"'
# À la fin, rien n'est installé sur le système

Concepts fondamentaux

Glossaire

TermeDéfinition
StoreLe répertoire /nix/store/ où Nix stocke tous les paquets
HashEmpreinte unique calculée à partir des sources et dépendances
ProfilEnsemble de liens symboliques vers les paquets que vous utilisez
GénérationInstantané de votre profil à un moment donné
ChannelDépôt de paquets Nix (branche de nixpkgs)
NixpkgsLe dépôt principal contenant plus de 100 000 paquets

Paradigme déclaratif vs impératif

Les gestionnaires traditionnels sont impératifs : vous exécutez une séquence de commandes et l’état final dépend de l’ordre des opérations.

Nix peut fonctionner de façon déclarative : vous décrivez l’état souhaité et Nix calcule comment y arriver.

# Impératif (apt)
apt install python3 # Quelle version ? Dépend du système
apt install nodejs # Peut créer des conflits
# Déclaratif (Nix)
# shell.nix
{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
packages = [ pkgs.python312 pkgs.nodejs_20 ];
}

Le Nix Store

Où sont stockés les paquets ?

Nix stocke tout dans /nix/store/. Chaque paquet a son propre répertoire :

/nix/store/aaaa1111...-python-3.12.0/
├── bin/
│ └── python3
├── lib/
│ └── libpython3.12.so
└── include/
└── python3.12/
/nix/store/bbbb2222...-python-3.10.0/
└── ...

Le hash et la reproductibilité

Le hash (ex: aaaa1111...) est calculé à partir de tout ce qui entre dans la construction : sources, dépendances, options de compilation, compilateur…

Hash = f(sources + dépendances + options + compilateur)

Deux builds identiques sur deux machines différentes produisent exactement le même hash. C’est la reproductibilité garantie de Nix.

Profils et liens symboliques

Comment les commandes sont-elles accessibles si tout est dans /nix/store/ ?

Nix utilise des liens symboliques :

~/.nix-profile/bin/python → /nix/store/aaaa1111...-python-3.12.0/bin/python3
~/.nix-profile/bin/htop → /nix/store/dddd4444...-htop-3.3.0/bin/htop

Votre PATH contient ~/.nix-profile/bin. Installer un paquet = ajouter un lien. Supprimer = retirer le lien.

Installation de Nix

Prérequis

  • curl : pour télécharger l’installateur
  • Droits sudo : pour l’installation multi-user
  • Espace disque : au moins 5 Go pour /nix
Terminal window
which curl || sudo apt install curl

Choisir le mode d’installation

ModeAvantagesRecommandé pour
Single-userSimple, pas de daemonPoste personnel, tests
Multi-userSécurisé, plusieurs utilisateursServeurs, machines partagées

Installation single-user

Terminal window
sh <(curl -L https://nixos.org/nix/install) --no-daemon
  1. L’installateur crée /nix/store/
  2. Configure ~/.profile ou ~/.bash_profile
  3. Installe les commandes Nix dans votre PATH

Installation multi-user

Terminal window
sh <(curl -L https://nixos.org/nix/install) --daemon

Cette installation crée un daemon nix-daemon et un groupe nixbld.

Terminal window
# Vérifier que le daemon fonctionne
systemctl status nix-daemon

Vérifier l’installation

Terminal window
nix --version
# nix (Nix) 2.18.1

Gestion des channels

Les channels sont des branches du dépôt nixpkgs. C’est la méthode classique (avant les flakes) pour gérer les sources de paquets.

Lister les channels configurés

Terminal window
nix-channel --list
# nixpkgs https://nixos.org/channels/nixpkgs-unstable

Ajouter un channel

Terminal window
# Channel stable NixOS 24.05
nix-channel --add https://nixos.org/channels/nixos-24.05 nixpkgs
# Ou channel unstable (dernières versions)
nix-channel --add https://nixos.org/channels/nixpkgs-unstable nixpkgs

Mettre à jour les channels

Terminal window
nix-channel --update

Commandes de base : nix-env

nix-env est la commande impérative pour gérer les paquets dans votre profil utilisateur.

Rechercher un paquet

Terminal window
# Recherche locale (peut être lent la première fois)
nix-env -qaP '.*htop.*'
# nixpkgs.htop htop-3.3.0
# Recommandé : utiliser le site web
# https://search.nixos.org/packages

Installer un paquet

Terminal window
# Installer depuis nixpkgs
nix-env -iA nixpkgs.htop
# Installer plusieurs paquets
nix-env -iA nixpkgs.htop nixpkgs.ripgrep nixpkgs.fzf

Le -A signifie “par attribut” et est recommandé car plus rapide et précis.

Lister les paquets installés

Terminal window
# Liste simple
nix-env -q
# htop-3.3.0
# ripgrep-14.0.0
# Avec les chemins du store
nix-env -q --out-path

Mettre à jour les paquets

Terminal window
# D'abord, mettre à jour le channel
nix-channel --update
# Puis mettre à jour les paquets
nix-env -u
# Ou en une commande
nix-channel --update && nix-env -u

Supprimer un paquet

Terminal window
nix-env -e htop
# Supprimer plusieurs paquets
nix-env -e htop ripgrep

Environnements temporaires : nix-shell

nix-shell crée un environnement temporaire avec des paquets disponibles, sans les installer dans votre profil.

Usage simple

Terminal window
# Shell avec Python
nix-shell -p python312
# Dans ce shell :
python --version # Python 3.12.x
exit # Python n'est plus disponible

Exécuter une commande directement

Terminal window
nix-shell -p cowsay --run 'cowsay "Hello Nix!"'

Plusieurs paquets

Terminal window
nix-shell -p python312 nodejs git

Avec un fichier shell.nix

Créez un fichier shell.nix à la racine de votre projet :

shell.nix
{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
packages = with pkgs; [
python312
nodejs_20
git
];
shellHook = ''
echo "Environnement de développement prêt !"
'';
}

Puis lancez simplement :

Terminal window
nix-shell
# Charge automatiquement shell.nix

Construire un paquet : nix-build

nix-build construit une expression Nix et crée un lien result vers le résultat dans le store.

Terminal window
# Construire un paquet de nixpkgs
nix-build '<nixpkgs>' -A htop
# Le résultat est un lien symbolique
ls -la result
# result -> /nix/store/xxxx-htop-3.3.0
# Exécuter le binaire construit
./result/bin/htop

Explorer avec nix repl

nix repl est un REPL interactif pour explorer nixpkgs et tester des expressions Nix.

Terminal window
nix repl
# Charger nixpkgs
nix-repl> :l <nixpkgs>
# Explorer un paquet
nix-repl> pkgs.htop
«derivation /nix/store/...-htop-3.3.0.drv»
# Voir les attributs
nix-repl> pkgs.htop.meta.description
"An interactive process viewer"
# Quitter
nix-repl> :q

Générations et rollback

Comprendre les générations

Chaque modification de votre profil crée une nouvelle génération :

Génération 1 : python, htop
↓ (nix-env -iA nixpkgs.nodejs)
Génération 2 : python, htop, nodejs
↓ (nix-env -e python)
Génération 3 : htop, nodejs

Lister les générations

Terminal window
nix-env --list-generations
# 1 2024-01-10 10:30:00
# 2 2024-01-12 14:15:00
# 3 2024-01-15 09:00:00 (current)

Rollback

Terminal window
# Revenir à la génération précédente
nix-env --rollback
# Revenir à une génération spécifique
nix-env --switch-generation 1

Supprimer les anciennes générations

Terminal window
# Supprimer toutes sauf la courante
nix-env --delete-generations old
# Supprimer les générations de plus de 30 jours
nix-env --delete-generations 30d

Nettoyage du store

Garbage collection

Nix ne supprime jamais automatiquement un paquet. Un paquet est supprimé uniquement si :

  1. Aucune génération n’y fait référence
  2. Vous lancez explicitement le garbage collector
Terminal window
# Voir la taille du store
du -sh /nix/store
# Collecter les paquets non référencés
nix-collect-garbage
# Supprimer les anciennes générations ET collecter
nix-collect-garbage -d

Optimiser le store

Dédupliquer les fichiers identiques (hard links) :

Terminal window
nix store optimise

Dépannage courant

”command not found: nix”

Terminal window
# Charger le profil manuellement
. ~/.nix-profile/etc/profile.d/nix.sh

Problèmes de permissions (multi-user)

Terminal window
# Vérifier le daemon
systemctl status nix-daemon
# Redémarrer
sudo systemctl restart nix-daemon

Espace disque insuffisant

Terminal window
# Diagnostic
du -sh /nix/store
# Nettoyage
nix-collect-garbage -d
nix store optimise

Pour aller plus loin

Ce guide couvre les bases de Nix sans flakes. Pour aller plus loin :

  • Langage Nix : syntaxe, fonctions, dérivations
  • Flakes (guide à venir) : workflow moderne et reproductibilité garantie
  • NixOS : le système d’exploitation déclaratif

Ressources

RessourceDescription
Nix ManualRéférence complète
Nix PillsTutoriel progressif
Zero to NixGuide interactif débutant
search.nixos.orgRecherche de paquets

Conclusion

Vous connaissez maintenant les bases de Nix : le store, les profils, les générations, et les commandes classiques (nix-env, nix-shell, nix-build).

Ces concepts sont fondamentaux et restent valables même avec les flakes. La prochaine étape est d’apprendre le langage Nix pour écrire vos propres expressions, puis les flakes (guide à venir) pour des projets reproductibles.