Nächste: , Vorige: , Nach oben: Zubehör   [Inhalt][Index]


9.12 guix challenge aufrufen

Entsprechen die von diesem Server gelieferten Binärdateien tatsächlich dem Quellcode, aus dem sie angeblich erzeugt wurden? Ist ein Paketerstellungsprozess deterministisch? Diese Fragen versucht guix challenge zu beantworten.

Die erste Frage ist offensichtlich wichtig: Bevor man einen Substitutserver benutzt (siehe Substitute), verifiziert man besser, dass er die richtigen Binärdateien liefert, d.h. man fechtet sie an. Die letzte Frage macht die erste möglich: Wenn Paketerstellungen deterministisch sind, müssten voneinander unabhängige Erstellungen genau dasselbe Ergebnis liefern, Bit für Bit; wenn ein Server mit einer anderen Binärdatei als der lokal erstellten Binärdatei antwortet, ist diese entweder beschädigt oder bösartig.

Wir wissen, dass die in /gnu/store-Dateinamen auftauchende Hash-Prüfsumme der Hash aller Eingaben des Prozesses ist, mit dem die Datei oder das Verzeichnis erstellt wurde – Compiler, Bibliotheken, Erstellungsskripts und so weiter (siehe Einführung). Wenn wir von deterministischen Erstellungen ausgehen, sollte ein Store-Dateiname also auf genau eine Erstellungsausgabe abgebildet werden. Mit guix challenge prüft man, ob es tatsächlich eine eindeutige Abbildung gibt, indem die Erstellungsausgaben mehrerer unabhängiger Erstellungen jedes angegebenen Store-Objekts verglichen werden.

Die Ausgabe des Befehls sieht so aus:

$ guix challenge \
  --substitute-urls="https://ci.guix.gnu.org https://guix.example.org" \
  openssl git pius coreutils grep
Liste der Substitute von „https://ci.guix.gnu.org“ wird aktualisiert … 100.0%
Liste der Substitute von „https://guix.example.org“ wird aktualisiert … 100.0%
Inhalt von /gnu/store/…-openssl-1.0.2d verschieden:
  lokale Prüfsumme: 0725l22r5jnzazaacncwsvp9kgf42266ayyp814v7djxs7nk963q
  https://ci.guix.gnu.org/nar/…-openssl-1.0.2d: 0725l22r5jnzazaacncwsvp9kgf42266ayyp814v7djxs7nk963q
  https://guix.example.org/nar/…-openssl-1.0.2d: 1zy4fmaaqcnjrzzajkdn3f5gmjk754b43qkq47llbyak9z0qjyim
  Diese Dateien unterscheiden sich:
    /lib/libcrypto.so.1.1
    /lib/libssl.so.1.1

Inhalt von /gnu/store/…-git-2.5.0 verschieden:
  lokale Prüfsumme: 00p3bmryhjxrhpn2gxs2fy0a15lnip05l97205pgbk5ra395hyha
  https://ci.guix.gnu.org/nar/…-git-2.5.0: 069nb85bv4d4a6slrwjdy8v1cn4cwspm3kdbmyb81d6zckj3nq9f
  https://guix.example.org/nar/…-git-2.5.0: 0mdqa9w1p6cmli6976v4wi0sw9r4p5prkj7lzfd1877wk11c9c73
  Diese Datei unterscheidet sich:
    /libexec/git-core/git-fsck

Inhalt von /gnu/store/…-pius-2.1.1 verschieden:
  lokale Prüfsumme: 0k4v3m9z1zp8xzzizb7d8kjj72f9172xv078sq4wl73vnq9ig3ax
  https://ci.guix.gnu.org/nar/…-pius-2.1.1: 0k4v3m9z1zp8xzzizb7d8kjj72f9172xv078sq4wl73vnq9ig3ax
  https://guix.example.org/nar/…-pius-2.1.1: 1cy25x1a4fzq5rk0pmvc8xhwyffnqz95h2bpvqsz2mpvlbccy0gs
  Diese Datei unterscheidet sich:
    /share/man/man1/pius.1.gz

…

5 Store-Objekte wurden analysiert:
  — 2 (40.0%) waren identisch
  — 3 (60.0%) unterscheiden sich
  — 0 (0.0%) blieben ergebnislos

In diesem Beispiel werden mit guix challenge alle Substitutserver zu jedem der fünf auf der Befehlszeile angegebenen Pakete angefragt. Diejenigen Store-Objekte, bei denen die Server ein anderes Ergebnis berechnet haben als die lokale Erstellung (falls vorhanden) oder wo die Server untereinander zu verschiedenen Ergebnissen gekommen sind, werden gemeldet. Daran, dass eine ‘lokale Prüfsumme’ dabeisteht, erkennen Sie, dass für die Pakete eine lokale Erstellung vorgelegen hat.

