Tengo un archivo loopback que contiene un único sistema de archivos, llamémoslo fs.image
. Tengo otro archivo loopback mucho más grande, que contiene múltiples particiones y múltiples sistemas de archivos, llamémoslo disk.image
.
fs.image
es exactamente del mismo tamaño que una de las particiones en disk.image
. Me gustaría copiar los datos en el disk.image
archivo en la ubicación correcta.
Tengo un script que calcula el desplazamiento adecuado e intento hacerlo con dd
. Supuse que esto funcionaría porque funciona con un dispositivo de bloque, pero no es así. disk.image
se trunca en la posición inmediatamente posterior a los datos que se acaban de escribir en él.
¿Hay alguna manera de evitar dd
truncar el archivo?
fs.image
está comprimido como fs.image.bz2
y el comando que estoy ejecutando es así:
bzcat fs.image.bz2 | dd of=disk.image bs=4M seek=$OFFSET
¿Dónde $OFFSET
está mi compensación calculada?
He pensado en otras formas de lograr esto, pero esta parece la más simple (si funcionó). Una opción sería copiar los datos hasta el punto de inserción en otro archivo, agregar el sistema de archivos y finalmente agregar el resto del archivo original. Sin embargo, esto sería lento porque estaría copiando una gran cantidad de datos que realmente no necesito. Estoy abierto a otras opciones.
Respuesta1
GNU dd
(al menos la versión 8.23) tiene lo siguientebandera de conversión
no truncado no truncar el archivo de salida
que hace exactamente lo que quieres; Aquí hay un pequeño ejemplo:
$ cat foo
foobar
$ echo -n XX | dd of=foo bs=1c seek=1 conv=notrunc
2+0 records in
2+0 records out
2 bytes (2 B) copied, 0.000283698 s, 7.0 kB/s
$ cat foo
fXXbar