¿Cómo hacer un archivo iso reproducible con mkisofs/genisoimage?

¿Cómo hacer un archivo iso reproducible con mkisofs/genisoimage?

En un proceso automatizado se crea un archivo iso con extensión mkisofs. Incluso, como los datos originales son exactamente los mismos, los archivos iso resultantes no son los mismos (sus md5sumcambios). Desde rsync --checksumel resultado, no me gusta que, por supuesto, se vuelva a transferir la "misma iso" cada vez. Espero que principalmente las marcas de tiempo sean la principal diferencia.

¿Existe algún libfaketimeinterruptor incorporado para generar una vía iso mkisofsque de hecho sería lo mismo?

No sé si solo importan las marcas de tiempo. He comparado los archivos iso resultantes con su xxd isofilesalida de esta manera:

diff --side-by-side  --suppress-common-lines <(xxd a.iso) <(xxd b.iso )

y parece que solo hay 51 líneas que representan 16 bytes (es decir, aproximadamente 800 bytes de diferencia) en el mismo archivo.

El comando utilizado para generar esta ISO en cuestión es más o menos este:

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: ¿Me falta un parámetro de línea de comando rsyncque realiza una suma de verificación para fragmentos de ~1 MB de archivos grandes, para evitar la retransferencia cuando, como en mi caso, solo difieren unos 800 bytes?

Respuesta1

Primero una nota importante: no lo use genisoimageya que es una variante defectuosa de un modelo mkisofsde mayo de 2004.

Hasta mayo de 2007, se agregaron muchos errores específicos de Debian y desde entonces está muerto.

Lo importante que debe saber aquí es que genisoimagecrea imágenes defectuosas del sistema de archivos que en algún momento es posible que su sistema operativo ya no acepte...

Sin embargo , el funcionario mkisofstodavía se mantiene activamente y corrigió muchos errores no específicos de Debian en agosto de 2006. Actualmente no hay errores conocidos.

Ahora a su problema: está utilizando -R (Rock Rigde) y esto agrega UNIXmarcas de tiempo similares a los metadatos de los archivos. Este es el problema número 1....

El otro problema es que el superbloque del sistema de archivos ISO-9660 (oficialmente llamado descriptor_primario) contiene la fecha de creación y la fecha de modificación. Este último se puede controlar mediante la opción -modification-date.

Si cree que esta es una característica realmente necesaria, podría agregar una opción similar para la fecha de creación. Sin embargo, entonces aún necesitaría una opción para indicarle a la parte de formato de Rock Ridge que use la fecha de modificación de los archivos en lugar de la hora del último acceso de lectura.

Las versiones actualizadas frecuentemente de la fuente original son parte del schilytoolstarball que se puede recuperar de:http://sourceforge.net/projects/schilytools/files/

El último tarball de schilytools actualmente introdujo soporte para imágenes del sistema de archivos ISO-9660 reproducibles. Busque/compila/instale schily-2020-03-27.tar.bz2.

Hay algunas opciones nuevas:

  • -noatimeindica mkisofsque se archive la hora de modificación como una vez.

  • -creation-dateestablece la fecha de creación en el PVD

  • -expiration-dateestablece la fecha de vencimiento en el PVD

  • -effective-dateestablece la fecha de vigencia en el PVD

  • -reproducible-dateestablece todos los tiempos excepto -effective-datey -noatimeademás.

Esto funciona para imágenes del sistema de archivos estándar ISO-9660, así como para imágenes que contienen Rock Ridgey UDF. Vea la página de manual reciente en:http://schilytools.sourceforge.net/man/man8/mkisofs.8.html

Su línea de comando actualizada se vería de esta manera:

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

Respuesta2

Respuesta3

Las respuestas proporcionadas no funcionaron para mí, pero con la ayuda de algunos amigos descubrí una manera de crear imágenes ISO reproducibles a partir de carpetas arbitrarias, con xorriso.

La fecha debe exportarse como una variable de entorno. Los permisos de archivos pueden ser diferentes para diferentes personas, por lo que los obligamos a hacer algo. preparer_idvariará porque por defecto incluye el nombre completo de xorriso con la versión. uid/ gidtambién puede ser diferente en diferentes sistemas.

Este script acepta la ruta a la carpeta como argumento de inicio o como entrada solicitada. Sin embargo, no he probado la creación de imágenes del sistema operativo.

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"

información relacionada