Created: 2019-06-21 ven. 06:30
pierre.gambarotto AT math.univ-toulouse.fr
=> à la recherche d'une solution !
Reproductibilité ?
Pour démontrer la validité d'un résultat scientifique:
Science reproductible => Environnement reproductible
exemple de guile, empaqueté par debian:
/usr/bin
, /usr/lib
, /var
apt-get install guile
description => spécifique au gestionnaire de paquetage
construction => spécifique au logiciel
/usr/bin
, /usr/lib
…À cause de la gestion du FHS ! /usr/bin, /usr/lib …
La gestion de cet espace commun est complexe
L'état général du système dépend
=> idée globale: isoler une installation du reste de la distribution
À partir du graphe des dépendances
bash = f(readline, ncurses) readline = g(ncurses) ncurses = h(pkg-config) f,g,h =~ wget puis ./configure; make; make install
/gnu/store
-nom_logiciel-version
$ ls -ald /gnu/store drwxrwxr-t 757 root guixbuild 598016 juin 20 05:13 /gnu/store
guix build bash # build from source guix package --install=bash # try to download, build if not found
guix build/package -i bash # => /gnu/store/34vqyy26q...-bash-4.4.12 # 34vqyy26q... : hash de toutes les dépendances
Conséquence:
guix permet à un utilisateur:
$ guix install bash substitute: mise à jour des substituts depuis « https://ci.guix.info »... 100.0% Le paquet suivant sera installé : bash 4.4.23 /gnu/store/qn1ax1fkj16x280m1rv7mcimfmn9l2pf-bash-4.4.23 substitute: mise à jour des substituts depuis « https://ci.guix.info »... 100.0% La dérivation suivante sera compilée : /gnu/store/iz3jjpmm7z849142lybmjqy97d9y50lg-profile.drv Les crochets suivants seront compilés : /gnu/store/fgrj408cq39s48pmhvin9am1ngf25nfy-manual-database.drv /gnu/store/3lvvsja4ijg8jv9716hrwgbmj2pdgkqb-gtk-icon-themes.drv /gnu/store/5b0x42hrcmcglkdsc2cqa72j13ky3xin-fonts-dir.drv /gnu/store/72mc0jkp4xm0f23rc55aakdf47if1k6z-gtk-im-modules.drv /gnu/store/9132wsyg7s89jw6j6djr304r4r6gpq7m-xdg-mime-database.drv /gnu/store/98knvgqcbl46wn64nflza1787a9l9mcz-glib-schemas.drv /gnu/store/ixvviv4v7a0950k25ani16f0n1bv76nf-ca-certificate-bundle.drv /gnu/store/jga3lq39vw3w4w9zaq90xzvcp6xsd332-xdg-desktop-database.drv /gnu/store/vx2bwap1bfy22iifaz3l5wmfnvq5dak5-info-dir.drv
construction de l'ensemble des certificats des AC… construction du répertoire des polices… génération du cache de schémas GLib… création du cache des thèmes d'icônes GTK+… construction des fichiers de cache pour les méthodes d'entrée GTK+… construction du répertoire des manuels Info… construction de la base de données des pages de manuel… construction du cache des fichiers desktop du XDG… construction de la base de données MIME du XDG… construction de /gnu/store/iz3jjpmm7z849142lybmjqy97d9y50lg-profile.drv... 13 paquets dans le profile Il pourrait être nécessaire de définir les variables d'environnement suivantes : export PATH="/home/gamba/.guix-profile/bin${PATH:+:}$PATH" export BASH_LOADABLES_PATH="/home/gamba/.guix-profile/lib/bash${BASH_LOADABLES_PATH:+:}$BASH_LOADABLES_PATH" export GUILE_LOAD_PATH="/home/gamba/.guix-profile/share/guile/site/2.2${GUILE_LOAD_PATH:+:}$GUILE_LOAD_PATH" export GUILE_LOAD_COMPILED_PATH="/home/gamba/.guix-profile/lib/guile/2.2/site-ccache${GUILE_LOAD_COMPILED_PATH:+:}$GUILE_LOAD_COMPILED_PATH" export INFOPATH="/home/gamba/.guix-profile/share/info${INFOPATH:+:}$INFOPATH" export TEXMF="/home/gamba/.guix-profile/share/texmf-dist" export TEXMFCNF="/home/gamba/.guix-profile/share/texmf-dist/web2c"
$ which bash
/home/gamba/.guix-profile/bin/bash
$ readlink -f `which bash`
/gnu/store/qn1ax1fkj16x280m1rv7mcimfmn9l2pf-bash-4.4.23/bin/bash
$ guix gc --references /gnu/store/qn1ax1fkj16x280m1rv7mcimfmn9l2pf-bash-4.4.23
/gnu/store/4h03mp5nggsblscs6j0n7s6sbpfy6kxh-ncurses-6.1
/gnu/store/4sqps8dczv3g7rwbdibfz6rf5jlk7w90-gcc-5.5.0-lib
/gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28
/gnu/store/qn1ax1fkj16x280m1rv7mcimfmn9l2pf-bash-4.4.23
/gnu/store/si88gb25621k0w60kij5lxksn8l24664-readline-7.0.5
guix package
gère automatiquement !guix package --list-generations
guix package --roll-back
guix package --switch-generations=24
-$ which bash # => /home/gamba/.guix-profile/bin/bash $ guix package -l Génération 25 20 juin 2019 05:13:26 (actuelle) + bash 4.4.23 out /gnu/store/qn1ax1fkj16x280m1rv7mcimfmn9l2pf-bash-4.4.23 $ guix package --roll-back passé de la génération 25 à 24 $ which bash # => /bin/bash $ guix package -S 25
/var/guix/profile/per-user/
/var/guix/
et /gnu/store
gérés sur une machine, exportés en NFS sur
le reste de la grappeguix gc
de temps à autre: cron :-)guile, l'implémentation gnu de scheme est utilisée:
(define-public hello (package (name "hello") (version "2.10") (source (origin (method url-fetch) (uri (string-append "mirror://gnu/hello/hello-" version ".tar.gz")) (sha256 (base32 "0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i")))) (build-system gnu-build-system) (synopsis "Hello, GNU world: An example GNU package") (description "GNU Hello prints the message \"Hello, world!\" and then exits. It serves as an example of standard GNU coding practices. As such, it supports command-line arguments, multiple languages, and so on.") (home-page "https://www.gnu.org/software/hello/") (license gpl3+)))
modifier la conf normale d'un paquetage:
$ guix build hwloc \ --with-source=./hwloc-2.0rc1.tar.gz ... $ guix package -i mumps --with-input=scotch=pt-scotch ... $ guix package -i julia --with-input=fftw=fftw-avx ...
Spécifier un environnement complet:
;; manifest.scm (use-package-modules guile emacs) (packages->manifest (list emacs guile-2.0 ;; Use a specific package output. (list guile-2.0 "debug")))
guix package --manifest=manifest.scm
alice@cluster$ guix describe guix 996ecaf URL du dépôt : https://git.savannah.gnu.org/git/guix.git branche: master commit : 996ecaf64e397341dbed70198032ce828040e5ac alice@cluster$ guix package -m manifest.scm # alice publishes manifest.scm and guix commit # bob reproduces alice's env: bob@laptop$ guix pull --commit=996ecaf # exact guix version ! bob@laptop$ guix package -m manifest.scm
Pour reproduire un environnement crée dans guix sans guix
$ guix pack -m manfifest.scm # => tgz with /gnu/store $ guix pack -m manifest.scm -S /opt/gnu/bin=bin # idem, plus symlink created in /opt/gnu/bin !
Sur une autre machine:
# must be root :-( $ cd / $ tar zxf /path/to/pack.tgz $ /opt/gnu/bin/… # to launch command
Avec un linux récent (>3.19), on peut utiliser les user namespaces et se passer de root
$ mkdir /tmp/pack $ cd /tmp/pack $ tar xf /path/to/pack.tar.gz $ unshare -mrf chroot . /opt/gnu/bin/guile --version guile (GNU Guile) 2.2.0
$ guix pack -m manfifest.scm -S /opt/gnu=/ -f docker
génère une image docker !
$ guix pack --target=arm-linux-gnueabihf -m manifest.scm
independently-verifiable path from source to binary code
tous les jolis schémas ont été repris dans des présentations officielles de guix