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.py
e 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.txt
sul mountpoint, ci si lamenterà che è un filesystem di sola lettura. Siamo root, però, quindi mostriamo loro cosa significa! Dobbiamo capire dove si info.txt
trova 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=N
cerca un certo punto nel file di output (nota che seek=N
è diverso skip=N
perché skip
salta i byte dal file di input!). Lo impostiamo, ovviamente, su dove si trova il testo di destinazione.
count=N
copia 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-1
byte (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 | tail
e controllando se l'ultimo byte è 0a
(o, in casi strani, 0d
).
Il processo è identico per un .iso
file basta sostituire mentalmente /dev/sdc
con your.iso
.
Si noti che quando si controlla la destinazione nel proprio mountpoint per vedere se ha funzionato, potrebbe essere necessario utilizzarlo strings
nuovamente (questa volta cercando lo script) poiché il file è probabilmente ancora nella cache di lettura.