自動化されたプロセスでは、mkisofs
を使用してisoファイルが作成されます。元のデータがまったく同じである場合でも、結果のisoファイルは同じではありません(md5sum
が変更されます)。結果をrsync --checksum
しているので、もちろん「同じiso」が毎回再転送されるのは嫌です。主な違いはタイムスタンプだと思います。
divを介してISOを生成するためのlibfaketime
ビルトインスイッチはありますか>それは確かに同じでしょう。
タイムスタンプだけが重要かどうかわかりませんか?結果のisoファイルを次のようなxxd isofile
出力と比較しました:
diff --side-by-side --suppress-common-lines <(xxd a.iso) <(xxd b.iso )
他のまったく同じファイルの16バイト(つまり約800バイトの違い)を表す51行。
問題のこのISOを生成するために使用されるコマンドは、おおよそ次のとおりです。
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:rsync
のコマンドラインパラメータスイッチがありません。これは、最大1MBの大きなファイルのチャンクのチェックサムを実行します。私の場合、800バイトだけが異なりますか?
コメント
回答
最初の重要な注意事項: 2004年5月のmkisofs
の欠陥バリアントであるため。
2007年5月までの期間、Debian固有のバグが多数ありました。
ここで知っておくべき重要なことは、genisoimage
が欠陥のあるファイルシステムイメージを作成し、それがいつか受け入れられなくなる可能性があることです。お使いのOSによって…
公式のmkisofs
は、2006年8月に引き続き積極的に保守され、Debian固有ではない多くのバグが修正されています。バグ。
問題:-R(Rock Rigde)を使用しているため、ファイルのメタデータにタイムスタンプのようなUNIX
が追加されます。これは問題番号1です。…
もう1つの問題は、ISO-9660ファイルシステムのスーパーブロック(正式にはprimary_descriptorと呼ばれます)に作成日と変更日が含まれていることです。後者は、オプション-modification-date
を介して制御できます。
これが本当に必要な機能であると思われる場合は、作成日に同様のオプションを追加できます。ただし、最後の読み取りアクセスの時刻ではなく、ファイルの変更日を使用するようにRockRidgeフォーマット部分に指示するオプションが必要です。
元のソースの頻繁に更新されるバージョンはの一部です。 schilytools
tarballから取得できます: http://sourceforge.net/projects/schilytools/files/
現在最新のschilytoolstarballは、再現可能なISO-9660ファイルシステムイメージのサポートを導入しました。 schily-2020-03-27.tar.bz2をフェッチ/コンパイル/インストールしてください。
いくつかの新しいオプションがあります:
-
-noatime
はmkisofs
に変更時刻を時間としてアーカイブするように指示します。 -
-creation-date
はPVDに作成日を設定します -
-expiration-date
はPVDに有効期限を設定します -
-effective-date
はPVDの発効日を設定します -
-reproducible-date
は、-effective-date
と-noatime
を除くすべての時間を設定します。
これは、バニラISO-9660ファイルシステムイメージ、およびRock Ridge
と。 http://schilytools.sourceforge.net/man/man8/mkisofs.8.html
更新されたコマンドラインは次のようになります。 :
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
--no-W
を追加して強制します。LD_PRELOAD
を使用してシステムクロックをエミュレートするlibfaketime
およびfaketime
ユーティリティがあります(if setuidではありません。schilytools
の新しいバージョンを公開しました。含まれている拡張mkisofs
には、再現可能なタイムスタンプのサポートが含まれています。更新された回答を参照してください。