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.py
e 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.txt
no 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.txt
está 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=N
procura um certo ponto no arquivo de saída (observe que seek=N
é diferente skip=N
porque skip
ignora bytes do arquivo de entrada!). Definimos, é claro, para onde está o texto de destino.
count=N
copie 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-1
bytes (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 | tail
e verificar se o último byte é 0a
(ou, em casos estranhos 0d
).
O processo é idêntico para um .iso
arquivo, apenas substitua mentalmente /dev/sdc
por your.iso
.
Observe que, quando você verifica o destino no seu ponto de montagem para ver se funcionou, pode ser necessário usá-lo strings
novamente (desta vez procurando seu script), pois o arquivo provavelmente ainda está no cache de leitura.