自動化されたプロセスでは、 で iso ファイルが作成されますmkisofs
。元のデータはまったく同じであっても、結果の iso ファイルは同じではありません (md5sum
変更点があります)。 結果が であるためrsync --checksum
、毎回「同じ iso」が再転送されるのは好ましくありません。主な違いはタイムスタンプであると思われます。
実際に同じlibfaketime
ISO を生成するための組み込みスイッチはありますか。mkisofs
タイムスタンプだけが重要なのかはわかりません。結果の ISO ファイルとそのxxd isofile
出力を次のように比較しました。
diff --side-by-side --suppress-common-lines <(xxd a.iso) <(xxd b.iso )
そして、まったく同じファイルには、16 バイトを表す 51 行 (つまり、約 800 バイトの差) しかないようです。
問題の 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/"
rsync
BS:私の場合のように 800 バイト程度しか違わなかったときに再転送を防ぐために、約 1 MB の大きなファイルのチャンクのチェックサムを実行するコマンド ライン パラメータ スイッチが足りないのでしょうか?
答え1
genisoimage
まず重要な注意事項:これは 2004 年 5 月の欠陥のある変種なので使用しないでくださいmkisofs
。
2007 年 5 月までに、Debian 固有のバグが多数追加され、それ以降は Debian は機能しなくなりました。
ここで知っておくべき重要なことは、genisoimage
欠陥のあるファイルシステム イメージが作成され、それがいつか OS で受け入れられなくなる可能性があるということです...
ただし、公式バージョンmkisofs
は引き続き積極的に保守されており、2006 年 8 月には Debian に固有ではない多くのバグが修正されました。現在、既知のバグはありません。
さて、あなたの問題ですが、-R (Rock Rigde) を使用しており、これによりUNIX
タイムスタンプのようなものがファイルのメタデータに追加されます。これが問題番号 1 です...
もう 1 つの問題は、ISO-9660 ファイルシステムのスーパー ブロック (正式には primary_descriptor と呼ばれます) に作成日と変更日が含まれていることです。後者は、オプションを使用して制御できます-modification-date
。
これが本当に必要な機能だと思われる場合は、作成日に対して同様のオプションを追加できます。ただし、その場合、Rock Ridge のフォーマット部分に、最後の読み取りアクセスの時刻ではなく、ファイルの変更日を使用するように指示するオプションも必要になります。
頻繁に更新される元のソースのバージョンは、次の場所schilytools
から取得できる tarball の一部です。http://sourceforge.net/projects/schilytools/files/
現在最新の schilytools tarball では、再現可能な ISO-9660 ファイルシステム イメージのサポートが導入されました。schily-2020-03-27.tar.bz2 を取得/コンパイル/インストールしてください。
いくつかの新しいオプションがあります:
-noatime
mkisofs
変更時刻を atime としてアーカイブするように指示します。-creation-date
PVDの作成日を設定します-expiration-date
PVDの有効期限を設定します-effective-date
PVDの有効日を設定する-reproducible-date
-effective-date
およびを除くすべての時間を設定します-noatime
。
Rock Ridge
これは、標準の ISO-9660 ファイルシステム イメージだけでなく、およびを含むイメージでも機能しますUDF
。最新の man ページを参照してください。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
答え2
人々は切り替えたゾリソとしてmkisofsを避けたいかもしれないそして、genisoimage はこれ以上開発されないようです。
xorriso 出力を再現可能にするには、SOURCE_DATE_EPOCH という環境変数を 1970 年 1 月 1 日からの秒数と同じ値に設定します。
xorrisoを直接使用することも、mkisofs 互換モード xorrisofs。
SOURCE_DATE_EPOCH=0 xorrisofs YOUR-MKISOFS-ARGS
答え3
提供された回答は私には役に立たなかったが、友人の助けを借りて、xorrisoを使用して任意のフォルダから再現可能なISOイメージを作成する方法を見つけた。
日付は環境変数としてエクスポートする必要があります。ファイル権限は人によって異なる可能性があるため、何らかの権限を強制します。preparer_id
デフォルトでは xorriso のフルネームとバージョンが含まれるため、異なります。/uid
もgid
システムによって異なる場合があります。
このスクリプトは、フォルダーへのパスを起動引数として、またはプロンプト入力として受け入れます。ただし、OS イメージの作成には試していません。
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"