Wie erstelle ich mit mkisofs/genisoimage eine reproduzierbare ISO-Datei?

Wie erstelle ich mit mkisofs/genisoimage eine reproduzierbare ISO-Datei?

In einem automatisierten Prozess wird eine ISO-Datei mit erstellt mkisofs. Auch wenn die Originaldaten exakt gleich sind, sind die resultierenden ISO-Dateien (ihre md5sumÄnderungen) nicht gleich. Da ich rsync --checksumdas Ergebnis nicht mag, gefällt es mir nicht, dass jedes Mal das "gleiche ISO" neu übertragen wird. Ich vermute, dass hauptsächlich die Zeitstempel den Hauptunterschied ausmachen.

Gibt es einen libfaketimeintegrierten Schalter zum Generieren eines ISO-Via, mkisofsder tatsächlich dasselbe wäre?

Ich weiß nicht, ob nur Zeitstempel wichtig sind. Ich habe die resultierenden ISO-Dateien mit ihrer xxd isofileAusgabe wie folgt verglichen:

diff --side-by-side  --suppress-common-lines <(xxd a.iso) <(xxd b.iso )

und es scheinen nur 51 Zeilen vorhanden zu sein, die 16 Bytes darstellen (also ungefähr 800 Bytes Unterschied) in der ansonsten exakt gleichen Datei.

Der zum Generieren des betreffenden ISOs verwendete Befehl lautet ungefähr wie folgt:

genisoimage -o "file.iso" -b isolinux/isolinux.bin \
    -c isolinux/boot.cat -no-emul-boot \
    -boot-load-size 4 -boot-info-table \
    -J -R -v -T -V 'CDLABEL' "datadir/"

BS: Übersehe ich einen Befehlszeilenparameterschalter, mit rsyncdem ich Prüfsummen für ca. 1 MB große Dateiblöcke erstelle, um die erneute Übertragung zu verhindern, wenn wie in meinem Fall nur etwa 800 Bytes Unterschied bestehen?

Antwort1

Vorab ein wichtiger Hinweis: Nicht verwenden, genisoimageda es sich um eine defekte Variante mkisofsvom Mai 2004 handelt.

In der Zeit bis Mai 2007 wurden viele Debian-spezifische Fehler hinzugefügt und seitdem ist es tot.

Wichtig zu wissen ist, dass dadurch genisoimagefehlerhafte Dateisystemabbilder erstellt werden, die irgendwann möglicherweise nicht mehr von Ihrem Betriebssystem akzeptiert werden ...

Die offizielle Version mkisofswird jedoch weiterhin aktiv gepflegt und hat im August 2006 zahlreiche nicht Debian-spezifische Fehler behoben. Derzeit sind keine Fehler bekannt.

Nun zu Ihrem Problem: Sie verwenden -R (Rock Rigde) und dies fügt UNIXden Metadaten der Dateien Zeitstempel hinzu. Dies ist Problem Nummer 1...

Das andere Problem ist, dass der Superblock des ISO-9660-Dateisystems (offiziell primary_descriptor genannt) das Erstellungsdatum und das Änderungsdatum enthält. Letzteres kann über die Option gesteuert werden -modification-date.

Wenn Sie der Meinung sind, dass diese Funktion wirklich notwendig ist, könnte ich eine ähnliche Option für das Erstellungsdatum hinzufügen. Dann bräuchten Sie allerdings immer noch eine Option, um dem Rock Ridge-Formatierungsteil mitzuteilen, dass er das Änderungsdatum der Dateien anstelle des Zeitpunkts des letzten Lesezugriffs verwenden soll.

Häufig aktualisierte Versionen der Originalquelle sind Teil des schilytoolsTarballs, der hier abgerufen werden kann:http://sourceforge.net/projects/schilytools/files/

Das aktuellste Schilytools-Tarball bietet Unterstützung für reproduzierbare ISO-9660-Dateisystemabbilder. Bitte holen/kompilieren/installieren Sie schily-2020-03-27.tar.bz2.

Es gibt einige neue Optionen:

  • -noatimeweist an mkisofs, die Änderungszeit als atime zu archivieren.

  • -creation-datesetzt das Erstellungsdatum im PVD

  • -expiration-datesetzt das Ablaufdatum im PVD

  • -effective-datelegt das Datum des Inkrafttretens im PVD fest

  • -reproducible-datesetzt alle Zeiten außer -effective-dateund -noatimezusätzlich.

Dies funktioniert sowohl für Standard-ISO-9660-Dateisystemabbilder als auch für Abbilder, die Rock Ridgeund enthalten UDF. Siehe die aktuelle Manpage unter:http://schilytools.sourceforge.net/man/man8/mkisofs.8.html

Ihre aktualisierte Befehlszeile würde folgendermaßen aussehen:

mkisofs -b isolinux/isolinux.bin \
  -c isolinux/boot.cat -no-emul-boot \
  -boot-load-size 4 -boot-info-table \
  -J -R -v -T -V 'CDLABEL' \
  -reproducible-date=20200327 "datadir/" > file.iso

Antwort2

Die Leute wechselten zuAbonnierenalsman sollte mkisofs vermeidenund Genisoimage scheint nicht weiterentwickelt zu werden.

Um die Xorriso-Ausgabe reproduzierbar zu machen, setzen Sie die Umgebungsvariable mit dem Namen SOURCE_DATE_EPOCH auf denselben Wert wie die Sekunden seit dem 1. Januar 1970.

Sie können xorriso entweder direkt oder dessenmkisofs-Kompatibilitätsmodus mit dem Namen xorrisofs.

SOURCE_DATE_EPOCH=0 xorrisofs YOUR-MKISOFS-ARGS

Antwort3

Die bereitgestellten Antworten haben bei mir nicht funktioniert, aber mit Hilfe einiger Freunde habe ich einen Weg gefunden, reproduzierbare ISO-Images aus beliebigen Ordnern zu erstellen, mit xorriso

Das Datum muss als Umgebungsvariable exportiert werden. Dateiberechtigungen können für verschiedene Personen unterschiedlich sein, daher zwingen wir sie zu etwas. preparer_idwird variieren, da standardmäßig der vollständige Name von xorriso mit Version enthalten ist. uid/ gidkann auf verschiedenen Systemen auch unterschiedlich sein.

Dieses Skript akzeptiert den Pfad zum Ordner als Startargument oder als Eingabeaufforderung. Habe es allerdings noch nicht zur Erstellung eines Betriebssystemabbilds versucht.

export SOURCE_DATE_EPOCH="$(date -d20010101 -u +%s)"
output_filename=result.iso
file_mode=0444

folder="$1"
while [ ! -d "$folder" ]; do
    [ -z "$folder" ] || printf "'%s' not a directory?\n" "$folder"
    read -p "Enter path to dir containing files to pack: " folder
done
list="$(mktemp)"
(cd "$folder"; for f in *; do printf "%s\n" "$f=$PWD/$f"; done) \
    | LC_ALL=C sort >"$list"

xorriso \
    -preparer_id xorriso \
    -volume_date 'all_file_dates' "=$SOURCE_DATE_EPOCH" \
    -as mkisofs \
    -iso-level 3 \
    -graft-points \
    -full-iso9660-filenames \
    -joliet \
    -file-mode $file_mode \
    -uid 0 \
    -gid 0 \
    -path-list "$list" \
    -output "$output_filename"

rm -f "$list"

verwandte Informationen