mkisofs/genisoimage を使用して再現可能な ISO ファイルを作成する方法は?

mkisofs/genisoimage を使用して再現可能な ISO ファイルを作成する方法は?

自動化されたプロセスでは、 で iso ファイルが作成されますmkisofs。元のデータはまったく同じであっても、結果の iso ファイルは同じではありません (md5sum変更点があります)。 結果が であるためrsync --checksum、毎回「同じ iso」が再転送されるのは好ましくありません。主な違いはタイムスタンプであると思われます。

実際に同じlibfaketimeISO を生成するための組み込みスイッチはありますか。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/"

rsyncBS:私の場合のように 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 を取得/コンパイル/インストールしてください。

いくつかの新しいオプションがあります:

  • -noatimemkisofs変更時刻を atime としてアーカイブするように指示します。

  • -creation-datePVDの作成日を設定します

  • -expiration-datePVDの有効期限を設定します

  • -effective-datePVDの有効日を設定する

  • -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 のフルネームとバージョンが含まれるため、異なります。/uidgidシステムによって異なる場合があります。

このスクリプトは、フォルダーへのパスを起動引数として、またはプロンプト入力として受け入れます。ただし、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"

関連情報