42. Criando Imagens ISO no Terminal com Xorriso

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.
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 /
- 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 complemento 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 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. - cpr: equivale a "cp -r", copiando tudo, arquivos e pastas, recursivamente. Pode ser mais útil e recomendável que usar o "map".
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
clear: only_iso_version: deep_paths: long_paths: no_j_force_dots: always_gmt: old_rr
⋝ 1.5.6
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 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!
Comentários
Postar um comentário