veilletech.fr
7 sept. Feed du jour
#06 OUTILS Article

Un paquet Nix qui démarre dans un onglet

« Ça marche chez moi » est devenu une URL.

trynix.dev démarre une machine Linux dans un onglet et y monte n'importe quel chemin du store Nix : 310 083 versions de paquets, sans rien installer. Le montage n'a pas de serveur — une page statique, un noyau Linux compilé en WebAssembly et des caches publics ouverts en CORS suffisent.

3 min de lectureintermédiairevidéo 1:21
Partager
Sommaire5 sections
  1. Ce qui se passe
  2. Comment les pièces s'emboîtent
  3. Ce qu'il en coûte
  4. Ce que ça peut changer
  5. À retenir

Ce qui se passe

trynix.dev propose de choisir un paquet, n'importe lequel de l'histoire de nixpkgs, et d'obtenir en quelques secondes un shell où ce paquet est dans le PATH. Rien n'est installé sur la machine hôte. L'index couvre 310 083 versions de paquets, jusqu'à un Python 3.6.2 de 2017.

L'auteur, Farid Zakaria, présente le projet comme l'aboutissement de travaux antérieurs : nixpkgs-multiverse, qui indexe toutes les versions jamais livrées par nixpkgs, et son mode rapide, qui saute l'évaluation pour donner directement le chemin de store qu'Hydra a construit.

Comment les pièces s'emboîtent

Page statiquetrynix.devnixpkgs-multiversenom + version storepathCache HTTP ouvert enCORScache.nixos.org, Cachix,GitHub PagesStore Nix en mémoirenarinfo + NARdécompressésQEMU-WASMnoyau Linux x86_64Terminal dans la pagestore monté en 9p

Le point à voir dans ce schéma est ce qui n'y figure pas : il n'y a aucun serveur applicatif. La page est un fichier statique, tout le reste sont des caches publics.

La condition unique côté cache est de servir l'en-tête access-control-allow-origin: *. cache.nixos.org le fait — l'auteur note au passage qu'il l'avait lui-même demandé cinq ans plus tôt, pour un tout autre usage. Cachix aussi. Et GitHub Pages, gratuitement, puisque c'est un simple serveur de fichiers statiques. Conséquence directe : vous pouvez publier un chemin de store que vous avez construit vous-même et le faire démarrer chez quelqu'un d'autre, même s'il n'existe sur aucun cache public.

Comme il s'agit de Nix, deux versions du même paquet cohabitent sans conflit dans la même machine : chaque binaire nomme ses dépendances par chemin absolu via son RUNPATH, jusqu'au chargeur et à la libc. On peut aussi ajouter des chemins au store d'une VM déjà démarrée, sans redémarrage.

Ce qu'il en coûte

Démarrer un noyau sous émulation est lent, et le projet ne le nie pas : il le contourne. La VM ne démarre jamais à froid. Une machine est amorcée une fois à l'avance, sur un QEMU natif, et mise en pause juste avant de monter le store ; c'est cet instantané, préchargé en arrière-plan avec le moteur, qui est repris.

1re visite Revisite
python3 7,5 s 3,5 s
ripgrep 4,3 s 1,7 s
hello 4,2 s 1,5 s

Les limites restantes sont franches. L'exécution reste émulée : la première exécution d'un binaire le traduit de x86-64 vers WebAssembly, ce qui coûte du temps avant d'être mis en cache. Toute la clôture doit tenir dans la mémoire de l'onglet, plafonnée autour de 1,5 Gio, WebAssembly ne dépassant de toute façon pas 4 Gio d'espace d'adressage 32 bits. Et c'est une console série : aucun programme graphique.

Ce que ça peut changer

L'auteur ouvre plusieurs pistes, dont deux tiennent debout dès aujourd'hui pour un projet qui pousse déjà vers un cache : une pull request relue en cliquant sur les artefacts que la CI a réellement produits, sans cloner ni reconstruire ; et un rapport de bug qui transporte son environnement plutôt que de décrire « ça marche chez moi ». S'y ajoutent la documentation exécutable — un tutoriel qui épingle la version exacte de l'outil qu'il enseigne — et l'archéologie logicielle.

À retenir

Le code est sur github.com/fzakaria/trynix. La démonstration impressionne, mais l'enseignement est ailleurs : un cache Nix correctement configuré en CORS faisait déjà du navigateur un client Nix légitime. Il ne manquait qu'un endroit où exécuter les binaires.

Source : fzakaria