Introduction à Nix
Mise à jour :

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.1Projet 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 :
nix-shell -p cowsay --run 'cowsay "Test rapide !"'# À la fin, rien n'est installé sur le systèmeConcepts fondamentaux
Glossaire
| Terme | Définition |
|---|---|
| Store | Le répertoire /nix/store/ où Nix stocke tous les paquets |
| Hash | Empreinte unique calculée à partir des sources et dépendances |
| Profil | Ensemble de liens symboliques vers les paquets que vous utilisez |
| Génération | Instantané de votre profil à un moment donné |
| Channel | Dépôt de paquets Nix (branche de nixpkgs) |
| Nixpkgs | Le 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èmeapt 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/htopVotre 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
which curl || sudo apt install curlChoisir le mode d’installation
| Mode | Avantages | Recommandé pour |
|---|---|---|
| Single-user | Simple, pas de daemon | Poste personnel, tests |
| Multi-user | Sécurisé, plusieurs utilisateurs | Serveurs, machines partagées |
Installation single-user
sh <(curl -L https://nixos.org/nix/install) --no-daemon- L’installateur crée
/nix/store/ - Configure
~/.profileou~/.bash_profile - Installe les commandes Nix dans votre PATH
Installation multi-user
sh <(curl -L https://nixos.org/nix/install) --daemonCette installation crée un daemon nix-daemon et un groupe nixbld.
# Vérifier que le daemon fonctionnesystemctl status nix-daemonVérifier l’installation
nix --version# nix (Nix) 2.18.1Gestion 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
nix-channel --list# nixpkgs https://nixos.org/channels/nixpkgs-unstableAjouter un channel
# Channel stable NixOS 24.05nix-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 nixpkgsMettre à jour les channels
nix-channel --updateCommandes de base : nix-env
nix-env est la commande impérative pour gérer les paquets dans votre
profil utilisateur.
Rechercher un paquet
# 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/packagesInstaller un paquet
# Installer depuis nixpkgsnix-env -iA nixpkgs.htop
# Installer plusieurs paquetsnix-env -iA nixpkgs.htop nixpkgs.ripgrep nixpkgs.fzfLe -A signifie “par attribut” et est recommandé car plus rapide et précis.
Lister les paquets installés
# Liste simplenix-env -q# htop-3.3.0# ripgrep-14.0.0
# Avec les chemins du storenix-env -q --out-pathMettre à jour les paquets
# D'abord, mettre à jour le channelnix-channel --update
# Puis mettre à jour les paquetsnix-env -u
# Ou en une commandenix-channel --update && nix-env -uSupprimer un paquet
nix-env -e htop
# Supprimer plusieurs paquetsnix-env -e htop ripgrepEnvironnements temporaires : nix-shell
nix-shell crée un environnement temporaire avec des paquets disponibles,
sans les installer dans votre profil.
Usage simple
# Shell avec Pythonnix-shell -p python312
# Dans ce shell :python --version # Python 3.12.xexit # Python n'est plus disponibleExécuter une commande directement
nix-shell -p cowsay --run 'cowsay "Hello Nix!"'Plusieurs paquets
nix-shell -p python312 nodejs gitAvec un fichier shell.nix
Créez un fichier shell.nix à la racine de votre projet :
{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell { packages = with pkgs; [ python312 nodejs_20 git ];
shellHook = '' echo "Environnement de développement prêt !" '';}Puis lancez simplement :
nix-shell# Charge automatiquement shell.nixConstruire un paquet : nix-build
nix-build construit une expression Nix et crée un lien result vers le
résultat dans le store.
# Construire un paquet de nixpkgsnix-build '<nixpkgs>' -A htop
# Le résultat est un lien symboliquels -la result# result -> /nix/store/xxxx-htop-3.3.0
# Exécuter le binaire construit./result/bin/htopExplorer avec nix repl
nix repl est un REPL interactif pour explorer nixpkgs et tester des
expressions Nix.
nix repl# Charger nixpkgsnix-repl> :l <nixpkgs>
# Explorer un paquetnix-repl> pkgs.htop«derivation /nix/store/...-htop-3.3.0.drv»
# Voir les attributsnix-repl> pkgs.htop.meta.description"An interactive process viewer"
# Quitternix-repl> :qGé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, nodejsLister les générations
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
# Revenir à la génération précédentenix-env --rollback
# Revenir à une génération spécifiquenix-env --switch-generation 1Supprimer les anciennes générations
# Supprimer toutes sauf la courantenix-env --delete-generations old
# Supprimer les générations de plus de 30 joursnix-env --delete-generations 30dNettoyage du store
Garbage collection
Nix ne supprime jamais automatiquement un paquet. Un paquet est supprimé uniquement si :
- Aucune génération n’y fait référence
- Vous lancez explicitement le garbage collector
# Voir la taille du storedu -sh /nix/store
# Collecter les paquets non référencésnix-collect-garbage
# Supprimer les anciennes générations ET collecternix-collect-garbage -dOptimiser le store
Dédupliquer les fichiers identiques (hard links) :
nix store optimiseDépannage courant
”command not found: nix”
# Charger le profil manuellement. ~/.nix-profile/etc/profile.d/nix.shProblèmes de permissions (multi-user)
# Vérifier le daemonsystemctl status nix-daemon
# Redémarrersudo systemctl restart nix-daemonEspace disque insuffisant
# Diagnosticdu -sh /nix/store
# Nettoyagenix-collect-garbage -dnix store optimisePour 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
| Ressource | Description |
|---|---|
| Nix Manual ↗ | Référence complète |
| Nix Pills ↗ | Tutoriel progressif |
| Zero to Nix ↗ | Guide interactif débutant |
| search.nixos.org ↗ | Recherche 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.