Guix est un gestionnaire de paquets, c’est-à-dire une collection d’outils logiciels qui automatise le processus d'installation, de mise à jour, de configuration et de suppression des logiciels sur le système d’exploitation.
Références :
Comme le travail sur des clusters implique de partager les ressources avec de nombreux autres utilisateurs, chacun ayant des besoins et des contextes d’utilisation différents, l’utilisation d’un outil permettant de gérer l’installation de logiciels spécifiques est obligatoire.
Guix n’est qu’un des candidats pour répondre à cette exigence, parmi d’autres comme Nix, les systèmes de conteneurs ou modules.
Convaincu ? Essayons-le et voyons quelques exemples.
A travers ce tutoriel, vous apprendrez les bases de Guix, les bonnes pratiques et comment configurer correctement vos environnements. Ceci est probablement suffisant pour les besoins de la plupart des utilisateurs de GRICAD.
Si vous êtes pressé, vous pouvez passer directement à la Guix cheat sheet.
À titre d’exemple, considérons ces deux cas d’utilisation :
installer et utiliser une version spécifique de Python avec quelques paquets supplémentaires.
installer les compilateurs GNU et la bibliothèque fftw
Dans ce tutoriel, nous allons détailler toutes les actions nécessaires à la mise en place de ces deux “environnements de travail”.
Nous vous encourageons à essayer et à exécuter toutes les commandes ci-dessous.
Tout d’abord, toute session où guix est requis doit commencer par la commande suivante :
$ source /applis/site/guix-start.sh
Il introduit ‘guix’ et d’autres commandes dans l’environnement actuel et s’assure que tout est correctement configuré pour l’utilisation de Guix.
N’oubliez pas d’ajouter cette ligne à vos scripts oar !
N’ajoutez pas cette ligne dans votre bashrc, profile ou similaire, vous vous retrouveriez avec des effets secondaires inattendus.
Lors du premier appel de ‘guix-start.sh’ sur un cluster, certaines actions en arrière-plan vont se produire, principalement pour installer et mettre à jour guix sur votre compte. Cela peut prendre un certain temps, soyez patient …
En supposant que nous ayons besoin de Python3, avec numpy et matplotlib et l’éditeur de texte emacs, regardons ce qui est disponible et cherchons certains des paquets nécessaires, par exemple :
$ guix search emacs
name: emacs
version: 26.3
outputs: out
systems: x86_64-linux i686-linux
dependencies: acl@2.2.53 alsa-lib@1.2.2 dbus@1.12.16 giflib@5.2.1 gnutls@3.6.12 gtk+@3.24.20 imagemagick@6.9.11-11 libice@1.0.10 libjpeg-turbo@2.0.4
+ libotf@0.9.16 libpng@1.6.37 librsvg@2.40.21 libsm@1.2.3 libtiff@4.1.0 libx11@1.6.9 libxft@2.3.3 libxml2@2.9.10 libxpm@3.5.13 m17n-lib@1.8.0
+ mailutils@3.9 ncurses@6.2 pkg-config@0.29.2 texinfo@6.7 zlib@1.2.11
location: gnu/packages/emacs.scm:76:2
homepage: https://www.gnu.org/software/emacs/
license: GPL 3+
synopsis: The extensible, customizable, self-documenting text editor
description: GNU Emacs is an extensible and highly customizable text editor. It is based on an Emacs Lisp interpreter with extensions for text
+ editing. Emacs has been extended in essentially all areas of computing, giving rise to a vast array of packages supporting, e.g., email, IRC and
+ XMPP messaging, spreadsheets, remote server editing, and much more. Emacs includes extensive documentation on all aspects of the system, from basic
+ editing to writing large Lisp programs. It has full Unicode support for nearly all human languages.
relevance: 33
...
En fonction des éléments recherchés, la sortie peut être assez longue. L’utilisation de ‘grep’ ou de regexp peut être une solution, mais vous feriez mieux de vérifier directement dans la liste en ligne des paquets guix.
Vous y trouverez les paquets suivants : python, python-numpy et python-matplotlib.
Une fois que les noms des paquets requis sont clairs, le processus d’installation peut commencer :
$ guix install emacs python@3 python-numpy python-matplotlib
... # MIGHT BE QUITE LONG ...
Notez le @3 pour spécifier la version requise.
Voilà, python3 est disponible sur tous les nœuds, vous pouvez l’essayer sur n’importe quel nœud du cluster :
$ python3
Python 3.8.2 (default, Jan 1 1970, 00:00:01)
[GCC 7.5.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>import numpy as np
$ which python3
/home/perignon/.guix-profile//bin/python3
Avant toute chose, n’oubliez pas de sourcer /applis/site/guix-start.sh à chaque nouvelle session de terminal !
Sinon, votre environnement guix ne sera pas disponible.
Là, vous avez certainement remarqué que python a été installé dans $HOME/.guix-profile, comme tous les autres paquets installés ci-dessus.
$HOME/.guix-profile est l’endroit par défaut où guix va tout installer, avec l’organisation standard sur les systèmes unix, bin pour les binaires, lib pour les bibliothèques et ainsi de suite.
$ ls $HOME/.guix-profile/
bin etc include lib libexec manifest sbin share
$ ls $HOME/.guix-profile/lib
...
libpython3.so
...
$ ls $HOME/.guix-profile/bin
...
python3 emacs
...
En effet, votre .guix-profile ne contient que des liens symboliques vers des fichiers dans /gnu/store.
Soit quelqu’un a déjà installé le même paquet sur le cluster, soit vous êtes le premier.
Dans le premier cas, Guix crée simplement les liens dans le chemin de votre profil.
Dans le second cas, Guix installe d’abord le paquet dans /gnu/store et crée ensuite les liens dans le chemin de votre profil.
La commande suivante répertorie tous les paquets installés dans le profil par défaut :
$ guix package -I
glibc-locales 2.29 out /gnu/store/03nvilh2x4z07dxv7h13gh986vvgpnsf-glibc-locales-2.29
hello 2.10 out /gnu/store/a462kby1q51ndvxdv3b6p0rsixxrgx1h-hello-2.10
emacs 26.3 out /gnu/store/lza7sccqgrv313gbrb9j8f7lgn49irdn-emacs-26.3
python 3.8.2 out /gnu/store/fa1zp10w2sb7gdzk1fwqhr106mpq3lc7-python-3.8.2
python-numpy 1.17.3 out /gnu/store/rr1winibssxgxsf49f6rvdfdigifpviz-python-numpy-1.17.3
python-matplotlib 3.1.2 out /gnu/store/gsjhzr1xy96hz8wvaa8mblvv2niqnkwy-python-matplotlib-3.1.2
Notez glibc-locales et hello, toujours installés par défaut, et les autres paquets que vous avez demandés.
Passons au deuxième cas d’utilisation, un environnement de travail avec des compilateurs gnu et la bibliothèque fftw.
Le but est d’installer les compilateurs GNU et la bibliothèque à un endroit précis.
Les compilateurs sont généralement disponibles dans le paquetage ‘gcc-toolchain’ et la recherche guix vous indiquera le nom du paquetage fftw.
Installons-les dans un nouveau profil appelé ‘gcc-fftw’.
L’utilisation des profils dans guix est assez simple et est gérée par l’option ‘-p’ de la plupart des commandes guix. Cette option indique à guix d’utiliser un profil spécifique (qui n’est rien d’autre qu’un chemin vers l’endroit où les choses doivent être sauvegardées) et doit être suivie du chemin complet (absolu) vers le profil. Pour simplifier les choses, une variable d’environnement spécifique est définie par défaut pour tous les utilisateurs, GUIX_USER_PROFILE_DIR, et doit être utilisée :
$ guix install -p $GUIX_USER_PROFILE_DIR/gcc_fftw gcc-toolchain fftw
The following packages will be installed:
gcc-toolchain 10.1.0
fftw 3.3.8
...
La variable d’environnement GUIX_USER_PROFILE_DIR est l’endroit où tous les profils guix doivent être sauvegardés. Ceci est obligatoire pour assurer la disponibilité des logiciels sur Dahu, Bigfoot et Luke, entre autres.
$ echo $GUIX_USER_PROFILE_DIR
/var/guix/profiles/per-user/perignon
$ ls $GUIX_USER_PROFILE_DIR
...
current-guix gcc_fftw
...
Nous pouvons maintenant vérifier la liste des paquets installés dans le profil par défaut,
$ guix package -I
glibc-locales 2.29 out /gnu/store/03nvilh2x4z07dxv7h13gh986vvgpnsf-glibc-locales-2.29
hello 2.10 out /gnu/store/a462kby1q51ndvxdv3b6p0rsixxrgx1h-hello-2.10
emacs 26.3 out /gnu/store/lza7sccqgrv313gbrb9j8f7lgn49irdn-emacs-26.3
python 3.8.2 out /gnu/store/fa1zp10w2sb7gdzk1fwqhr106mpq3lc7-python-3.8.2
python-numpy 1.17.3 out /gnu/store/rr1winibssxgxsf49f6rvdfdigifpviz-python-numpy-1.17.3
python-matplotlib 3.1.2 out /gnu/store/gsjhzr1xy96hz8wvaa8mblvv2niqnkwy-python-matplotlib-3.1.2
$
et dans le nouveau profil, gcc_fftw
$ guix package -p $GUIX_USER_PROFILE_DIR/gcc_fftw -I
gcc-toolchain 10.1.0 out /gnu/store/q9vv9s1jj7hw5igckncysadn6gmccfxm-gcc-toolchain-10.1.0
fftw 3.3.8 out /gnu/store/85b70gpbs9issc1gbdcvnwb8pip6ihlk-fftw-3.3.8
Et le compilateur par défaut …
$ which gcc
/usr/bin/gcc
$ gcc --version
gcc (Debian 8.3.0-6) 8.3.0
est toujours celui qui est installé par défaut sur le système, ce qui n’est pas ce que nous voulons !
Le chemin vers le nouveau profil guix (et donc gcc) doit être ajouté à la variable d’environnement. Pour gérer cela, nous fournissons une fonction refresh_guix gcc_fftw
permettant d’activer ou de rafraîchir un profil spécifique :
$ refresh_guix gcc_fftw
Activate profile /var/guix/profiles/per-user/stagiaire11/gcc_fftw
The following packages are currently installed in /var/guix/profiles/per-user/stagiaire11/gcc_fftw:
gcc-toolchain 10.1.0 out /gnu/store/q9vv9s1jj7hw5igckncysadn6gmccfxm-gcc-toolchain-10.1.0
fftw 3.3.8 out /gnu/store/85b70gpbs9issc1gbdcvnwb8pip6ihlk-fftw-3.3.8
$ which gcc
/var/guix/profiles/per-user/stagiaire11/gcc_fftw/bin/gcc/usr/bin/gcc
$ gcc --version
gcc (GCC) 10.1.0
C’est ce que nous attendons !
Supposons maintenant que nous ayons besoin d’une autre version des compilateurs gnu, mais sans supprimer la version actuelle.
C’est très facile avec guix, dans un nouveau profil, par exemple gcc9_fftw
# install and activate the profile
$ guix install -p $GUIX_USER_PROFILE_DIR/gcc9_fftw gcc-toolchain@9 fftw
...
$ refresh_guix gcc9_fftw
Activate profile /var/guix/profiles/per-user/stagiaire11/gcc9_fftw
The following packages are currently installed in /var/guix/profiles/per-user/stagiaire11/gcc9_fftw:
gcc-toolchain 9.3.0 out /gnu/store/4s25r2krb2x5c904gbzv0jkj2fyi5hnx-gcc-toolchain-9.3.0
fftw 3.3.8 out /gnu/store/85b70gpbs9issc1gbdcvnwb8pip6ihlk-fftw-3.3.8
$ gcc --version
gcc (GCC) 9.3.0
# and switch back easily to the other profile:
$ refresh_guix gcc_fftw
Activate profile /var/guix/profiles/per-user/stagiaire11/gcc_fftw
The following packages are currently installed in /var/guix/profiles/per-user/stagiaire11/gcc_fftw:
gcc-toolchain 10.1.0 out /gnu/store/q9vv9s1jj7hw5igckncysadn6gmccfxm-gcc-toolchain-10.1.0
fftw 3.3.8 out /gnu/store/85b70gpbs9issc1gbdcvnwb8pip6ihlk-fftw-3.3.8
$ gcc --version
gcc (GCC) 10.1.0
Enfin, vous pouvez facilement obtenir une liste de tous vos profils actuels avec
$ guix package --list-profiles
/home/perignon/.config/guix/current
/var/guix/profiles/per-user/perignon/gcc9_fftw
/var/guix/profiles/per-user/perignon/gcc_fftw
/home/perignon/.guix-profile
Notez les répertoires current et guix-profile, qui ne doivent pas être supprimés.
current est l’endroit où guix est installé et guix-profile est votre profil par défaut.
Pour supprimer un paquet d’un profil, simplement :
$ guix remove -p $GUIX_USER_PROFILE_DIR/gcc9_fftw fftw
# or from default profile
$ guix remove emacs
et pour supprimer un profil, il suffit de supprimer le répertoire concerné, par exemple :
$ rm -rf $GUIX_USER_PROFILE_DIR/gcc9_fftw
Le tutoriel est terminé. Vous devriez être en mesure d’utiliser guix pour créer et gérer vos propres environnements de travail.
Voici un résumé des choses et commandes de base à connaître.
Ceci doit être exécuté au début de toute session où Guix est requis.
$ source /applis/site/guix-start.sh
guix search <name>
Très verbeux … Il pourrait être plus facile de vérifier les paquets en ligne : https://www.gnu.org/software/guix/packages/
Nous vous recommandons vivement de définir et de séparer correctement vos environnements de travail en utilisant les profils guix.
# In/from default profile
$ guix install <package-name>
$ guix remove <package-name>
# In/from a given profile
$ guix install -p $GUIX_USER_PROFILE_DIR/<profile-name> <package-name>
$ guix remove -p $GUIX_USER_PROFILE_DIR/<profile-name> <package-name>
$ guix package --list-profiles
# Default profile
$ refresh_guix
# A given profile
$ refresh_guix <profile_name>
‘profile_name’ doit être un répertoire existant dans $GUIX_USER_PROFILE_DIR.
Guix utilise un dépôt git pour gérer tous les paquets. Pour maintenir votre installation de Guix à jour et avoir accès aux dernières versions des logiciels et des bibliothèques, vous devez exécuter régulièrement la commande suivante :
$ guix pull
# --> pull from git repository
et si nécessaire, mettre à jour tous les paquets de votre (vos) profil(s)
guix package -u
# update all the packages of the default profile to their last available version.
# or for a specific profile:
guix package -p $GUIX_USER_PROFILE_DIR/<profile_name> -u
Vous devez être très prudent lorsque vous exécutez update (-u). Comme tous les paquets seront mis à jour, vous devez vous assurer que vous avez réellement besoin des dernières versions de toutes les bibliothèques.
Pour certaines raisons (test, recettes ‘locales’ de guix …) vous pouvez vouloir ajouter un autre dépôt de référence (un canal) pour guix. Vous pourrez y écrire des “recettes” (fichiers scm) qui seront utilisées par guix pour installer certains paquets spécifiques.
Par exemple, vous pouvez facilement créer un nouveau projet sur https://gricad-gitlab.univ-grenoble-alpes.fr pour y stocker vos recettes. Ce projet devra être public.
Pour le faire prendre en compte sur les clusters Gricad, suivez ces étapes :
.config/guix/channels.scm
;; Add my personal packages to those Guix provides.
(cons (channel
(name 'some_name)
(url "some_url"))
%default-channels)
some_url étant l’addresse de votre dépôt.
guix pull
Détails : https://www.gnu.org/software/guix/manual/en/html_node/Channels.html#Channels
Regardez par exemple le canal gricad_guix_packages
avec le fichier channels.scm
:
;; Add my personal packages to those Guix provides.
(cons (channel
(name 'gricad-guix-packages)
(url "https://gricad-gitlab.univ-grenoble-alpes.fr/bouttiep/gricad_guix_packages.git"))
%default-channels)
Ensuite, remarquez qu’une traction mettra à jour deux canaux : le vôtre et le canal standard.
$ guix pull
Updating channel 'gricad-guix-packages' from Git repository at 'https://gricad-gitlab.univ-grenoble-alpes.fr/bouttiep/gricad_guix_packages.git'...
Updating channel 'guix' from Git repository at 'https://git.savannah.gnu.org/git/guix.git'...
Quelque chose ne va pas avec votre guix ? Trop de profils ?
Quelle que soit la raison, si vous voulez supprimer toute votre configuration guix et redémarrer à partir d’une installation propre, exécutez simplement :
$ guix_remove_user_conf
et ensuite, pour recréer proprement votre environnement, la commande habituelle fera l’affaire :
$ source /applis/site/guix-start.sh