如何使用 mkisofs/genisoimage 製作可複製的 iso 檔案?

如何使用 mkisofs/genisoimage 製作可複製的 iso 檔案?

在自動化過程中,將使用 .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 格式化部分使用檔案的修改日期而不是上次讀取存取的時間。

經常更新的原始來源版本是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 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"

相關內容