mkisofs/genisoimageを使用してコピー可能なisoファイルを作成するには?

mkisofs/genisoimageを使用してコピー可能なisoファイルを作成するには?

自動化プロセス中に.isoファイルを使用してISOファイルが生成されますmkisofs。元のデータがまったく同じであるため、結果のisoファイルも異なります(md5sum変更)。私の結果のため、rsync --checksum毎回「同じISO」を再送信するのは好きではありません。タイムスタンプが大きな違いになると予想しました。

同じ方法でisoを生成できる内蔵スイッチはありますかlibfaketimemkisofs

タイムスタンプだけが重要かどうか疑問に思います。生成された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バイトだけが同時に再送信されるのを防ぐために、約1MBの大きなファイルブロックをチェックサムするコマンドライン引数スイッチがありませんか?

答え1

genisoimage最初の重要な注意:この製品は2004年5月にリリースされたバリエーションであるため、使用しないでくださいmkisofs

2007年5月現在、Debian特有のバグが大挙追加され、その後消えた。

ここで知っておくべき重要な点は、genisoimage欠陥のあるファイルシステムイメージの作成が、オペレーティングシステムで許可されなくなることがあることです。

しかし、mkisofsまだ活発に維持管理されており、Debianに限定されていない多数のバグが2006年8月に修正されました。現在、既知のバグはありません。

これで問題を解決するには、UNIXファイルメタデータにタイムスタンプを追加する -R(Rock Rigde)を使用しています。質問1です。

別の問題は、ISO-9660ファイルシステムスーパーブロック(公式にはPrimary_descriptorと呼ばれる)に作成日と変更日が含まれていることです。後者はオプションで制御できます-modification-date

これが本当に必要な機能だと思う場合は、作成日に同様のオプションを追加できます。ただし、最後の読み取りアクセス時間ではなく、ファイル変更日を使用するようにロック・リッジの書式設定セクションに指示するオプションがまだ必要です。

頻繁に更新される元のソースバージョンはschilytoolstarballの一部であり、以下から検索できます。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

これは、通常のISO-9660ファイルシステムイメージとおよびをRock Ridge含むイメージに適用されますUDF。最新のマニュアルページを参照してください。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

人々は転換するソリゾ〜のように人々はmkisofを避けたいかもしれません。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"

関連情報