Como fazer um arquivo iso reproduzível com mkisofs/genisoimage?

Como fazer um arquivo iso reproduzível com mkisofs/genisoimage?

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 md5sumalterações). Como eu sou rsync --checksumo 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 libfaketimeopção de construção para gerar uma iso via mkisofsque 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 isofilesaí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 rsyncque 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, genisoimagepois é uma variante com defeito de mkisofsmaio 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 genisoimagecria imagens defeituosas do sistema de arquivos que em algum momento podem não ser mais aceitas pelo seu sistema operacional...

No entanto, o oficial mkisofsainda é 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 UNIXcarimbos 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 schilytoolstarball 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:

  • -noatimediz mkisofspara arquivar o horário da modificação como atime.

  • -creation-datedefine a data de criação no PVD

  • -expiration-datedefine a data de validade no PVD

  • -effective-datedefine a data de vigência no PVD

  • -reproducible-datedefine todos os tempos, exceto -effective-datee -noatimealém.

Isso funciona para imagens de sistema de arquivos ISO-9660 vanilla, bem como para imagens que contêm Rock Ridgee 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.

Para tornar a saída do xorriso reproduzível, defina a variável de ambiente chamada SOURCE_DATE_EPOCH com o mesmo valor de segundos desde 1º de janeiro de 1970.

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_idirá variar porque por padrão inclui o nome completo do xorriso com a versão. uid/ gidtambé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"

informação relacionada