Páginas

sábado, 4 de novembro de 2023

42. Criando Imagens ISO no Terminal com Xorriso

Não tinha imagem mais
horrorosa pra ilustrar não?

A interface de linha de comando clássica para produção de imagens de sistema de arquivos ISO 9660 é o conjunto de opções estabelecido pelo programa mkisofs. Por razões de licenciamento e outros problemas com seu autor, o Debian lançou um fork do mkisofs, chamado genisoimage, criado em 2006 e desenvolvido de forma independente a partir de então.

No entanto, o genisoimage não recebe novos recursos e nem mesmo correções de bugs. É a primeira escolha apenas se as suas opções -udf ou -hfs forem necessárias.

A substituição na maioria dos casos, especialmente para sistemas de arquivos ISO 9660 inicializáveis, é o xorrisofs que inicia o modo de emulação -as mkisofs do programa xorriso.

— trecho extraído da wiki Debian.

Na maioria dos sistemas Debian-like o "mkisofs" é somente um alias para o "genisoimage". Por exemplo, no Linux Mint 21.2:

$ mkisofs --help
Usage: genisoimage [options] file...
Options:
  -nobak                      Do not include backup files
  -no-bak                     Do not include backup files
(...)

Então, se mkisofs é só um alias do genisoimage e o xorrisofs é um modo de emulação do mkisofs, para criar uma imagem ISO usando mkisofs, genisoimage ou xorrisofs, o formato é o mesmo, só muda o nome do programa:

  • mkisofs -v -J -r -V NOME_DO_DISCO -o /home/user/arquivo.iso /home/user/arquivos_a_gravar
  • genisoimage -v -J -r -V NOME_DO_DISCO -o /home/user/arquivo.iso /home/user/arquivos_a_gravar
  • xorrisofs -v -J -r -V NOME_DO_DISCO -o /home/user/arquivo.iso /home/user/arquivos_a_gravar

Significa:

  • -v (minúsculo) "verbose", emite avisos sobre problemas menores ou fatos dignos de nota.
  • -J nomes de arquivos Joliet são especificados em Unicode de 16 bits e cada componente do caminho pode ter até 64 caracteres Unicode. O Linux usará esta árvore se nenhuma informação do Rock Ridge for adicionada à árvore do diretório principal.
  • -r permite a produção de informações Rock Ridge que registram propriedades típicas de arquivos POSIX, como propriedade, permissões, carimbos de data e hora, tipo de arquivo, destino de link simbólico. Diferente da opção -R ela não preserva a propriedade como no disco rígido, mas define o UID do proprietário como 0 e as permissões como somente leitura e somente inspeção para todos. Se Rock Ridge estiver presente, o Linux montará a árvore de diretórios principal e usará Rock Ridge para mostrar nomes longos com caracteres originais.
  • -V (maiúsculo) define o nome do sistema de arquivos ISO 9660. Ele será usado como nome do link no diretório /dev/disk/by-label quando o meio óptico escrito for inserido em uma unidade de leitura que é monitorada pelo udev. Use seu próprio nome exclusivo em vez de NOME_DO_DISCO.
  • -o define o nome do arquivo de imagem ISO 9660 resultante. Use qualquer caminho adequado em vez de /home/user/arquivo.iso.
  • O argumento /home/user/arquivos_a_gravar não faz parte de nenhuma opção. É usado como caminho de um arquivo ou diretório de entrada que deve ser copiado para o sistema de arquivos ISO 9660. Se for um diretório, todos os arquivos e diretórios abaixo também serão copiados.

Mais de um caminho de entrada pode ser fornecido. Neste caso é melhor usar a opção -graft-points e pathspecs no formato target=source.

Agora usando xorriso, mas não em modo de emulação!

Aqui vamos nós, ele pode ser tão complexo quanto se queira. Vou começar pelo formato mais difícil, que é mais completo e não é tão fácil quanto o estilo clássico do mkisofs acima, mas vale a pena aprender.

