
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 ?
Section intitulée « 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 ?
Section intitulée « Pourquoi utiliser Nix ? »Reproductibilité garantie
Section intitulée « 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
Section intitulée « 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é
Section intitulée « Rollback instantané »Chaque modification crée une nouvelle génération. En cas de problème, retour arrière en une commande.
Environnements temporaires
Section intitulée « 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
Section intitulée « Concepts fondamentaux »Glossaire
Section intitulée « 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
Section intitulée « 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
Section intitulée « Le Nix Store »Où sont stockés les paquets ?
Section intitulée « 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é
Section intitulée « 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
Section intitulée « 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
Section intitulée « Installation de Nix »Prérequis
Section intitulée « 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
Section intitulée « Choisir 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
Section intitulée « 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
Section intitulée « 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
Section intitulée « Vérifier l’installation »nix --version# nix (Nix) 2.18.1Gestion des channels
Section intitulée « 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
Section intitulée « Lister les channels configurés »nix-channel --list# nixpkgs https://nixos.org/channels/nixpkgs-unstableAjouter un channel
Section intitulée « Ajouter 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
Section intitulée « Mettre à jour les channels »nix-channel --updateCommandes de base : nix-env
Section intitulée « Commandes de base : nix-env »nix-env est la commande impérative pour gérer les paquets dans votre
profil utilisateur.
Rechercher un paquet
Section intitulée « 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
Section intitulée « Installer 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
Section intitulée « 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
Section intitulée « Mettre à 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
Section intitulée « Supprimer un paquet »nix-env -e htop
# Supprimer plusieurs paquetsnix-env -e htop ripgrepEnvironnements temporaires : nix-shell
Section intitulée « Environnements temporaires : nix-shell »nix-shell crée un environnement temporaire avec des paquets disponibles,
sans les installer dans votre profil.
Usage simple
Section intitulée « 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
Section intitulée « Exécuter une commande directement »nix-shell -p cowsay --run 'cowsay "Hello Nix!"'Plusieurs paquets
Section intitulée « Plusieurs paquets »nix-shell -p python312 nodejs gitAvec un fichier shell.nix
Section intitulée « Avec 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
Section intitulée « Construire 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
Section intitulée « Explorer 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
Section intitulée « Générations et rollback »Comprendre les générations
Section intitulée « 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
Section intitulée « Lister 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
Section intitulée « 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
Section intitulée « Supprimer 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
Section intitulée « Nettoyage du store »Garbage collection
Section intitulée « 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
Section intitulée « Optimiser le store »Dédupliquer les fichiers identiques (hard links) :
nix store optimiseDépannage courant
Section intitulée « Dépannage courant »”command not found: nix”
Section intitulée « ”command not found: nix” »# Charger le profil manuellement. ~/.nix-profile/etc/profile.d/nix.shProblèmes de permissions (multi-user)
Section intitulée « Problèmes de permissions (multi-user) »# Vérifier le daemonsystemctl status nix-daemon
# Redémarrersudo systemctl restart nix-daemonEspace disque insuffisant
Section intitulée « Espace disque insuffisant »# Diagnosticdu -sh /nix/store
# Nettoyagenix-collect-garbage -dnix store optimisePour aller plus loin
Section intitulée « 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
Section intitulée « 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
Section intitulée « 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.