Suivant: Invoquer guix copy
, Précédent: Invoquer guix publish
, Monter: Utilitaires [Table des matières][Index]
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…
où 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
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]