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" mise à jour de la liste des substituts depuis 'https://ci.guix.gnu.org'... 100.0% mise à jour de la liste 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 … 6,406 éléments du dépôt ont été analysés : - 4,749 (74.1%) étaient identiques - 525 (8.2%) étaient différents - 1,132 (17.7%) étaient impossibles à évaluer
Dans cet exemple, guix challenge
scanne d’abord le dépôt pour
déterminer l’ensemble des dérivations construites localement — en opposition
aux éléments qui ont été téléchargées depuis un serveur de substituts — puis
demande leur avis à tous les serveurs de substituts. Il rapporte ensuite
les éléments du dépôt pour lesquels les serveurs ont obtenu un résultat
différent de la construction locale.
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"
Celà 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
où paquet est une spécification de paquet comme guile@2.0
ou
glibc:debug
.
La syntaxe générale est :
guix challenge options [paquets…]
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]