La respuesta común a esto es desempaquetar el archivo iso, modificarlo y empacarlo nuevamente. Parece que "ISO Master", como se menciona en la respuesta de dv3500ea, es un buen front-end para hacer eso.
Si:
- no tienes suficiente espacio para eso
- solo desea hacer una modificación quirúrgica en lugar de reescribir todo
- desea modificar un dispositivo de almacenamiento que contiene un sistema de archivos isofs (también conocido como iso9660) sin copiar todo el dispositivo, o
- si crees que esto de desempacar / reempacar no es lo suficientemente hacky
¡Entonces esta respuesta es para ti!
En resumen, reemplazaremos un archivo existente en el sistema de archivos isofs con nuestro archivo deseado. Nuestro archivo deseado debe ser más pequeño que el archivo existente (destino), y los espacios en blanco finales (o basura) deben ser aceptables. En realidad, esto solo requiere dos comandos, pero tenga cuidado: un error tipográfico puede destruir el sistema de archivos de destino por completo o incluso sobrescribir el archivo de origen. ¡Las copias de seguridad son tu amigo!
En mi caso, quería almacenar un script en un arranque en vivo para no tener que volver a escribirlo cada vez. El script está en script.py
y mi objetivo (una memoria USB) está en /dev/sdc
. El tamaño del script es de 202 bytes, por lo que nuestro primer paso es encontrar un archivo de más de 202 bytes para poder sobrescribirlo. Después de montarlo en /mnt
, encontré un archivo adecuado en /mnt/info.txt
.
No podemos simplemente sobrescribir info.txt
en el punto de montaje, se quejará de que es un sistema de archivos de solo lectura. Sin embargo, somos root, ¡así que demostrémosles lo que eso significa! Necesitamos averiguar dónde info.txt
está el sistema de archivos. Busque alguna cadena que sea (probablemente) exclusiva de info.txt
, por ejemplo This is the official distribution CD of X.
, y búsquela en el 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 [...]
Por otra parte, esto también se puede hacer con grep, que es mucho más rápido, pero entonces deberá especificar desde el principio: $ sudo grep -oba 'This is ...' /dev/sdc
.
Ahora que sabemos dónde está, solo necesitamos reemplazar esos bytes con nuestro archivo:
$ sudo dd if=script.py of=/dev/sdc conv=notrunc bs=1 seek=2573588480 count=202
Esta línea:
- copia bytes del archivo de entrada (
if
) al archivo de salida ( of
), y no le importa que el archivo de salida sea en realidad un dispositivo, porque "todo es un archivo".
conv=notrunc
le dice que no trunque el archivo de salida, porque solo queremos sobrescribir unos pocos bytes, no sobrescribir el archivo desde cierto punto en adelante.
bs=1
establece el tamaño del bloque en 1. Por lo general, desea un tamaño de bloque de 4k o superior, pero esto evita tener que hacer cálculos matemáticos (en línea) y nos permite especificar la ubicación exacta al byte.
seek=N
busca un cierto punto en el archivo de salida (tenga en cuenta que seek=N
es diferente de skip=N
porque skip
omite bytes del archivo de entrada). Lo configuramos, por supuesto, donde está el texto de destino.
count=N
copie solo esta cantidad de bytes. Creo que esto se puede omitir porque notará el final del archivo de entrada, pero lo dejé solo para estar seguro.
Y listo, ¡el archivo se sobrescribe!
Pero espere, el archivo de destino era más grande que nuestro script, por lo que en la memoria USB, el archivo ahora es algo así como: "while do if run () blah; blah (); yright 2007 X Inc.". Hay basura detrás. Hay dos formas de solucionar esto: alargar nuestro archivo de entrada (agregar espacios) o agregar un símbolo de comentario al final. Tenga en cuenta que muchos editores agregan una nueva línea al final, por lo que es posible que desee establecerlos count=
en N-1
bytes (si su archivo ahora tiene 203 bytes y nota que el último byte es una nueva línea, establezca el número en 202). Puede verificar un archivo en busca de nuevas líneas utilizando xxd script.py | tail
y verificando si el último byte es 0a
(o, en casos extraños 0d
).
El proceso es idéntico para un .iso
archivo, solo reemplace mentalmente /dev/sdc
con your.iso
.
Tenga en cuenta que cuando verifica el objetivo en su punto de montaje para ver si funcionó, es posible que deba usarlo strings
nuevamente (esta vez buscando su secuencia de comandos) ya que el archivo probablemente todavía esté en la memoria caché de lectura.