Next: Invocación de guix copy
, Previous: Invocación de guix publish
, Up: Utilidades [Contents][Index]
guix challenge
¿Los binarios que proporciona este servidor realmente corresponden al código
fuente que dice construir? ¿Es determinista el proceso de construcción de un
paquete? Estas son las preguntas que la orden guix challenge
intenta responder.
La primera es obviamente una cuestión importante: antes de usar un servidor de sustituciones (see Sustituciones), es importante haber verificado que proporciona los binarios correctos, y por tanto ponerlo a prueba29. La segunda es lo que permite la primera: si las construcciones de los paquetes son deterministas, construcciones independientes deberían emitir el mismo resultado, bit a bit; si el servidor proporciona un binario diferente al obtenido localmente, o bien está corrupto o bien tiene intenciones perniciosas.
Sabemos que el hash que se muestra en los nombres de archivo en
/gnu/store es el hash de todas las entradas del proceso que construyó
el archivo o directorio—compiladores, bibliotecas, guiones de
construcción, etc. (see Introducción). Asumiendo procesos de
construcción deterministas, un nombre de archivo del almacén debe
corresponder exactamente a una salida de construcción. guix
challenge
comprueba si existe, realmente, una asociación unívoca comparando
la salida de la construcción de varias construcciones independientes de
cualquier elemento del almacén proporcionado.
La salida de la orden muestra algo así:
$ guix challenge \ --substitute-urls="https://bordeaux.guix.gnu.org https://guix.example.org" \ openssl git pius coreutils grep updating substitutes from 'https://bordeaux.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://bordeaux.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 /gnu/store/…-git-2.5.0 contents differ: local hash: 00p3bmryhjxrhpn2gxs2fy0a15lnip05l97205pgbk5ra395hyha https://bordeaux.guix.gnu.org/nar/…-git-2.5.0: 069nb85bv4d4a6slrwjdy8v1cn4cwspm3kdbmyb81d6zckj3nq9f https://guix.example.org/nar/…-git-2.5.0: 0mdqa9w1p6cmli6976v4wi0sw9r4p5prkj7lzfd1877wk11c9c73 differing file: /libexec/git-core/git-fsck /gnu/store/…-pius-2.1.1 contents differ: local hash: 0k4v3m9z1zp8xzzizb7d8kjj72f9172xv078sq4wl73vnq9ig3ax https://bordeaux.guix.gnu.org/nar/…-pius-2.1.1: 0k4v3m9z1zp8xzzizb7d8kjj72f9172xv078sq4wl73vnq9ig3ax https://guix.example.org/nar/…-pius-2.1.1: 1cy25x1a4fzq5rk0pmvc8xhwyffnqz95h2bpvqsz2mpvlbccy0gs differing file: /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.
As an example, guix.example.org
always gets a different answer.
Conversely, bordeaux.guix.gnu.org
agrees with local builds,
except in the case of Git. This might indicate that the build process of
Git is non-deterministic, meaning that its output varies as a function of
various things that Guix does not fully control, in spite of building
packages in isolated environments (see Características). Most common sources
of non-determinism include the addition of timestamps in build results, the
inclusion of random numbers, and directory listings sorted by inode number.
See https://reproducible-builds.org/docs/, for more information.
Para encontrar cuál es el problema con este binario Git, la aproximación más fácil es ejecutar:
guix challenge git \ --diff=diffoscope \ --substitute-urls="https://bordeaux.guix.gnu.org https://guix.example.org"
Esto invoca automáticamente diffoscope
, que muestra información
detallada sobre los archivos que son diferentes.
De manera alternativa, se puede hacer algo parecido a esto (see Invocación de guix archive
):
$ wget -q -O - https://bordeaux.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
This command shows the difference between the files resulting from the local
build, and the files resulting from the build on
bordeaux.guix.gnu.org
(see Comparing and Merging
Files in Comparing and Merging Files). The diff
command works great for text files. When binary files differ, a better
option is Diffoscope, a tool that helps
visualize differences for all kinds of files.
Una vez haya realizado este trabajo, puede determinar si las diferencias son
debidas a un procedimiento de construcción no-determinista o a un servidor
con intenciones ocultas. Intentamos duramente eliminar las fuentes de
indeterminismo en los paquetes para facilitar la verificación de
sustituciones, pero por supuesto es un proceso que implica no solo a Guix,
sino a una gran parte de la comunidad del software libre. Entre tanto,
guix challenge
es una herramienta para ayudar a afrontar el
problema.
If you are writing packages for Guix, you are encouraged to check whether
bordeaux.guix.gnu.org
and other substitute servers obtain the
same build result as you did with:
guix challenge package
La sintaxis general es:
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
.
Cuando se encuentra una diferencia entre el hash de un elemento construido localmente y el proporcionado por un servidor de sustituciones; o entre las sustituciones proporcionadas por distintos servidores, esto es mostrado como en el ejemplo previo y el código de salida es 2 (otros valores código de salida distintos de cero denominan otros tipos de error).
La única opción de importancia es:
--substitute-urls=urls
Considera urls la lista separada por espacios de URL de fuentes de sustituciones con las que realizar la comparación.
--diff=modo
Muestra las diferencias encontradas de acuerdo con modo, uno de los siguientes:
simple
(el predeterminado)Muestra la lista de archivos que son diferentes.
diffoscope
Invoca Diffoscope y le proporciona los dos directorios cuyo contenido es diferente.
Cuando orden es una ruta absoluta, ejecuta orden en vez de Diffoscope.
none
No muestra más detalles sobre las diferencias.
Por tanto, a menos que se proporcione --diff=none, guix
challenge
descarga los contenidos de los elementos del almacén de los
servidores de sustituciones proporcionados para poder compararlos.
--verbose
-v
Muestra detalles sobre coincidencias (contenidos idénticos) además de información sobre las discrepancias.
Next: Invocación de guix copy
, Previous: Invocación de guix publish
, Up: Utilidades [Contents][Index]