La risposta comune a questo è decomprimere il file ISO, modificarlo e imballarlo di nuovo. Sembra che "ISO Master", come menzionato nella risposta di dv3500ea, sia un buon front-end per farlo.
Se:
- non hai abbastanza spazio per quello
- vuoi solo fare una modifica chirurgica invece di riscrivere il tutto
- si desidera modificare un dispositivo di archiviazione che contiene un filesystem isofs (aka iso9660) senza copiare l'intero dispositivo, oppure
- se pensi che questa cosa di disimballaggio / reimballaggio non sia abbastanza confusa
Quindi questa risposta è per te!
In breve, sostituiremo un file esistente nel filesystem isofs con il nostro file desiderato. Il nostro file desiderato deve essere più piccolo del file esistente (di destinazione) e gli spazi vuoti finali (o immondizia) devono essere accettabili. Questo in realtà richiede solo due comandi, ma fai attenzione: un errore di battitura può distruggere completamente il file system di destinazione o persino sovrascrivere il file di origine. I backup sono i tuoi amici!
Nel mio caso, volevo archiviare uno script in un avvio live in modo da non doverlo digitare nuovamente ogni volta. Lo script è a script.pye il mio target (una chiavetta USB) è a /dev/sdc. La dimensione dello script è di 202 byte, quindi il nostro primo passo è trovare un file più grande di 202 byte, in modo da poterlo sovrascrivere. Dopo averlo montato su /mnt, ho trovato un file adatto su /mnt/info.txt.
Non possiamo semplicemente sovrascrivere info.txtsul mountpoint, ci si lamenterà che è un filesystem di sola lettura. Siamo root, però, quindi mostriamo loro cosa significa! Dobbiamo capire dove si info.txttrova il filesystem. Trova una stringa che è (probabilmente) unica per info.txt, per esempio This is the official distribution CD of X., e cercala sul 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 [...]
In alternativa, questo può essere fatto anche con grep, che è molto più veloce, ma poi è necessario specificare fin dall'inizio: $ sudo grep -oba 'This is ...' /dev/sdc.
Ora che sappiamo dove si trova, dobbiamo solo sostituire quei byte con il nostro file:
$ sudo dd if=script.py of=/dev/sdc conv=notrunc bs=1 seek=2573588480 count=202
Questa linea:
- copia i byte dal file di input (
if) nel file di output ( of) e non importa che il file di output sia effettivamente un dispositivo, perché "tutto è un file".
conv=notrunc gli dice di non troncare il file di output, perché vogliamo sovrascrivere solo pochi byte, non sovrascrivere il file da un certo punto in poi.
bs=1 imposta la dimensione del blocco su 1. Di solito si desidera una dimensione del blocco di 4k o superiore, ma questo evita entrambi di fare matematica (inline) e ci consente di specificare la posizione esatta del byte.
seek=Ncerca un certo punto nel file di output (nota che seek=Nè diverso skip=Nperché skipsalta i byte dal file di input!). Lo impostiamo, ovviamente, su dove si trova il testo di destinazione.
count=Ncopia solo così tanti byte. Penso che questo possa essere omesso perché noterà la fine del file di input, ma l'ho lasciato solo per essere sicuro.
E voilà, il file viene sovrascritto!
Ma aspetta, il file di destinazione era più grande del nostro script, quindi sulla chiavetta USB, il file ora è qualcosa del tipo: "while do if run () blah; blah (); yright 2007 X Inc.". C'è immondizia residua. Due modi per risolvere questo problema: allungare il nostro file di input (aggiungere spazi) o aggiungere un simbolo di commento alla fine. Si noti che molti editori aggiungono una nuova riga alla fine, così si potrebbe desiderare di set count=di N-1byte (se il file è ora di 203 byte, e si nota che l'ultimo byte è un ritorno a capo, il conteggio set a 202). Puoi controllare un file per le nuove righe usando xxd script.py | taile controllando se l'ultimo byte è 0a(o, in casi strani, 0d).
Il processo è identico per un .isofile basta sostituire mentalmente /dev/sdccon your.iso.
Si noti che quando si controlla la destinazione nel proprio mountpoint per vedere se ha funzionato, potrebbe essere necessario utilizzarlo stringsnuovamente (questa volta cercando lo script) poiché il file è probabilmente ancora nella cache di lettura.