如何使用 mkisofs/genisoimage 製作可重現的 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 )
在其他完全相同的文件中似乎只有 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 格式化部分使用文件的修改日期而不是上次讀取訪問的時間。
原始原始碼的經常更新版本是
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
另外。這適用於普通 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