Deux semaines sous NixOS : je divorce de debian

Publié dans : Blog

Voilà deux semaines que je fais tourner ma machine de jeu et le laptop du travail sous NixOS. J’en suis tellement satisfait que j’ai la ferme intention d’en faire mon OS par défaut pour toutes mes machines sous GNU-Linux, et en particulier mes trois serveurs.

Attention, cet article n’est pas un guide pour NixOS, juste un retour d’expérience.

Présentation de NixOS

Comme toujours, c’est la Wikipédia qui vous en parlera le mieux (et, évidemment, le site officiel), alors pour vous présenter rapidement NixOS : c’est une distribution GNU-Linux qui présente la caractéristique de disposer d’une configuration dite “déclarative”. Grosso-modo, vous définissez l’état logiciel d’une machine dans des fichiers de configuration et NixOS s’occupe du reste. Un peu comme ansible ou les docker-compose. Pour être exact, NixOS est une distribution Linux qui repose sur le gestionnaire de paquets nix.

La première version date de 2003, c’est donc une distro ancienne, mais activement maintenue.

Du déclaratif, jusqu’à faire du stateless

En ce qui me concerne, l’aspect le plus marquant de NixOS est sa configuration déclarative, qui permet d’aller très loin dans la configuration du système jusqu’à permettre de construire un environnement stateless, c’est-à-dire qu’une fois la configuration appliquée, plus rien ne peut changer, à moins d’appliquer manuellement une nouvelle configuration, un peu comme un commit git.

On bénéficie donc de la reproductibilité logicielle : si un jeu de paramètres fonctionne chez moi, il fonctionnera aussi ailleurs (hors spécificités matérielles, évidemment). Et si on s’est bien débrouillé, on peut même arriver à générer des ISO spécifiques pour une machine dédiée : à nous le PXE sans prise de tête, le déploiement continu à l’échelle du système d’exploitation, la reprise d’activité en un instant, le versionning local de l’OS, etc. Les possibilités sont multiples.

Une courbe d’apprentissage importante

Avant d’en arriver-là, il faudra toutefois passer par une courbe d’apprentissage assez prononcée. C’est assez facile de bricoler des trucs une fois qu’on a compris le principe du fichier configuration.nix, mais faire des trucs vraiment sympas prend du temps. À titre informatif, j’en suis à un peu plus de 150 générations, mais mes fichiers de configuration ne ressemblent toujours à rien 😄 J’ai réussi à éclater la configuration dans plusieurs fichiers, mais je ne suis pas certain que l’organisation pour laquelle j’ai opté est la meilleure, ni que je respecte les bonnes pratiques.

Mais c’est comme ça que j’apprends, que je m’imprègne de la philosophie de NixOS. Et, même si je ne suis pas encore satisfait de mes fichiers de conf, j’ai un système fonctionnel, y compris pour jouer.

Ready for Steam, presque out-of-the-box

Ma machine de jeu est basée sur un Core i7 7700K et une GTX 1070 8G. Je ne joue qu’à des jeux sur Steam, et si mes jeux préférés ne sont pas exigeants, moi je le suis. Je veux un max de FPS partout, une fluidité sans faille, sans déroger sur la qualité d’image, surtout que mon moniteur est en 240Hz.

Peu importe la distribution Linux, les pilotes graphiques sont toujours plus ou moins compliqués à installer - et surtout, configurer. Sous NixOS, c’est plutôt facile :

services.xserver.videoDrivers = [ "nvidia" ];

Quant à Steam, c’est tout aussi simple :

programs.steam.enable = true;

Et avec ces deux lignes (plus quelques autres pour i3, fish, firefox et deux ou trois options de personnalisation), mon PC fait tourner Steam, proton et tous mes jeux sans aucun soucis, y compris certains que je ne parvenais pas à faire tourner la veille de la première installation de NixOS, du genre Age of Empires III.

Easy-peasy

Vu qu’il ne m’a fallut qu’une journée pour faire tourner mon PC de jeu sous NixOS et que maintenant c’est juste de l’optimisation/amélioration, je me sens en totale confiance pour l’installer sur mes serveurs. Je pourrais peut-être même me passer de docker pour la plupart des applications que j’utilise (oui, c’est un objectif à plus ou moins long terme : je ne veux plus de docker sur mes machines).

Un sentiment d’autant plus fort que j’ai aussi installé NixOS sur mon laptop professionnel, où disposer d’un environnement stable est tout de même très important. Et ce sentiment de stabilité est très concret : une fois qu’on a fait un nixos-rebuild switch, on a vraiment la sensation d’être aux commandes d’un système indestructible. Si ça marche une fois, ça marche toujours, à chaque reboot. On a le sentiment d’avoir un système fraîchement installé à chaque redémarrage. C’est grisant. Et en cas de pépin, même majeur, il suffit de démarrer la génération précédente via un menu créé automatiquement dans grub pour reprendre les rênes du système.

Quelques problèmes quand même

J’ai relevé quelques soucis mineurs (qui ne sont pas forcément liés à NixOS ceci-dit), dont un qui m’embête en particulier parce que je suis incapable d’en identifier la cause. Si je démarre une application réseau en même temps que l’environnement graphique (par exemple, via une commande exec dans la configuration d’i3), ces applications sont incapables de se connecter au réseau. Je me vois dans l’obligation de kill leurs processus respectifs pour les relancer à la main. Aucun problème, par contre, quand je temporise leur démarrage de quelques secondes via sleep par exemple. Un problème que j’ai constaté autant sur le PC de jeu que sur le laptop pro, aussi bien en filaire qu’en Wifi. peu importe la configuration des DNS (dnsmasq en cache local, mon serveur DNS du réseau ou même un DNS externe).

Autre problème que je ne parviens pas à résoudre : le rendu des fontes me semble assez moche par défaut, mais j’ignore encore comment l’améliorer.

Ces deux problèmes sont typiquement côté desktop, et ne m’inquiètent pas du tout pour l’usage serveur que je prévois de faire de NixOS.

Ma feuille de route

J’ai donc l’intention de remplacer debian par NixOS sur toutes mes machines : le serveur DNS, le serveur web, le serveur de stockage, et, éventuellement, si NixOS me le permet, sur la tablette Asus T100-TA qui me sert de panneau de contrôle domotique, la principale contrainte de cette tablette étant de disposer d’un EFI 32bits qui démarre un OS 64bits. debian m’a posé beaucoup de problèmes avec ça.