Rsync

如何使用 mkisofs/genisoimage 製作可重現的 iso 文件?

  • April 14, 2021

在自動化過程中,使用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 )

在其他完全相同的文件中似乎只有 51 行代表 16 個字節(因此大約有 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/"

BS:我是否遺漏了一個命令行參數開關,它對rsync~1MB 的大文件塊進行校驗和,以防止在我的情況下只有大約 800 個字節不同時重新傳輸?

首先要注意的是:不要使用,因為它是2004 年 5 月以來genisoimage的 a 有缺陷的變體。mkisofs

到 2007 年 5 月為止,已經添加了大量 Debian 特定的錯誤,從那時起它就死了。

這裡要知道的重要一點是,它genisoimage會創建有缺陷的文件系統映像,有時您的作業系統可能不再接受這些映像……

然而,官方mkisofs仍然積極維護並在 2006 年 8 月修復了大量非 Debian 特定的錯誤。目前沒有已知的錯誤。

現在解決您的問題:您正在使用 -R (Rock Rigde),這會將UNIX時間戳添加到文件元數據中。這是第一個問題……

另一個問題是 ISO-9660 文件系統超級塊(官方稱為 primary_descriptor)包含創建日期和修改日期。後者可以通過選項來控制-modification-date

如果您認為這是一個真正需要的功能,我可以為創建日期添加一個類似的選項。但是,您仍然需要一個選項來告訴 Rock Ridge 格式化部分使用文件的修改日期而不是上次讀取訪問的時間。

原始原始碼的經常更新版本是schilytoolstarball 的一部分,可以從以下位置檢索: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另外。

這適用於普通 ISO-9660 文件系統映像以及包含Rock RidgeUDF. 請參閱最近的手冊頁: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

引用自:https://unix.stackexchange.com/questions/572751