В автоматизированном процессе файл 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 использовать дату изменения файлов вместо времени последнего доступа для чтения.
Часто обновляемые версии исходного кода являются частью 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
Люди перешли наxorrisoкаккто-то может захотеть избежать mkisofsи генизоимидж, похоже, не получил дальнейшего развития.
Вы можете использовать xorriso напрямую или егорежим совместимости mkisofs с именем xorrisofs.
SOURCE_DATE_EPOCH=0 xorrisofs YOUR-MKISOFS-ARGS
решение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"