$ xorriso \
    -x \
    -rockridge on -find / -exec mkisofs_r -- \
    -volid "NOME_DO_DISCO" \
    -for_backup \
    -joliet on \
    -compliance "iso_9660_level=3:deep_paths:long_paths:long_names" \
    -file_size_limit off -- \
    -outdev /home/user/arquivo.iso \
    -blank as_needed \
    -map /home/user/arquivos_a_gravar /
  • x: é útil quando você pretende usar muitos comandos e argumentos. Ele permite que eles sejam executados em uma ordem que faça sentido para o xorriso. Ou seja, você escreve na ordem que quiser, e o xorriso entende do jeito certo!
  • rockridge on: o mesmo que "-r" para o mkisofs, habilita Rock Ridge para compatibilidade POSIX.
  • find / -exec mkisofs_r --: é um complento ao rockridge on. Encontra todos os arquivos na ISO e aplica a opção mkisofs -r (o "--" encerra esse comando especificamente). A user id e group id viram 0, todas as permissões r são garantidas, todos w negados. Se tiver permissão x, é garantida pra todos. s- e t-bits são removidas.
  • volid "NOME_DO_DISCO" o mesmo que -V no mkisofs. Só que não tem atalho, tem que escrever -volid mesmo.
  • for_backup: atalho para uma série de outros comandos perfeitos para backup, que gravam permissões, nomes de usuários checksums etc
    • hardlinks on – preserva as relações de hardlinks.
    • acl on – preserva o Controle de Lista de Acesso.
    • xattr any – preserva os atributos extendidos dos arquivos.
    • md5 on – habilita o processamento de checksums md5.
  • joliet on: mesmo que -J no mkisofs. Nomes Joliet.
  • compliance "iso_9660_level=3:deep_paths:long_paths:long_names": permite alterar as regras de gravação, inserindo uma "lista de relaxamento", que são aquelas flexibilizações. E aqui as coisas ficam muito divertidas:
    • iso_9660_level=3 – nomes de arquivos com até 32 caracteres e até 400 gigas de tamanho.
    • deep_paths – permite caminhos de arquivos com mais de 8 níveis de subpastas.
    • long_paths – nomes de caminhos de arquivos com mais de 255 caracteres.
    • long_names – altera a ISO level 3 pra permitir não 32, mas sim 37 caracteres.
  • file_size_limit off -- desliga o limite de tamanho de arquivo, qualquer tamanho é permitido, ele sobrescreve as regras do iso_9660_level=3.
  • outdev deve ser fornecido, é o caminho onde o arquivo de imagem será criado: /home/user/arquivo.iso.
  • blank as_needed: ele permite lidar melhor com medias que serão gravadas em CD-RW ou DVD-RW.
  • map: a fonte ou origem das pastas e arquivos e ONDE eles devem ser salvos na ISO. Por exemplo -map /home/user/Imagens /imagens gravará o conteúdo da pasta /home/user/Imagens da sua máquina na pasta "imagens" na raiz da imagem ISO. Você pode adicionar tantos "-map" quanto quiser. Se não der uma pasta de destino na ISO (pode ser um simples "/") o conteúdo será gravado na ISO com o mesmo caminho da sua máquina. Então /home/user/Imagens será salvo em /home/user/Imagens na ISO.

O comando mínimo para criar uma ISO seria:

$ xorriso -outdev /home/user/arquivo.iso -map /home/user/arquivos_a_gravar /

É importante não esquecer dessa "/" no final do comando, lembre-se que ela diz o destino dos arquivos na ISO, nesse caso a raiz.

Notas sobre a opção "-compliance"

Vocês leram sobre a opção -compliance e suas regras. Existem regras default (padrões), que são aquelas aplicadas automaticamente se a opção não for usada. Mesmo se você usar essa opção de "compliance", as regras que você colocar serão somadas às regras padrões já existentes. A não ser que você use a regra clear (limpar), que vai zerar a lista de relaxamento (o "default"). A lista de regras fica vazia, o que você indicar serão as únicas regras de relaxamento que serão aplicadas à ISO.

E quais são as regras padrões (default)? Depende... Qual versão do xorriso você está usando? Para descobrir quais as regras padrões que são usadas com a sua versão é preciso ler o manual: man xorriso.

Para não ter que ler o manual todo – mas eu recomendo, vale à pena – você pode usar o grep e extrair logo:

$ man xorriso | grep "compliance rule" -A 45

Para ler o manual online da última versão do xorriso, clique aqui.

Por exemplo, o Linux Mint 21.2 está usando o xorriso 1.5.4 e a verão mais atual do Projeto GNU é a 1.5.7. E isso faz toda a diferença. As regras default do compliance, separadas por ":", conforme a versão são:

1.5.4

  • "clear: only_iso_version: deep_paths: long_paths: no_j_force_dots: always_gmt: old_rr"

1.5.7

  • "clear: iso_9660_level=3: only_iso_version: deep_paths: long_paths: no_j_force_dots: always_gmt: rec_mtime: old_rr: max_ce_entries=31: max_ce_drop=xattr_acl"

No exemplo que eu dei anteriormente eu usei as regras: "iso_9660_level=3: deep_paths: long_paths: long_names". Algumas delas não eram necessárias, pois a minha versão é a 1.5.4 então eu poderia ter tirado a deep_paths e a long_paths, pois já constam na lista padrão e seriam usada de qualquer modo. A não ser que eu tivesse iniciado minha "compliance" pela regra clear, caso em que todo o default seria apagado e essas regras não seriam usadas, então eu as teria que colocar.

Ainda no meu exmeplo, long_names nem é mesmo necessário, afinal ele só faz é ampliar os nomes de arquivos de 32 para 37 caracteres. Nem é grande coisa. Como eu uso a versão 1.5.4 então bastaria colocar apenas -compliance "iso_9660_level=3" e isso somente se na minha ISO tivessem arquivos com mais de 4.2 GB (4 GiB). Caso eu estivesse usando a versão 1.5.7 eu nem usaria a opção compliance.

ISOs são pouco usadas hoje em dia, geralmente apenas com sistemas operacionais, mas ainda valem o aprendizado.

E ficamos por aqui!

Nenhum comentário:

Postar um comentário