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 md5sum
cambios). Desde rsync --checksum
el 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 libfaketime
interruptor incorporado para generar una vía iso mkisofs
que de hecho sería lo mismo?
No sé si solo importan las marcas de tiempo. He comparado los archivos iso resultantes con su xxd isofile
salida 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 rsync
que 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 genisoimage
ya que es una variante defectuosa de un modelo mkisofs
de 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 genisoimage
crea 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 mkisofs
todaví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 UNIX
marcas 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 schilytools
tarball 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:
-noatime
indicamkisofs
que se archive la hora de modificación como una vez.-creation-date
establece la fecha de creación en el PVD-expiration-date
establece la fecha de vencimiento en el PVD-effective-date
establece la fecha de vigencia en el PVD-reproducible-date
establece todos los tiempos excepto-effective-date
y-noatime
además.
Esto funciona para imágenes del sistema de archivos estándar ISO-9660, así como para imágenes que contienen Rock Ridge
y 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
La gente cambió axorrisocomouno podría querer evitar mkisofsy la genisoimagen parece no desarrollarse más.
Puedes usar xorriso directamente o suModo de compatibilidad de mkisofs llamado xorrisofs.
SOURCE_DATE_EPOCH=0 xorrisofs YOUR-MKISOFS-ARGS
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_id
variará porque por defecto incluye el nombre completo de xorriso con la versión. uid
/ gid
tambié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"