Suivant: , Précédent: , Monter: Utilitaires   [Table des matières][Index]


10.12 Invoquer guix challenge

Est-ce que les binaires fournis par ce serveur correspondent réellement au code source qu’il dit avoir construit ? Est-ce que le processus de construction d’un paquet est déterministe ? Ce sont les question auxquelles la commande guix challenge essaye de répondre.

La première question est évidemment importante : avant d’utiliser un serveur de substituts (voir Substituts), il vaut mieux vérifier qu’il fournit les bons binaires et donc le défier. La deuxième est ce qui permet la première : si les constructions des paquets sont déterministes alors des constructions indépendantes du paquet devraient donner le même résultat, bit à bit ; si un serveur fournit un binaire différent de celui obtenu localement, il peut être soit corrompu, soit malveillant.

On sait que le hash qui apparaît dans /gnu/store est le hash de toutes les entrées du processus qui construit le fichier ou le répertoire — les compilateurs, les bibliothèques, les scripts de construction, etc. (voir Introduction). En supposant que les processus de construction sont déterministes, un nom de fichier dans le dépôt devrait correspondre exactement à une sortie de construction. guix challenge vérifie si il y a bien effectivement une seule correspondance en comparant les sorties de plusieurs constructions indépendantes d’un élément du dépôt donné.

La sortie de la commande ressemble à :

$ guix challenge \
  --substitute-urls="https://ci.guix.gnu.org https://guix.example.org" \
  openssl git pius coreutils grep
mise à jour des substituts depuis 'https://ci.guix.gnu.org'... 100.0%
mise à jour des substituts depuis 'https://guix.example.org'... 100.0%
le contenu de /gnu/store/…-openssl-1.0.2d diffère :
  empreinte locale : 0725l22r5jnzazaacncwsvp9kgf42266ayyp814v7djxs7nk963q
  https://ci.guix.gnu.org/nar/…-openssl-1.0.2d : 0725l22r5jnzazaacncwsvp9kgf42266ayyp814v7djxs7nk963q
  https://guix.example.org/nar/…-openssl-1.0.2d : 1zy4fmaaqcnjrzzajkdn3f5gmjk754b43qkq47llbyak9z0qjyim
  fichiers différents :
    /lib/libcrypto.so.1.1
    /lib/libssl.so.1.1

le contenu de /gnu/store/…-git-2.5.0 diffère :
  empreinte locale : 00p3bmryhjxrhpn2gxs2fy0a15lnip05l97205pgbk5ra395hyha
  https://ci.guix.gnu.org/nar/…-git-2.5.0 : 069nb85bv4d4a6slrwjdy8v1cn4cwspm3kdbmyb81d6zckj3nq9f
  https://guix.example.org/nar/…-git-2.5.0 : 0mdqa9w1p6cmli6976v4wi0sw9r4p5prkj7lzfd1877wk11c9c73
  fichier différent :
    /libexec/git-core/git-fsck

le contenu de /gnu/store/…-pius-2.1.1 diffère :
  empreinte locale : 0k4v3m9z1zp8xzzizb7d8kjj72f9172xv078sq4wl73vnq9ig3ax
  https://ci.guix.gnu.org/nar/…-pius-2.1.1 : 0k4v3m9z1zp8xzzizb7d8kjj72f9172xv078sq4wl73vnq9ig3ax
  https://guix.example.org/nar/…-pius-2.1.1 : 1cy25x1a4fzq5rk0pmvc8xhwyffnqz95h2bpvqsz2mpvlbccy0gs
  fichier différent:
    /share/man/man1/pius.1.gz

…

5 éléments du dépôt ont été analysés :
  - 2 (40.0%) étaient identiques
  - 3 (60.0%) étaient différents
  - 0 (0.0%) étaient impossibles à évaluer

Dans cet exemple, guix challenge demande à tous les serveurs de substituts les cinq paquets spécifiés sur la ligne de commande. Il rapporte ensuite les éléments du dépôt pour lesquels les serveurs obtiennent un résultat différent de la construction locale (si elle existe) ou différent entre eux ; ici, les lignes ‘empreinte locale’ indiquent que le résultat d’une construction locale était disponible pour chacun des paquets et montre son empreinte.

