Tux Zine banner
Article Thumbnail

Criando Imagens ISO no Terminal com Xorriso

📅 Sáb, 4 nov 2023, 18:41 👤 Nerun


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:

Significa:

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.

No formato a seguir, a barra invertida \ indica uma quebra de linha no comando no terminal, informando que o comando continua na linha seguinte. Se você esquecer essa barra o comando vai dar erro. Você pode colocar tudo numa única linha também. Fiz assim para maior visibilidade.

$ 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/pasta_a_gravar / \
    -cpr /home/user/arquivo_a_gravar /

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.5

⋝ 1.5.6

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 usadas 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 exemplo, 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 vale o aprendizado.

E ficamos por aqui!

🔝