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 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
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]