NixOS ne peut pas être cassé de façon irréversible. Chaque nixos-rebuild switch crée une génération — un instantané complet du système que vous pouvez réactiver en une commande ou depuis le boot loader. Si le système ne démarre plus du tout, l’ISO d’installation et nixos-enter permettent de réparer sans réinstaller. Ce guide vous fait pratiquer les trois niveaux de récupération, du plus simple au plus radical, puis vous montre comment nettoyer les générations devenues inutiles.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Diagnostiquer un échec de
nixos-rebuildet comprendre le message d’erreur - Revenir en arrière avec
nixos-rebuild switch --rollback - Choisir une génération dans le menu systemd-boot au démarrage
- Réparer un système non bootable depuis l’ISO avec
nixos-enter - Nettoyer les anciennes générations avec
nix-collect-garbage -d - Optimiser l’espace disque avec
nix store optimise
Dans quel contexte ?
Section intitulée « Dans quel contexte ? »Ce lab correspond au moment où vous commencez à modifier votre configuration NixOS avec confiance — et où une erreur finit par arriver.
- Vous avez ajouté une option qui n’existe pas et
nixos-rebuildéchoue - Vous avez changé le port SSH ou supprimé un service par erreur et le système fonctionne mal
- Après un
nixos-rebuild switch, un service critique ne démarre plus et vous devez revenir en arrière rapidement - Votre VM NixOS a accumulé des dizaines de générations et le disque se remplit
- Dans le pire des cas, le système ne boot plus et vous devez intervenir depuis l’ISO
Prérequis
Section intitulée « Prérequis »- Lab 8 terminé (configuration NixOS maîtrisée, modules en place)
- Familiarité avec les générations et le store Nix
- L’ISO NixOS minimal disponible (celle utilisée pour le Lab 1)
Comment NixOS gère les générations système
Section intitulée « Comment NixOS gère les générations système »Chaque appel à nixos-rebuild switch produit une nouvelle génération dans le profil système :
sudo nix-env --list-generations --profile /nix/var/nix/profiles/system 1 2026-04-14 10:47:12 2 2026-04-14 11:09:05 3 2026-04-14 19:19:57 4 2026-04-14 19:21:14 (current)Chaque génération est un lien symbolique vers un chemin immutable dans /nix/store/. La génération courante est aussi pointée par /run/current-system :
readlink /run/current-system/nix/store/2fiz4aj5j38fi59ry379np9gx3zagmib-nixos-system-nixos-lab-25.11.20260413.7e495b7Le boot loader (ici systemd-boot) maintient une entrée par génération dans /boot/loader/entries/. Au démarrage, vous pouvez choisir n’importe laquelle.
Comparer les générations
Section intitulée « Comparer les générations »Avant de revenir en arrière, identifiez ce qui a changé entre deux générations :
sudo nix profile diff-closures --profile /nix/var/nix/profiles/systemVersion 2 -> 3: fail2ban: ∅ → 1.1.0, +5144.9 KiB python3.13-pyinotify: ∅ → 0.9.6, +296.0 KiB python3.13-systemd-python: ∅ → 235, +403.1 KiB
Version 3 -> 4: NetworkManager: ∅ → ..., +X KiB dnsmasq: ∅ → 2.91, +623.2 KiBChaque transition montre les paquets ajoutés (∅ → version), supprimés (version → ∅) et mis à jour. C’est l’équivalent d’un git diff appliqué à votre système.
Scénario 1 — La configuration ne compile pas
Section intitulée « Scénario 1 — La configuration ne compile pas »Le cas le plus fréquent : vous avez introduit une option invalide dans votre configuration.
-
Introduire une erreur volontaire
Ajoutez une option SSH qui n’existe pas dans
network.nix:services.openssh.settings.ThisOptionDoesNotExist = true; -
Tenter le rebuild
Fenêtre de terminal cd /etc/nixossudo nixos-rebuild switch --flake .#nixos-labLe rebuild échoue avec un message explicite :
error: Cannot build '...check-sshd-config.drv'.Last 2 log lines:> sshd.conf-final: line 12: Bad configuration option: ThisOptionDoesNotExist> sshd.conf-final: terminating, 1 bad configuration options -
Vérifier que le système est intact
Fenêtre de terminal sudo nix-env --list-generations --profile /nix/var/nix/profiles/systemAucune nouvelle génération n’a été créée. Le système tourne toujours sur la génération précédente — rien n’a changé.
-
Corriger et reconstruire
Retirez l’option invalide de
network.nix, puis relancez le rebuild.
Scénario 2 — Rollback après un changement regretté
Section intitulée « Scénario 2 — Rollback après un changement regretté »Le rebuild a réussi, mais le changement pose problème : vous avez changé le port SSH, supprimé fail2ban, ou un service ne fonctionne plus comme prévu.
-
Appliquer un changement fonctionnel mais indésirable
Modifiez
network.nixpour changer le port SSH et supprimer fail2ban :networking.firewall.allowedTCPPorts = [ 2222 ];services.openssh.ports = [ 2222 ];# fail2ban suppriméAppliquez :
Fenêtre de terminal cd /etc/nixossudo nixos-rebuild switch --flake .#nixos-labLe rebuild réussit — une nouvelle génération est créée. SSH écoute maintenant sur le port 2222 et fail2ban est arrêté.
-
Revenir en arrière immédiatement
Fenêtre de terminal sudo nixos-rebuild switch --rollbackswitching profile from version 5 to 4activating the configuration...restarting the following units: sshd.servicethe following new units were started: fail2ban.service -
Vérifier le retour à l’état précédent
Fenêtre de terminal # SSH revenu sur le port 22ss -tlnp | grep 22# fail2ban réactivésystemctl is-active fail2ban
Le rollback réactive l’ancienne génération à chaud : les services sont redémarrés, les ports changent, les paquets redeviennent disponibles — sans reboot.
Scénario 3 — Rollback depuis systemd-boot
Section intitulée « Scénario 3 — Rollback depuis systemd-boot »Si le système a redémarré sur une génération cassée (un service critique empêche le login, par exemple), vous ne pouvez plus utiliser SSH. Le boot loader permet de choisir une autre génération avant que le système ne démarre.
-
Préparer le rollback au prochain démarrage
Si vous avez encore accès au système (via la console KVM par exemple) :
Fenêtre de terminal sudo nixos-rebuild boot --rollbackCette commande ne touche pas le système en cours d’exécution. Elle configure le boot loader pour démarrer sur la génération précédente au prochain reboot.
switching profile from version 5 to 4Done. The new configuration is /nix/var/nix/profiles/system -
Redémarrer
Fenêtre de terminal sudo rebootAu prochain démarrage, systemd-boot charge la génération 4 — avec SSH sur le port 22 et fail2ban actif.
-
Alternative : sélection manuelle dans le menu
Si vous n’avez plus accès au système du tout, ouvrez la console graphique de la VM (via
virt-managerouvirsh console) et :- Au démarrage, le menu systemd-boot s’affiche pendant 5 secondes
- Utilisez les flèches pour sélectionner une ancienne génération (ex : Generation 4)
- Appuyez sur Entrée
Le système démarre sur la génération choisie. Elle reste active jusqu’au prochain
nixos-rebuild switch.
Vérifier les entrées du boot loader
Section intitulée « Vérifier les entrées du boot loader »sudo ls /boot/loader/entries/nixos-generation-1.confnixos-generation-2.confnixos-generation-3.confnixos-generation-4.confnixos-generation-5.confChaque fichier correspond à une génération. Le fichier loader.conf indique laquelle est chargée par défaut :
sudo cat /boot/loader/loader.conftimeout 5default nixos-generation-4.confconsole-mode keepScénario 4 — Réparer depuis l’ISO avec nixos-enter
Section intitulée « Scénario 4 — Réparer depuis l’ISO avec nixos-enter »Quand aucune génération ne permet de démarrer (store corrompu, partition abîmée, mauvaise configuration du boot loader), la dernière option est de booter depuis l’ISO d’installation et d’utiliser nixos-enter pour accéder au système installé.
-
Attacher l’ISO à la VM
Depuis l’hôte KVM :
Fenêtre de terminal virsh change-media nixos-lab sda \/chemin/vers/nixos-minimal-25.11-x86_64-linux.iso --insertPuis modifiez l’ordre de boot pour démarrer sur le CD-ROM (via
virt-manager→ Vue → Détails → Options de démarrage, ou viavirsh edit). -
Démarrer sur l’ISO et monter les partitions
Une fois dans le shell de l’ISO live :
Fenêtre de terminal # Identifier les partitionslsblk -f# Monter la racinemount /dev/vda2 /mnt# Monter la partition EFImount /dev/vda1 /mnt/boot -
Entrer dans le système installé
Fenêtre de terminal nixos-enterVous êtes maintenant dans un chroot complet du système installé, avec accès à tous les fichiers de configuration et au store Nix.
-
Corriger la configuration et reconstruire
Fenêtre de terminal cd /etc/nixos# Corriger le fichier fautif (vim, nano...)vim network.nix# Reconstruirenixos-rebuild switch --flake .#nixos-lab -
Quitter et redémarrer
Fenêtre de terminal exit # quitter nixos-enterumount /mnt/bootumount /mntrebootRetirez l’ISO du lecteur CD et démarrez normalement. Le système utilise la configuration corrigée.
Nettoyer les anciennes générations
Section intitulée « Nettoyer les anciennes générations »Chaque génération conserve ses paquets dans le store. Après plusieurs modifications, l’espace disque peut grossir. Le garbage collector supprime tout ce qui n’est plus référencé par aucune génération active.
-
Mesurer l’espace avant nettoyage
Fenêtre de terminal df -h /du -sh /nix/storesudo nix-env --list-generations --profile /nix/var/nix/profiles/systemExemple de sortie :
/dev/vda2 20G 2.9G 16G 16% /2.8G /nix/store1 2026-04-14 10:47:122 2026-04-14 11:09:053 2026-04-14 19:19:574 2026-04-14 19:21:14 (current)5 2026-04-15 07:21:39 -
Supprimer toutes les anciennes générations et lancer le GC
Fenêtre de terminal sudo nix-collect-garbage -dL’option
-d(delete) supprime d’abord toutes les générations sauf la courante, puis lance le ramasse-miettes sur le store. -
Vérifier le résultat
Fenêtre de terminal df -h /du -sh /nix/storesudo nix-env --list-generations --profile /nix/var/nix/profiles/system/dev/vda2 20G 2.3G 16G 13% /2.3G /nix/store4 2026-04-14 19:21:14 (current)Seule la génération courante subsiste. Le store est passé de 2.8 Go à 2.3 Go.
-
Nettoyer les entrées du boot loader
Le garbage collector ne touche pas les entrées de systemd-boot. Pour les synchroniser, lancez un rebuild :
Fenêtre de terminal cd /etc/nixossudo nixos-rebuild boot --flake .#nixos-labVérifiez qu’il ne reste qu’une seule entrée :
Fenêtre de terminal sudo ls /boot/loader/entries/nixos-generation-4.conf
Optimiser le store avec la déduplication
Section intitulée « Optimiser le store avec la déduplication »Même après le GC, le store peut contenir des fichiers identiques copiés dans différents paquets. La commande nix store optimise les remplace par des hard links :
sudo nix store optimise237.87 MiB freed by hard-linking 63603 filesDans notre cas, cela a réduit le store de 2.3 Go à 2.2 Go — un gain supplémentaire de 238 Mo.
Automatiser le nettoyage
Section intitulée « Automatiser le nettoyage »Pour ne plus y penser, activez le garbage collector automatique dans configuration.nix :
nix.gc = { automatic = true; dates = "weekly"; options = "--delete-older-than 30d";};Cette configuration supprime chaque semaine les générations de plus de 30 jours, puis lance le GC. Adaptez la durée selon vos besoins — sur un serveur de production, garder au moins 2 à 4 semaines de générations est recommandé.
Résumé des commandes de récupération
Section intitulée « Résumé des commandes de récupération »| Situation | Commande | Effet |
|---|---|---|
| Rebuild échoué | Rien à faire | Le système reste sur la génération courante |
| Changement regretté | sudo nixos-rebuild switch --rollback | Réactive la génération précédente à chaud |
| Préparer un rollback au reboot | sudo nixos-rebuild boot --rollback | Configure le boot loader sans toucher au système actif |
| Système non bootable | Menu systemd-boot → ancienne génération | Démarre sur une génération fonctionnelle |
| Rien ne boot | ISO + mount + nixos-enter | Chroot dans le système installé pour corriger |
| Lister les générations | sudo nix-env --list-generations -p /nix/var/nix/profiles/system | Voir l’historique complet |
| Comparer les générations | sudo nix profile diff-closures --profile /nix/var/nix/profiles/system | Diff des paquets entre chaque génération |
| Nettoyer | sudo nix-collect-garbage -d | Supprime anciennes générations + GC du store |
| Optimiser | sudo nix store optimise | Déduplique les fichiers par hard links |
Vérifications
Section intitulée « Vérifications »-
Le rebuild échoué ne crée pas de génération
Introduisez une option invalide, lancez
nixos-rebuild switch, vérifiez que le nombre de générations n’a pas changé. -
Le rollback restaure les services
Après un
nixos-rebuild switch --rollback, vérifiez que les services supprimés sont revenus (systemctl is-active fail2ban) et que les ports sont corrects (ss -tlnp). -
Le boot loader reflète les générations
Vérifiez que
ls /boot/loader/entries/contient une entrée par génération et queloader.confpointe vers la génération courante. -
Le GC libère de l’espace
Comparez
du -sh /nix/storeetdf -h /avant et aprèsnix-collect-garbage -d. -
nix store optimisegagne de l’espace supplémentaireLancez la commande et vérifiez le nombre de Mo libérés par la déduplication.
Dépannage
Section intitulée « Dépannage »nixos-rebuild switch --rollback ne change rien
Section intitulée « nixos-rebuild switch --rollback ne change rien »Vous êtes probablement déjà sur la première génération. Vérifiez avec :
sudo nix-env --list-generations --profile /nix/var/nix/profiles/systemS’il n’y a qu’une seule génération, il n’y a rien vers quoi revenir.
Les anciennes entrées de boot restent après le GC
Section intitulée « Les anciennes entrées de boot restent après le GC »Le garbage collector ne synchronise pas les entrées de systemd-boot. Exécutez un nixos-rebuild boot pour les nettoyer.
nixos-enter échoue avec “mount failed”
Section intitulée « nixos-enter échoue avec “mount failed” »Vérifiez que les partitions sont montées dans le bon ordre : la racine (/) sur /mnt en premier, puis /boot sur /mnt/boot. Si la partition racine utilise un système de fichiers chiffré (LUKS), déchiffrez-la d’abord avec cryptsetup open.
Le store est corrompu
Section intitulée « Le store est corrompu »Les cas de corruption du store sont très rares (matériel défaillant). Vous pouvez tenter une vérification :
sudo nix store verify --allSi des chemins sont endommagés, nix store repair peut les reconstruire à partir des sources si elles sont encore disponibles. En dernier recours, une réinstallation depuis l’ISO en conservant /home est la solution.
Je ne vois pas le menu systemd-boot
Section intitulée « Je ne vois pas le menu systemd-boot »Le timeout par défaut est de 5 secondes. Si le menu disparaît trop vite, maintenez la touche Espace enfoncée au démarrage. Vous pouvez aussi augmenter le timeout :
boot.loader.timeout = 10;À retenir
Section intitulée « À retenir »- Un rebuild échoué ne touche pas au système — la compilation protège avant l’activation
nixos-rebuild switch --rollbackréactive la génération précédente instantanément, sans rebootnixos-rebuild boot --rollbackprépare le rollback pour le prochain démarrage- Le menu systemd-boot permet de choisir n’importe quelle génération au démarrage
- L’ISO + nixos-enter est le filet de sécurité ultime quand plus rien ne boot
- Versionnez
/etc/nixosavec git — le rollback système ne restaure pas vos fichiers de configuration nix-collect-garbage -dsupprime les anciennes générations — ne le faites que si la génération courante est stablenix store optimiseéconomise de l’espace supplémentaire par déduplication