在自動化過程中,將使用 .iso 檔案建立 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 字節不同時重新傳輸?
答案1
首先重要說明:請勿使用,genisoimage
因為它是 2004 年 5 月的有缺陷的變體mkisofs
。
截至 2007 年 5 月,大量 Debian 特有的 bug 被添加,從那時起它就消失了。
這裡要知道的重要一點是genisoimage
創建有缺陷的檔案系統映像,這些映像有時可能不再被您的作業系統接受...
然而,官方mkisofs
仍在積極維護並於 2006 年 8 月修復了大量非 Debian 特定的錯誤。
現在解決您的問題:您正在使用 -R (Rock Rigde),這會UNIX
向檔案元資料添加時間戳記。這是問題 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
另外之外的所有時間。
這適用於普通 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
人們切換到克索里索作為人們可能想避免 mkisofgenisoimage 似乎沒有進一步開發。
為了使 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
在不同的系統上也可以不同。
此腳本接受資料夾路徑作為啟動參數或提示輸入。不過還沒有嘗試過建立作業系統映像。
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"