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 --checksum
das 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 libfaketime
integrierten Schalter zum Generieren eines ISO-Via, mkisofs
der tatsächlich dasselbe wäre?
Ich weiß nicht, ob nur Zeitstempel wichtig sind. Ich habe die resultierenden ISO-Dateien mit ihrer xxd isofile
Ausgabe 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 rsync
dem 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, genisoimage
da es sich um eine defekte Variante mkisofs
vom 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 genisoimage
fehlerhafte Dateisystemabbilder erstellt werden, die irgendwann möglicherweise nicht mehr von Ihrem Betriebssystem akzeptiert werden ...
Die offizielle Version mkisofs
wird 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 UNIX
den 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 schilytools
Tarballs, 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:
-noatime
weist anmkisofs
, die Änderungszeit als atime zu archivieren.-creation-date
setzt das Erstellungsdatum im PVD-expiration-date
setzt das Ablaufdatum im PVD-effective-date
legt das Datum des Inkrafttretens im PVD fest-reproducible-date
setzt alle Zeiten außer-effective-date
und-noatime
zusätzlich.
Dies funktioniert sowohl für Standard-ISO-9660-Dateisystemabbilder als auch für Abbilder, die Rock Ridge
und 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.
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_id
wird variieren, da standardmäßig der vollständige Name von xorriso mit Version enthalten ist. uid
/ gid
kann 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"