Dans l’exemple, guix.example.org obtient toujours une réponse différente. Inversement, ci.guix.gnu.org est d’accord avec les constructions locale, sauf dans le cas de Git. Cela peut indiquer que le processus de construction de Git est non-déterministe, ce qui signifie que sa sortie diffère en fonction de divers choses que Guix ne contrôle pas parfaitement, malgré l’isolation des constructions (voir Fonctionnalités). Les sources les plus communes de non-déterminisme comprennent l’ajout d’horodatage dans les résultats des constructions, l’inclusion de nombres aléatoires et des listes de fichiers ordonnés par numéro d’inœud. Voir https://reproducible-builds.org/docs/, pour plus d’informations.

Pour trouver ce qui ne va pas avec ce binaire Git, l’approche la plus facile est de lancer :

guix challenge git \
  --diff=diffoscope \
  --substitute-urls="https://ci.guix.gnu.org https://guix.example.org"

Cela invoque automatiquement diffoscope, qui affiche des informations détaillées sur les fichiers qui diffèrent.

Autrement, nous pouvons faire quelque chose comme dans ces lignes (voir Invoquer guix archive) :

$ wget -q -O - https://ci.guix.gnu.org/nar/lzip/…-git-2.5.0 \
   | lzip -d | guix archive -x /tmp/git
$ diff -ur --no-dereference /gnu/store/…-git.2.5.0 /tmp/git

Cette commande montre les différences entre les fichiers qui résultent de la construction locale et des fichiers qui résultent de la construction sur ci.guix.gnu.org (voir Comparing and Merging Files dans Comparing and Merging Files). La commande diff fonctionne bien avec des fichiers texte. Lorsque des fichiers binaires diffèrent cependant, Diffoscope est une meilleure option. C’est un outil qui aide à visualiser les différences entre toute sorte de fichiers.

Une fois que vous avez fait ce travail, vous pourrez dire si les différences sont dues au non-déterminisme du processus de construction ou à la malhonnêteté du serveur. Nous avons fait beaucoup d’effort pour éliminer les sources de non-déterminisme dans les paquets pour rendre plus facile la vérification des substituts, mais bien sûr, c’est un processus qui n’implique pas que Guix, mais une grande partie de la communauté des logiciels libres. Pendant ce temps, guix challenge est un outil pour aider à corriger le problème.

Si vous écrivez un paquet pour Guix, nous vous encourageons à vérifier si ci.guix.gnu.org et d’autres serveurs de substituts obtiennent le même résultat que vous avec :

guix challenge paquet

La syntaxe générale est :

guix challenge options argument

argument est une spécification de paquet comme guile@2.0 ou glibc:debug ou, autrement, un nom de fichier du dépôt renvoyé, par exemple, par guix build ou guix gc --list-live.

Lorsqu’une différence est trouvée entre l’empreinte d’un élément construit localement et celle d’un substitut fourni par un serveur, ou parmi les substituts fournis par différents serveurs, la commande l’affiche comme dans l’exemple ci-dessus et sa valeur de sortie est 2 (les autres valeurs différentes de 0 indiquent d’autres sortes d’erreurs).

L’option qui compte est :

--substitute-urls=urls

Considère urls comme la liste des URL des sources de substituts séparés par des espaces avec lesquels comparer les paquets locaux.

--diff=mode

En cas d’inadéquation, montre les différences en fonction de mode, l’un des :

simple (par défaut)

Montrer la liste des fichiers qui diffèrent.

diffoscope
commande

Invoque Diffoscope, en lui passant deux répertoires dont le contenu ne correspond pas.

Quand command est un nom de fichier absolu, lancez command au lieu de Diffoscope.

none

Ne donnez pas plus de détails sur les différences.

Ainsi, à moins que l’option --diff=none ne soit passée, guix challenge télécharge les éléments du store à partir des serveurs de substitut donnés afin de pouvoir les comparer.

--verbose
-v

Montre des détails sur les correspondances (contenu identique) en plus des informations sur différences.


Suivant: Invoquer guix copy, Précédent: Invoquer guix publish, Monter: Utilitaires   [Table des matières][Index]