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
updating substitutes from 'https://ci.guix.gnu.org'... 100.0%
updating substitutes from 'https://guix.example.org'... 100.0%
/gnu/store/…-openssl-1.0.2d contents differ:
  local hash: 0725l22r5jnzazaacncwsvp9kgf42266ayyp814v7djxs7nk963q
  https://ci.guix.gnu.org/nar/…-openssl-1.0.2d: 0725l22r5jnzazaacncwsvp9kgf42266ayyp814v7djxs7nk963q
  https://guix.example.org/nar/…-openssl-1.0.2d: 1zy4fmaaqcnjrzzajkdn3f5gmjk754b43qkq47llbyak9z0qjyim
  differing files:
    /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 store items were analyzed:
  - 2 (40.0%) were identical
  - 3 (60.0%) differed
  - 0 (0.0%) were inconclusive

In this example, guix challenge queries all the substitute servers for each of the fives packages specified on the command line. It then reports those store items for which the servers obtained a result different from the local build (if it exists) and/or different from one another; here, the ‘local hash’ lines indicate that a local build result was available for each of these packages and shows its hash.

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 package

La syntaxe générale est :

guix challenge options argument

where argument is a package specification such as guile@2.0 or glibc:debug or, alternatively, a store file name as returned, for example, by guix build or 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: , Précédent: , Monter: Utilitaires   [Table des matières][Index]