Gérer votre environement avec Guix

Qu’est-ce que Guix ?

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 :

Pourquoi utiliser Guix sur les clusters GRICAD ?

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.

  • Guix vous permettra de construire vos propres environnements de manière très flexible sans l’aide des administrateurs du cluster (c’est à dire sans être root).
  • Guix vous permettra de créer différents contextes de travail (ou “profils”) et de passer facilement de l’un à l’autre.
  • Guix vous permettra d’écrire votre propre “recette” pour votre logiciel, afin de fournir aux autres utilisateurs un moyen très simple d’installer et d’utiliser votre propre bibliothèque.
  • Grâce à Guix et au concept des profils, vous pouvez installer des logiciels disponibles sur tous les nœuds de Luke et de Dahu, en une seule fois.

Convaincu ? Essayons-le et voyons quelques exemples.

Petit tutoriel Guix

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.

Démarrer la session guix

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 …

Recherchez des paquets

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.

Installez des choses

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.

Vérifier ce qui est actuellement installé

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.

Gestion d’environnements de travail et de profils spécifiques

Installer des paquets dans un profil

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 !

Passer d’un profil à l’autre

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

Lister tous vos profils

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.

Suppression d’un paquet ou d’un profil

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

Guix cheat sheet, conseils et bonnes pratiques

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.

Démarrer une session guix

Ceci doit être exécuté au début de toute session où Guix est requis.

$ source /applis/site/guix-start.sh

Rechercher un paquet

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/

Installation et suppression de paquets dans les profils

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>


Lister vos profils existants

$ guix package --list-profiles

Activer un profil et lister son contenu

# Default profile
$ refresh_guix

# A given profile
$ refresh_guix <profile_name>

‘profile_name’ doit être un répertoire existant dans $GUIX_USER_PROFILE_DIR.

Commandes de maintenance

Maintenez votre référentiel à jour

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.

Ajouter un nouveau canal (i.e. un dépôt de référence pour récupérer les recettes guix)

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 :

  1. sur la frontale de chaque cluster cible, editez un fichier .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.

  1. exécutez ensuite cette commande pour chaque cluster :
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'...

Réinitialisez votre conf guix à partir de zéro

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

Liens supplémentaires