Siguiente: , Anterior: , Subir: Utilidades   [Índice general][Índice]


9.11 Invocación de 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 (véase Sustituciones), es importante haber verificado que proporciona los binarios correctos, y por tanto ponerlo a prueba25. 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. (véase 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://ci.guix.gnu.org https://guix.example.org"
actualizando sustituciones desde 'https://ci.guix.gnu.org'... 100.0%
actualizando sustituciones desde 'https://guix.example.org'... 100.0%
el contenido de /gnu/store/…-openssl-1.0.2d es diferente:
  hash local: 0725l22r5jnzazaacncwsvp9kgf42266ayyp814v7djxs7nk963q
  https://ci.guix.gnu.org/nar/…-openssl-1.0.2d: 0725l22r5jnzazaacncwsvp9kgf42266ayyp814v7djxs7nk963q
  https://guix.example.org/nar/…-openssl-1.0.2d: 1zy4fmaaqcnjrzzajkdn3f5gmjk754b43qkq47llbyak9z0qjyim
  archivos diferentes:
    /lib/libcrypto.so.1.1
    /lib/libssl.so.1.1

el contenido de /gnu/store/…-git-2.5.0 es diferente:
  hash local: 00p3bmryhjxrhpn2gxs2fy0a15lnip05l97205pgbk5ra395hyha
  https://ci.guix.gnu.org/nar/…-git-2.5.0: 069nb85bv4d4a6slrwjdy8v1cn4cwspm3kdbmyb81d6zckj3nq9f
  https://guix.example.org/nar/…-git-2.5.0: 0mdqa9w1p6cmli6976v4wi0sw9r4p5prkj7lzfd1877wk11c9c73
  archivo diferente:
    /libexec/git-core/git-fsck

el contenido de /gnu/store/…-pius-2.1.1 es diferente:
  hash local: 0k4v3m9z1zp8xzzizb7d8kjj72f9172xv078sq4wl73vnq9ig3ax
  https://ci.guix.gnu.org/nar/…-pius-2.1.1: 0k4v3m9z1zp8xzzizb7d8kjj72f9172xv078sq4wl73vnq9ig3ax
  https://guix.example.org/nar/…-pius-2.1.1: 1cy25x1a4fzq5rk0pmvc8xhwyffnqz95h2bpvqsz2mpvlbccy0gs
  archivo diferente:
    /share/man/man1/pius.1.gz

…

6,406 elementos del almacén fueron analizados:
  - 4,749 (74.1%) fueron idénticos
  - 525 (8.2%) fueron diferentes
  - 1,132 (17.7%) no arrojaron resultados concluyentes

En este ejemplo, guix challenge primero recorre el almacén para determinar el conjunto de derivaciones construidas localmente—en oposición a elementos del almacén que fueron descargados de un servidor de sustituciones—y consulta a todos los servidores de sustituciones. Una vez hecho informa de los elementos del almacén para los cuales los servidores obtuvieron un resultado diferente de el obtenido en la construcción local.

Como un ejemplo, guix.example.org siempre obtiene una respuesta diferente. Por otro modo, ci.guix.gnu.org coincide con las construcciones locales, excepto en el caso de Git. Esto puede indicar que el proceso de construcción de Git no es determinista, lo que significa que su salida varia en función de varias cosas que Guix no controla completamente, aunque la construcción de paquetes se realice en entornos aislados (véase Características). Las fuentes más comunes de indeterminismo incluyen la adición de marcas de tiempo en los resultados de la construcción, la inclusión de números aleatorios y las enumeraciones de directorios ordenadas por número de nodos-i. Véase https://reproducible-builds.org/docs/ para más información.

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://ci.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 (véase Invocación de 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

Esta orden muestra la diferencia entre los archivos resultantes de la construcción local y los archivos resultantes de la construcción en ci.guix.gnu.org (véase Comparing and Merging Files en Comparing and Merging Files). La orden diff funciona muy bien en archivos de texto. Cuando son binarios los archivos diferentes, una opción mejor es Diffoscope, una herramienta que ayuda en la visualización de diferencias en todo tipo de archivos.

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.

Si esta escribiendo paquetes para Guix, le recomendamos que compruebe si ci.guix.gnu.org y otros servidores de sustituciones obtienen el mismo resultado de construcción que el obtenido por usted:

$ guix challenge paquete

donde paquete es una especificación de paquete como guile@2.0 o glibc:debug.

La sintaxis general es:

guix challenge opciones [paquetes…]

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
orden

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.


Notas al pie

(25)

NdT: challenge en inglés.


Siguiente: , Anterior: , Subir: Utilidades   [Índice general][Índice]