149 views
# Guix : un outil pour les remplacer tous :::info Cet article, en cours de rédaction, est placé pour la licence CC BY SA Auteur : Andréas Livet ::: [TOC] ## Introduction Je suis tombé très récemment sur [une dépèche linuxfr](https://linuxfr.org/news/gnu-guix-version-un-point-zero) annonçant la sortie de la version 1.0 du gestionnaire de paquet [Gnu Guix](https://www.gnu.org/software/guix/) et dans la foulée de la distribution GuixSD et j'ai littérallement pris une claque ! Comme me l'a fait [remarquer quelqu'un dans les commentaire](https://linuxfr.org/news/gnu-guix-version-un-point-zero#comment-1773244), le projet n'est pas tout jeune (7 ans de mémoire), mais c'est passé à travers des mailles de mon filet de veille techno tout ce temps. Je compte bien rattraper le retard car cet outil est tout bonnement hallucinant et je vous invite vraiment à creuser les différentes sources que vous trouverez car, que vous soyez admin sys., devops, développeurs ou simple amateurs de distributions libres, Guix est fait pour vous ! Cet article est une tentative, sans doute très imparfaite, de montrer l'ensemble des cas où Guix remplace avantagement d'autres outils. Vous allez voir, les champs d'application sont vastes ! Dans l'histoire de l'informatique, des outils/approches, sont venues totalement boulverser nos manières de voir les choses et de travailler, Guix en fait partie. ## Installation Tout d'abord, j'ai installé Guix très facilement en suivant [les instructions et l'installeur officiel](https://www.gnu.org/software/guix/manual/en/html_node/Binary-Installation.html). Ça se résume à : ```bash curl https://git.savannah.gnu.org/cgit/guix.git/plain/etc/guix-install.sh | sudo bash ``` Et à suivre les instructions à l'écran. ## Guix pour remplacer les gestionnaires de paquets Guix étant un gestionnaire de paquet avant tout, il est tout naturel qu'il puisse constitué un remplaçant des autres gestionnaires de paquets existants. Si, comme moi (ou comme Brien Lunduke, note : retrouver la vidéo Linux Sucks sur peertube), vous trouviez qu'il y a déjà trop de fragmentation dans le desktop et qu'il faudrait juste choisir une bonne fois pour toute un format de paquet (par exemple les `.deb`) et un gestionnaire de paquet (par exemple `apt`) et ainsi avoir une compatibilité entre les distros, Guix pourrait être un bon candidat ! En effet, Guix a de nombreux avantages par rapport à ses concurrents : * Il est transactionnel, ce qui signifie que si l'installation des paquets n'aboutie pas pour une raison ou pour une autre (coupure d'alimentation), le système n'est pas impacté * Il permet d'avoir plusieurs versions d'un même logiciels installées sur la même machine sans aucun conflit * Il permet d'installer les paquets sans avoir les droits d'administrations (oubliez `sudo`) * Il est possible de revenir, à tout moment, à un état antérieur du système et donc être sûr de retrouver un état fonctionnel si jamais une mise à jour n'a pas fonctionnée. Guix à d'autres avantages, mais déjà ces 4 là le rendent important. ### Guix pour remplacer `apt` Voici par exemple comment je remplace progressivement l'utilisation de `apt` (et `snap`, voir plus bas) sur mon système Xubuntu 18.04. #### Avant toute choses : gestion des locales Commes les paquets Guix ne sont pas forcément compilés avec la même libc que les paquets de notre système d'exploitation, il faut en premier lieu installer le paquet responsable de la gestion des locales de la libc, comme c'est précisé [dans la doc](https://www.gnu.org/software/guix/manual/en/html_node/Application-Setup.html#Locales) `guix install glibc-locales` Puis rajouter cette variable d'environnement à tous vos fichiers de session (`.bashrc`, `.xsessionrc` etc) : `export GUIX_LOCPATH=$HOME/.guix-profile/lib/locale` Sans cela, vous risquez d'avoir, [comme moi, ce genre de problème](https://issues.guix.info/issue/36180) #### Installation de paquets Après avoir installer guix (voir plus haut). Installer un paquet avec Guix est une opération très simple. J'ai commencé par remplacer certains paquet de ma distribution par des version plus à jour. Par exemple (sans avoir les droits administrateurs): `guix install libreoffice` Qui est un alias de : `guix package -i libreoffice` :::warning **Attention** : La première installation de paquet peut prendre du temps (et de la place !) car Guix va chercher toutes les dépendances nécessaires à toutes les dépendances du paquet vu qu'il ne va utiliser aucunes dépendances installées sur le système. ::: :::info Vous verrez, certains paquets (ou patches) sont même compilés sur votre machine, mais dans l'ensemble, beaucoup de binaires précompilés (appelé substitus) [sont disponibles](https://www.gnu.org/software/guix/packages/) (vois l'atributs "builds" dans la description des paquets). ::: Toutes les dépendances téléchargées se trouvent dans le dossier `/gnu/store`. Voici un petit bout de mon dossier : ``` $ ls --group-directories-first /gnu/store | less 01xnzx1q3k9z3xmhly0fa5ki8hp8l99s-libmwaw-0.3.15 023gvzf7gqbp61jfpc0674krwv7yiyza-mariadb-10.1.38 02iklp4swqs0ipxhg5x9b2shmj6b30h1-binutils-2.31.1 02k245xy33cvcnr8vm3lagm9zmb1s2wa-grep-3.1 03bgmiwcr3v5yh6psgh9dvg4qihb7qa0-xdg-desktop-database 03hd5wljl5yirh33czpi738ckq16zyp5-xdg-mime-database 04h27h0myyksngxx8imv416n4iwsiv8m-hunspell-1.7.0 04vqghzmpqzxpd94h1q931xpmazp5s7g-libgc-7.6.6 057dna3nwy84zdvfqss8vbgx1pzkdc2l-libungif-4.1.4 05zlxc7ckwflz56i6hmlngr86pmccam2-pcre-8.42 09x4p4ywz39xzy42kmscfi2nnhwjgybd-curl-7.64.0 0cnnj7kvggda2p12mlmxawz3ni9w5rwa-xcb-util-0.4.0 0fcp0xw1l1r2v42j4kdmn9ra3r7bd45v-gtk-im-modules 0fnyf3043x767xfm6gski5h1576q8wsn-glib-schemas 0h9x3hqqh4fx52735a7mykqm7mdkqnf4-libgc-7.6.6 0j6sz3bk4chqc8pgfv0fsn6byarwq4df-openldap-2.4.46 0j7xd8b63wv6hfssbacw28bj7rsbx0sk-packages 0ja63438w88gil4lxbpsgc5chmyiqhn6-openldap-2.4.46 0jif6gjzhxcg86q9qb7cjbcxdy8sacsn-python2-pygtk-2.24.0 0k450nckm9yp9vlbykvrb7pqp2njm3c4-libxv-1.0.11 0q9pq9flr76rh4bv2524niknknnl2kvq-glib-2.56.3 0r1ihh22jhbii0n3xa4isgscbrynydfr-module-import 0wqgmqnlpr8pzvx4skqdgczym8384fbb-shishi-1.0.2 ``` Comme vous pouvez le voir, toutes les dépendances se trouvent ici. Et dans chaque dépendance se trouve une arborescence propre. Ex : ``` $ tree -d /gnu/store/01xnzx1q3k9z3xmhly0fa5ki8hp8l99s-libmwaw-0.3.15/ /gnu/store/01xnzx1q3k9z3xmhly0fa5ki8hp8l99s-libmwaw-0.3.15/ |-- bin |-- include | `-- libmwaw-0.3 | `-- libmwaw |-- lib | `-- pkgconfig `-- share `-- doc |-- libmwaw | `-- html `-- libmwaw-0.3.15 ``` Se trouve aussi maintenant dans mon répertoire personnel un dossier `.guix-profile` dont voici l'arborescence : ```bash tree -L 1 /home/dede/.guix-profile ~/.guix-profile |-- bin |-- etc |-- include |-- lib |-- libexec |-- manifest |-- sbin -> /gnu/store/8k4pnixpz73kxvxbjqajgbprjjmmgpxy-util-linux-2.32.1/sbin `-- share ``` Le dossier `bin` contient des liens symboliques vers les binaires présents dans `/gnu/store`. On a ainsi un fonctionnement très flexible et je peux choisir très facilement à quel version d'un logiciel attribuer tel ou tel alias. Le fichier qui nous intéresse est `manifest`, il décrit toutes les version des logiciels installés et où ils se trouvent : ```bash (manifest (version 3) (packages (("tree" "1.8.0" "out" "/gnu/store/x5xb40q502s7pnqk9lmsnpc5vpsm1r8r-tree-1.8.0" (propagated-inputs ()) (search-paths ()) (properties)) ("recutils" "1.8" "out" "/gnu/store/wzk023ls4f7dq4mcc3kc86vskhw804n1-recutils-1.8" (propagated-inputs ()) (search-paths ()) (properties)) ("emacs" "26.2" "out" "/gnu/store/b38pn0gnj4jsrf79lg4kr80rn5kaim0q-emacs-26.2" (propagated-inputs ()) (search-paths [...] ``` #### Utilisation des paquets Pour utiliser les paquets installés par Guix, quand on est en ligne de commande, il suffit de rajouter le dossier `bin` à notre `$PATH` : ```bash export PATH="/home/dede/.guix-profile/bin${PATH:+:}$PATH" ``` Pour un usage perein, vous pouvez rajouter cette ligne à votre `.bashrc` si vous utilisez `bash` ou `.zshrc` si vous êtes sous `zsh` (): ```bash # Guix # le fichier profile contient l'ajout de `bin` au `$PATH` GUIX_PROFILE="$HOME/.guix-profile" ; \ source "$HOME/.guix-profile/etc/profile" ``` Maintenant, quand vous tapper par exemple : `libreoffice` C'est la version Guix qui se lance et non plus celle installée sur votre système via apt et cela, sans aucune interference. Si ce n'est les fichiers de configuration qui se trouvent dans votre HOME qui seront partagées (voir plus bas pour le mode bac à sable si vous voulez éviter le partage des fichiers de conf). Il est aussi possible de modifier les lanceurs graphique en changeant simplement la commande d'éxecution. Ex avec libreoffice Writer, avant j'avais : `libreoffice --writer %U` Et j'ai simplement mis ça à la place: `/home/dede/.guix-profile/bin/libreoffice --writer %U` Après m'être assuré que le paquet Guix fonctionnait bien, j'ai pu faire une désinstallation du paquet installé via `apt`. Je fais ça petit à petit avec tous les logiciels que j'utilise. Ca me permet en quelque sorte d'avoir une "rolling release" tout en gardant le système auquel je suis habitué. C'est une introduction tout en douceur à Guix :). #### Désinstallation des paquets Il est bien sur possible de désinstaller un paquet très facilement via : ```bash guix remove libreoffice ``` alias de : ```bash guix package -r libreoffice ``` :::info *Note* : Après un remove, guix garde tout de même les fichiers dans `/gnu/store` mais supprime les liens symboliques dans votre `guix-profile`. Pour faire une vraie suppression, il faut faire un `guix gc` qui supprime tous les paquets inutilisées. Mais après quelques tests, certains paquets supprimés restent quand même, je ne sais pas pourquoi. ::: #### Mise à jour des paquets Pour mettre à jour tous les paquets en même temps, il suffit de tapper : `guix upgrade` ou `guix package -u` Si je veux simplement mettre à jour libreoffice par exemple je peux faire : `guix upgrade libreoffice` ## Guix pour remplacer les environements de développement Si vous êtes développeurs, vous savez qu'il est nécessaire d'avoir les dépendances spécifiques à un projet accessible depuis ce que l'on appelle souvent un environnement virtuel. En python, on a `virtualenv` et `pyenv`, en ruby `rvm`, en node `nvm` etc. Qui nous permettent de gérer les différentes version de nos langages de programmation. Bien souvent, il y a d'autres outils qui permettent d'installer les dépendances nécessaire à notre projet, soit dans un dossier à part, soit directement dans un dossier `vendor` de notre projet. La encore, chaque langage a ses spécificités, python a `pip` et son système assez simple de dépendances via un simple fichier texte nommé le plus souvent `requirements.txt`, Ruby a `gems` mais à d'autres systèmes plus haut niveau comme `bundle`, Node a bien sûr `npm` (et aussi maintenant `yarn` qui fait la même chose en mieux)et son `package.json` qui fait coulé beaucoup d'encre (enfin surtout le gouffre abyssal qu'est `node_modules`), Php à `composer` et j'en passe et des meilleurs. Bien entendu, tous ces outils n'ont pas les mêmes logiques, ni la même syntaxe de configuration, ni la même efficacité en terme de gestion de performance ou de la place qu'occupe les dépendances sur le disque. Et si une optimisation est réalisé pour un outil, les autres langage n'en bénécifierons pas... Vous vous rendez compte que tous ces langages on passé un temps fou a implémenter les mêmes logiques (parfois avec plus ou moins de brio) simplement pour palier les limitations de nos distributions ? S'il était facile d'avoir plusieurs versions d'un même paquet installer côté à côte dans le système, de pouvoir créer des environnement virtuel (des sessions shell) choissant tel ou tel paquet, on aurait pas besoin de tous ces outils hétérogène ! Grâce à Guix, vous allez pouvoir remplacer tous ces outils par ceux de votre système d'exploitation et cela avec un seul langage ! Articles intéressants : https://trivialfis.github.io/linux/2018/06/10/Using-guix-for-development.html https://dthompson.us/ruby-on-guix.html https://blogs.rdoproject.org/2015/10/guix-tox-a-functional-version-of-tox/ ### Sous python Par exemple, j'ai un projet qui utilise les paquets pip définis dans un fichier `requirements.txt` : ``` lxml==4.3.3 PyYAML==5.1 nose==1.3.7 jinja2-cli==0.7.0 click==7.0 jinja2==2.10 Pillow==6.0.0 ``` Trouver les équivalent Guix des paquets pip via `guix search` Exemple `guix search yaml | grep python` me donne : ``` name: python2-pyyaml location: gnu/packages/python-xyz.scm:2212:2 name: python-pyyaml location: gnu/packages/python-xyz.scm:2212:2 name: python2-ruamel.yaml dependencies: python2-pytest@3.8.0 name: python2-pyaml dependencies: python2-pyyaml@3.13 python2-unidecode@1.0.23 location: gnu/packages/python-xyz.scm:10184:2 description: pyaml is a PyYAML based python module to produce pretty and name: python-ruamel.yaml dependencies: python-pytest@3.8.0 name: python-pyaml dependencies: python-pyyaml@3.13 python-unidecode@1.0.23 ``` Bon, je ne sais pas pourquoi il y un paquet `python-pyyaml` (avec 2 y) `python-pyaml` mais je pense que le bon est `python-pyyaml`. #### Que faire pour les paquets manquants ? Guix ne contient pas encore tous les paquets `pip` On peut les créer soit même ou par exemple mettre des version à jour. Voici un exemple de module pip que j'ai mis à jour : Voici un autre exemple plus compliqué d'outil python en ligne de commande que j'ai rajouté. Cette procédure est assez mal documentée. Il faut créé un module et le mettre dans une structure de fichier `/gnu/packages` Et ensuite installer le programme avec l'option `-L` : `guix package -L . -i python-jinja2-cli` Sans l'aide des dev sur le canal IRC #guix je n'aurai pas trouvé ! Après je peux accéder à mon exectuable via la ligne de commande : `jinja2` Et je peux bien voir qu'il a été installé via guix : ``` $ guix package -I python-jinja2-cli python-jinja2-cli 0.7.0 out /gnu/store/p3n...-python-jinja2-cli-0.7.0 ``` Et : ``` $ which jinja2 /home/dede/.guix-profile/bin/jinja2 ``` Pour lancer l'environnement de développement avec les paquets locaux il faut aussi utiliser l'option `-L` (je conseil l'option verbosity qui permet d'avoir plus de retours en cas d'erreur): `guix environment -L . --verbosity=2 --manifest=./guix-manifest.scm ` #### Que faire quand sa version n'est pas présente ? #### Comment retrouver son prompt et l'améliorer ? Dans le guide, il précise comment on peut changer son prompt mais j'aimerai récupérer mes anciennes config et juste rajouter un petit truc après. #### Que faire quand on veut importer tout un arbre de dépendance avec des versions spécifiques ? ## Guix pour remplacer les technologies de "contenerisation" https://www.gnu.org/software/guix/blog/2017/creating-bundles-with-guix-pack/ https://www.gnu.org/software/guix/manual/en/html_node/Invoking-guix-environment.html