Nehmen wir zum Beispiel an, guix.example.org gibt uns immer eine verschiedene Antwort, aber ci.guix.gnu.org stimmt mit lokalen Erstellungen überein, außer im Fall von Git. Das könnte ein Hinweis sein, dass der Erstellungsprozess von Git nichtdeterministisch ist; das bedeutet, seine Ausgabe variiert abhängig von verschiedenen Umständen, die Guix nicht vollends kontrollieren kann, obwohl es Pakete in isolierten Umgebungen erstellt (siehe Funktionalitäten). Zu den häufigsten Quellen von Nichtdeterminismus gehören das Einsetzen von Zeitstempeln innerhalb der Erstellungsgebnisse, das Einsetzen von Zufallszahlen und von Auflistungen eines Verzeichnisinhalts sortiert nach der Inode-Nummer. Siehe https://reproducible-builds.org/docs/ für mehr Informationen.

Um herauszufinden, was mit dieser Git-Binärdatei nicht stimmt, ist es am leichtesten, einfach diesen Befehl auszuführen:

guix challenge git \
  --diff=diffoscope \
  --substitute-urls="https://ci.guix.gnu.org https://guix.example.org"

Dadurch wird diffoscope automatisch aufgerufen, um detaillierte Informationen über sich unterscheidende Dateien anzuzeigen.

Alternativ können wir so etwas machen (siehe guix archive aufrufen):

$ 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

Dieser Befehl zeigt die Unterschiede zwischen den Dateien, die sich aus der lokalen Erstellung ergeben, und den Dateien, die sich aus der Erstellung auf ci.guix.gnu.org ergeben (siehe Dateien vergleichen und zusammenführen in Comparing and Merging Files). Der Befehl diff funktioniert großartig für Textdateien. Wenn sich Binärdateien unterscheiden, ist Diffoscope die bessere Wahl: Es ist ein hilfreiches Werkzeug, das Unterschiede in allen Arten von Dateien visualisiert.

Sobald Sie mit dieser Arbeit fertig sind, können Sie erkennen, ob die Unterschiede aufgrund eines nichtdeterministischen Erstellungsprozesses oder wegen einem bösartigen Server zustande kommen. Wir geben uns Mühe, Quellen von Nichtdeterminismus in Paketen zu entfernen, damit Substitute leichter verifiziert werden können, aber natürlich ist an diesem Prozess nicht nur Guix, sondern ein großer Teil der Freie-Software-Gemeinschaft beteiligt. In der Zwischenzeit ist guix challenge eines der Werkzeuge, die das Problem anzugehen helfen.

Wenn Sie ein Paket für Guix schreiben, ermutigen wir Sie, zu überprüfen, ob ci.guix.gnu.org und andere Substitutserver dasselbe Erstellungsergebnis bekommen, das Sie bekommen haben. Das geht so:

guix challenge Paket

Die allgemeine Syntax lautet:

guix challenge Optionen Argumente

wobei jedes der Argumente eine Paketspezifikation wie guile@2.0 oder glibc:debug sein muss oder alternativ der Name einer Datei im Store, wie er zum Beispiel durch guix build oder guix gc --list-live mitgeteilt wird.

Wird ein Unterschied zwischen der Hash-Prüfsumme des lokal erstellten Objekts und dem vom Server gelieferten Substitut festgestellt, oder zwischen den Substituten von unterschiedlichen Servern, dann wird der Befehl dies wie im obigen Beispiel anzeigen und mit dem Exit-Code 2 terminieren (andere Exit-Codes außer null stehen für andere Arten von Fehlern).

Die eine, wichtige Befehlszeilenoption ist:

--substitute-urls=URLs

Die URLs als durch Leerraumzeichen getrennte Liste von Substitut-Quell-URLs benutzen. mit denen verglichen wird.

--diff=Modus

Wenn sich Dateien unterscheiden, diese Unterschiede entsprechend dem Modus anzeigen. Dieser kann einer der folgenden sein:

simple (die Vorgabe)

Zeige die Liste sich unterscheidender Dateien.

diffoscope
Befehl

Diffoscope aufrufen und ihm zwei Verzeichnisse mit verschiedenem Inhalt übergeben.

Wenn der Befehl ein absoluter Dateiname ist, wird der Befehl anstelle von Diffoscope ausgeführt.

none

Keine näheren Details zu Unterschieden anzeigen.

Solange kein --diff=none angegeben wird, werden durch guix challenge also Store-Objekte von den festgelegten Substitutservern heruntergeladen, damit diese verglichen werden können.

--verbose
-v

Details auch zu Übereinstimmungen (deren Inhalt identisch ist) ausgeben, zusätzlich zu Informationen über Unterschiede.


Nächste: guix copy aufrufen, Vorige: guix publish aufrufen, Nach oben: Zubehör   [Inhalt][Index]