Aller au contenu
Administration Linux medium

Introduction à Nix

14 min de lecture

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.

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é

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”.

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/

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

Tester un outil sans l’installer globalement :

Fenêtre de terminal
nix-shell -p cowsay --run 'cowsay "Test rapide !"'
# À la fin, rien n'est installé sur le système
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

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 ];
}

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 (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.

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.

  • curl : pour télécharger l’installateur
  • Droits sudo : pour l’installation multi-user
  • Espace disque : au moins 5 Go pour /nix
Fenêtre de terminal
which curl || sudo apt install curl
ModeAvantagesRecommandé pour
Single-userSimple, pas de daemonPoste personnel, tests
Multi-userSécurisé, plusieurs utilisateursServeurs, machines partagées
Fenêtre de terminal
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
Fenêtre de terminal
sh <(curl -L https://nixos.org/nix/install) --daemon

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

Fenêtre de terminal
# Vérifier que le daemon fonctionne
systemctl status nix-daemon
Fenêtre de terminal
nix --version
# nix (Nix) 2.18.1

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.

Fenêtre de terminal
nix-channel --list
# nixpkgs https://nixos.org/channels/nixpkgs-unstable
Fenêtre de terminal
# 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
Fenêtre de terminal
nix-channel --update

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

Fenêtre de terminal
# 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
Fenêtre de terminal
# 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.

Fenêtre de terminal
# Liste simple
nix-env -q
# htop-3.3.0
# ripgrep-14.0.0
# Avec les chemins du store
nix-env -q --out-path
Fenêtre de terminal
# 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
Fenêtre de terminal
nix-env -e htop
# Supprimer plusieurs paquets
nix-env -e htop ripgrep

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

Fenêtre de terminal
# Shell avec Python
nix-shell -p python312
# Dans ce shell :
python --version # Python 3.12.x
exit # Python n'est plus disponible
Fenêtre de terminal
nix-shell -p cowsay --run 'cowsay "Hello Nix!"'
Fenêtre de terminal
nix-shell -p python312 nodejs git

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 :

Fenêtre de terminal
nix-shell
# Charge automatiquement shell.nix

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

Fenêtre de terminal
# 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

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

Fenêtre de terminal
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

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
Fenêtre de terminal
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)
Fenêtre de terminal
# Revenir à la génération précédente
nix-env --rollback
# Revenir à une génération spécifique
nix-env --switch-generation 1
Fenêtre de terminal
# 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

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
Fenêtre de terminal
# 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

Dédupliquer les fichiers identiques (hard links) :

Fenêtre de terminal
nix store optimise
Fenêtre de terminal
# Charger le profil manuellement
. ~/.nix-profile/etc/profile.d/nix.sh
Fenêtre de terminal
# Vérifier le daemon
systemctl status nix-daemon
# Redémarrer
sudo systemctl restart nix-daemon
Fenêtre de terminal
# Diagnostic
du -sh /nix/store
# Nettoyage
nix-collect-garbage -d
nix store optimise

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
RessourceDescription
Nix ManualRéférence complète
Nix PillsTutoriel progressif
Zero to NixGuide interactif débutant
search.nixos.orgRecherche de paquets

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.