Em um processo automatizado, um arquivo iso é criado com a extensão mkisofs
. Mesmo que os dados originais sejam exatamente os mesmos, os arquivos iso resultantes não são os mesmos (suas md5sum
alterações). Como eu sou rsync --checksum
o resultado, não gosto que o "mesmo iso" seja retransferido todas as vezes. Espero que principalmente os carimbos de data e hora sejam a principal diferença.
Existe alguma libfaketime
opção de construção para gerar uma iso via mkisofs
que seria de fato a mesma.
Não sei se apenas os carimbos de data e hora importam. Comparei os arquivos iso resultantes com sua xxd isofile
saída assim:
diff --side-by-side --suppress-common-lines <(xxd a.iso) <(xxd b.iso )
e parece haver apenas 51 linhas representando 16 bytes (cerca de 800 bytes de diferença) no mesmo arquivo.
O comando usado para gerar esta iso em questão é aproximadamente 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: Estou faltando uma opção de parâmetro de linha de comando rsync
que faz a soma de verificação para pedaços de ~ 1 MB de arquivos grandes, para evitar a retransferência quando, como no meu caso, apenas cerca de 800 bytes diferem?
Responder1
Primeiro, uma observação importante: não use, genisoimage
pois é uma variante com defeito de mkisofs
maio de 2004.
Até maio de 2007, muitos bugs específicos do Debian foram adicionados e desde então ele está morto.
O importante a saber aqui é que genisoimage
cria imagens defeituosas do sistema de arquivos que em algum momento podem não ser mais aceitas pelo seu sistema operacional...
No entanto, o oficial mkisofs
ainda é mantido ativamente e corrigiu muitos bugs específicos não-Debian em agosto de 2006. Atualmente não há bugs conhecidos.
Agora, para o seu problema: você está usando -R (Rock Rigde) e isso adiciona UNIX
carimbos de data e hora semelhantes aos metadados dos arquivos. Este é o problema número 1....
O outro problema é que o superbloco do sistema de arquivos ISO-9660 (oficialmente chamado de Primary_descriptor) contém a data de criação e a data de modificação. Este último pode ser controlado através da opção -modification-date
.
Se você acredita que este é um recurso realmente necessário, eu poderia adicionar uma opção semelhante para a data de criação. No entanto, você ainda precisaria de uma opção para informar à parte de formatação do Rock Ridge para usar a data de modificação dos arquivos em vez da hora do último acesso de leitura.
Versões frequentemente atualizadas da fonte original fazem parte do schilytools
tarball que pode ser recuperado em:http://sourceforge.net/projects/schilytools/files/
O tarball schilytools mais recente introduziu suporte para imagens de sistema de arquivos ISO-9660 reproduzíveis. Por favor, busque/compile/instale schily-2020-03-27.tar.bz2.
Existem algumas novas opções:
-noatime
dizmkisofs
para arquivar o horário da modificação como atime.-creation-date
define a data de criação no PVD-expiration-date
define a data de validade no PVD-effective-date
define a data de vigência no PVD-reproducible-date
define todos os tempos, exceto-effective-date
e-noatime
além.
Isso funciona para imagens de sistema de arquivos ISO-9660 vanilla, bem como para imagens que contêm Rock Ridge
e UDF
. Veja a página de manual recente em:http://schilytools.sourceforge.net/man/man8/mkisofs.8.html
Sua linha de comando atualizada ficaria assim:
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
Responder2
As pessoas mudaram paraxorrisocomoalguém pode querer evitar mkisofse a genisoimagem parece não ter sido mais desenvolvida.
Você pode usar o xorriso diretamente ou seumodo de compatibilidade mkisofs chamado xorrisofs.
SOURCE_DATE_EPOCH=0 xorrisofs YOUR-MKISOFS-ARGS
Responder3
As respostas fornecidas não funcionaram para mim, mas com a ajuda de alguns amigos descobri uma maneira de criar imagens ISO reproduzíveis a partir de pastas arbitrárias, com xorriso
A data deve ser exportada como uma variável de ambiente. As permissões de arquivo podem ser diferentes para pessoas diferentes, então as forçamos a fazer alguma coisa. preparer_id
irá variar porque por padrão inclui o nome completo do xorriso com a versão. uid
/ gid
também pode ser diferente em sistemas diferentes.
Este script aceita o caminho para a pasta como argumento de inicialização ou como entrada solicitada. Ainda não tentei a criação de imagens do sistema operacional.
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"