Как создать воспроизводимый iso-файл с помощью mkisofs/genisoimage?

Как создать воспроизводимый iso-файл с помощью 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который выполняет контрольную сумму для фрагментов больших файлов размером около 1 МБ, чтобы предотвратить повторную передачу, когда, как в моем случае, различаются всего около 800 байт?

решение1

Для начала важное замечание: не используйте, genisoimageтак как это дефектный вариант mkisofsот мая 2004 года.

За период до мая 2007 года было добавлено множество ошибок, специфичных для Debian, и с тех пор он мертв.

Здесь важно знать, что genisoimageсоздаются дефектные образы файловой системы, которые со временем могут перестать приниматься вашей ОС...

Однако официальный дистрибутив mkisofsпо-прежнему активно поддерживается и исправил множество ошибок, не относящихся к Debian, по состоянию на август 2006 года. В настоящее время об ошибках ничего не известно.

Теперь о вашей проблеме: вы используете -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

решение3

Предоставленные ответы мне не помогли, но с помощью друзей я нашел способ создания воспроизводимых образов ISO из произвольных папок с помощью xorriso.

Дата должна быть экспортирована как переменная окружения. Разрешения на доступ к файлам могут быть разными для разных людей, поэтому мы заставляем их что-то делать. 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"

Связанный контент