Le problème silencieux du store Nix
L’un des grands avantages de NixOS est sa capacité à conserver plusieurs générations du système. Une mise à jour ratée ? Un rollback permet de revenir instantanément à un état précédent.
Cette flexibilité a cependant un coût : l’espace disque.
À chaque mise à jour, à chaque compilation, à chaque nouvelle
génération, le store nix accumule de nouveaux objets. Sur une machine
disposant d’un SSD confortable, cela peut passer inaperçu pendant
plusieurs mois. Sur un portable ou une machine virtuelle plus
contrainte, la croissance devient rapidement visible.
J’ai pris l’habitude d’automatiser complètement la gestion de cet espace afin de ne plus avoir à exécuter manuellement les commandes de nettoyage.
Bien entendu, j’ai fait ça après avoir la base de données SQLite du store cassée pour cette raison…
Activer le nettoyage automatique
La première étape consiste à programmer le ramasse-miettes de nix.
|
|
Cette configuration demande à nix :
- d’exécuter automatiquement le garbage collector ;
- une fois par semaine ;
- en supprimant les générations âgées de plus de trente jours.
L’intérêt est de conserver un historique suffisamment long pour revenir en arrière en cas de problème tout en évitant l’accumulation de plusieurs mois, voire plusieurs années de générations inutilisées.
Optimiser le store
Le nettoyage n’est pas la seule source de gaspillage.
Il arrive fréquemment que plusieurs chemins du store contiennent
exactement les mêmes données. nix est capable de détecter ces doublons
et de les remplacer par des liens physiques.
L’activation est triviale :
|
|
Cette option permet souvent de récupérer plusieurs gigaoctets sur une installation utilisée depuis longtemps.
Le gain dépend fortement du nombre de paquets installés, mais comme l’opération est automatique et transparente, il n’y a généralement aucune raison de s’en priver.
Éviter la catastrophe pendant une compilation
Les compilations locales sont particulièrement gourmandes en espace disque.
Lorsque le SSD approche de la saturation, les symptômes sont parfois surprenants :
- Échecs de compilation ;
- erreurs d’écriture ;
- builds interrompus sans explication évidente ;
- comportements imprévisibles de certains outils ;
- la pire de toutes : la base SQLite cassée.
Pour limiter ce risque, Nix propose deux seuils :
|
|
Dans cet exemple :
- lorsque l’espace libre descend sous 1 Go, Nix déclenche automatiquement un garbage collection ;
- il tente ensuite de remonter jusqu’à environ 3 Go d’espace libre.
Le mécanisme agit comme une soupape de sécurité. Même après plusieurs semaines sans maintenance, le système dispose d’une chance supplémentaire d’éviter la saturation complète du disque.
La configuration complète
Voici la configuration que j’utilise actuellement :
|
|
Vérifier le résultat
On reconstruit le système :
|
|
on peut vérifier la présence du timer :
|
|
et surveiller l’espace occupé par le store :
|
|
Sur une machine utilisée quotidiennement, la différence se remarque surtout après quelques mois. Le store reste à une taille raisonnable, les anciennes générations disparaissent progressivement et les compilations ont moins de chances d’échouer faute d’espace disque.
Conclusion
L’un des pièges de NixOS est que tout fonctionne tellement bien qu’on oublie parfois que le store continue de grandir en arrière-plan.
Quelques lignes de configuration suffisent pourtant à automatiser entièrement son entretien :
- Nettoyage hebdomadaire ;
- suppression des générations anciennes ;
- optimisation du stockage ;
- protection contre les compilations lorsque l’espace libre devient critique.
Une fois en place, on n’y pense plus. Et c’est probablement le meilleur compliment que l’on puisse faire à une tâche d’administration système.