Como editar imagens ISO (incluindo ISOs inicializáveis)

30

Estou procurando ferramentas para o Ubuntu que possam ser usadas para editar imagens ISO. Incluindo imagens ISO inicializáveis, como ISOs Ubuntu e Windows. Não apenas edite, mas salve o ISO editado e ainda pode inicializar quando gravado em uma unidade USB ou CD / DVD.

Luis Alvarado
fonte

Respostas:

42

Mestre ISO instale o isomaster

Eu usei o ISO Master para adicionar arquivos aos ISOs antes. É adequado para o que você precisa, pois mantém o estado de inicialização ou não da ISO. Eu o usei no passado para adicionar outro conteúdo (como música) a um disco ao vivo. Observe, no entanto, que após fazer alterações em um arquivo ISO, você pode apenas "Salvar como", ou seja, outro arquivo ISO será criado, portanto, verifique se há espaço em disco suficiente para ambos.

isomaster

dv3500ea
fonte
2

A PowerISO acaba de lançar uma versão Linux do seu software de edição ISO. Como o ISO Master , ele mantém o estado de inicialização ou não do ISO. No entanto, ele permite que você salve diretamente no arquivo original (excluindo-o primeiro), para que não haja espaço em disco suficiente para os dois arquivos. Também acho sua interface mais fácil e intuitiva do que a ISO Master.

captura de tela do PowerISO para Linux

Ploni
fonte
1

A resposta comum para isso é descompactar o arquivo iso, modificá-lo e empacotá-lo novamente. Parece que "ISO Master", como mencionado na resposta do dv3500ea, é um bom front-end para fazer isso.

E se:

  • você não tem espaço suficiente para isso
  • você só quer fazer uma modificação cirúrgica em vez de reescrever tudo
  • você deseja modificar um dispositivo de armazenamento que contenha um sistema de arquivos isofs (também conhecido como iso9660) sem copiar o dispositivo inteiro ou
  • se você acha que essa coisa de descompactar / reembalar não é hacky o suficiente

Então esta resposta é para você!

Em resumo, substituiremos um arquivo existente no sistema de arquivos isofs pelo nosso arquivo desejado. Nosso arquivo desejado deve ser menor que o arquivo (destino) existente e o espaço em branco à direita (ou lixo) deve ser aceitável. Na verdade, isso requer apenas dois comandos, mas tenha cuidado: um erro de digitação pode destruir completamente o sistema de arquivos de destino ou até substituir o arquivo de origem. Os backups são seus amigos!

No meu caso, eu queria armazenar um script em uma inicialização ao vivo para não precisar digitá-lo novamente todas as vezes. O script está em script.pye meu alvo (um pendrive) está em /dev/sdc. O tamanho do script é 202 bytes; portanto, nosso primeiro passo é encontrar um arquivo maior que 202 bytes, para que possamos substituí-lo. Depois de montá-lo em /mnt, encontrei um arquivo adequado em /mnt/info.txt.

Não podemos simplesmente sobrescrever info.txtno ponto de montagem, ele irá reclamar que é um sistema de arquivos somente leitura. Nós somos raiz, no entanto, então vamos mostrar o que isso significa! Precisamos descobrir onde info.txtestá o sistema de arquivos. Encontre alguma string que seja (provavelmente) exclusiva info.txt, por exemplo This is the official distribution CD of X., e procure-a no disco:

$ sudo strings -a -t d /dev/sdc | grep 'CD of X.'
2573588480 This is the official distribution CD of X. See INSTALL for how to [...]

Alternativamente, isso também pode ser feito com grep, que é muito mais rápido, mas então você precisa especificá-lo desde o início: $ sudo grep -oba 'This is ...' /dev/sdc.

Agora que sabemos onde está, precisamos substituir esses bytes pelo nosso arquivo:

$ sudo dd if=script.py of=/dev/sdc conv=notrunc bs=1 seek=2573588480 count=202

Está linha:

  • copia bytes do arquivo de entrada ( if) para o arquivo de saída ( of) e não se importa que o arquivo de saída seja realmente um dispositivo, porque "tudo é um arquivo".
  • conv=notrunc diz para não truncar o arquivo de saída, porque queremos sobrescrever apenas alguns bytes, não sobrescrever o arquivo a partir de um certo ponto em diante.
  • bs=1 define o tamanho do bloco como 1. Você normalmente deseja um tamanho de bloco de 4k ou superior, mas isso evita a necessidade de fazer cálculos (em linha) e permite especificar a localização exata do byte.
  • seek=Nprocura um certo ponto no arquivo de saída (observe que seek=Né diferente skip=Nporque skipignora bytes do arquivo de entrada!). Definimos, é claro, para onde está o texto de destino.
  • count=Ncopie somente esse número de bytes. Eu acho que isso pode ser omitido porque ele notará o final do arquivo de entrada, mas eu o deixei apenas para ter certeza.

E pronto, o arquivo é substituído!

Mas espere, o arquivo de destino era maior que o nosso script; portanto, no pendrive, o arquivo agora é algo como: "enquanto executa se executa () blá; blá (); sim, 2007 X Inc.". Há lixo à direita. Duas maneiras de corrigir isso: aumentar nosso arquivo de entrada (adicionar espaços) ou adicionar um símbolo de comentário no final. Observe que muitos editores adicionam uma nova linha no final; portanto, convém definir count=para N-1bytes (se o seu arquivo for agora de 203 bytes e você perceber que o último byte é uma nova linha, defina contagem como 202). Você pode verificar se há novas linhas em um arquivo xxd script.py | taile verificar se o último byte é 0a(ou, em casos estranhos 0d).

O processo é idêntico para um .isoarquivo, apenas substitua mentalmente /dev/sdcpor your.iso.

Observe que, quando você verifica o destino no seu ponto de montagem para ver se funcionou, pode ser necessário usá-lo stringsnovamente (desta vez procurando seu script), pois o arquivo provavelmente ainda está no cache de leitura.

Luc
fonte