Nächste: guix copy
aufrufen, Vorige: guix publish
aufrufen, Nach oben: Zubehör [Inhalt][Index]
guix challenge
aufrufenEntsprechen 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
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]