dd copy más datos de los que existen en .img?

Estoy intentando enviar un file .img a mi micro sd (8 GB). La rom (.img) es de 2.66 GB, pero en mi salida de DD (en vivo) dice que ha transferido 9 GB . No entiendo cómo está convirtiendo una image de 2 GB en 9 GB. Estoy ejecutando OSX Lion y usando una tarjeta Belkin leída. El lector de tarjetas no es el problema, he utilizado la utilidad de disco con él sin ningún problema. Creo que el problema es dd o mi tarjeta (espero que no sea mi tarjeta :().

EDITAR: Aquí está el command que uso para copyr el file

dd if=honey.img of=/dev/disk1 bs=1m 

Este es el código que uso para verificar el estado:

 killall -INFO dd 

El comportamiento que describes y la naturaleza del file me hacen sospechar que este es un file disperso . Los files dispersos son una técnica de compression primitiva, en la que las grandes secuencias de bytes nulos en un file no se almacenan en el disco. Aquí hay un ejemplo donde creo un file disperso:

 $ echo a | dd seek=999999999 >sparse 0+1 records in 0+1 records out 2 bytes (2 B) copied, 6.614e-05 s, 30.2 kB/s $ ls -la -rw-r--r-- 1 gilles gilles 511999999490 Apr 30 00:03 sparse $ du sparse 16 sparse 

El file sparse contiene 511999999490 bytes (999999999 bloques de 512 bytes, todos cero, más los dos bytes a seguidos por una nueva línea). Sin embargo, el espacio total en el disco utilizado por el file es de 16kB (4kB para el bloque final y 3 otros bloques que contienen solo metadatos relacionados con la location de los otros bloques, todos ausentes).

Si honey.img es una image de disco que se creó con cuidado, puede ser escasa donde el disco tenía espacio no utilizado.

Cuando lee un file, no hay nada que lo marque como disperso. Entonces, si honey.img es una image de disco grande, dd puede estar leyendo gigabytes sobre gigabytes que contienen solo bytes nulos.

Ejecutar ls -l y du en el file (o, en OSX, ls -ls ) mostraría la cantidad de bytes y la cantidad de bloques utilizados para el almacenamiento. Si los bytes no caben en la cantidad de bloques, el file es escaso. Mientras escribo, no ha publicado datos legibles que puedan confirmar o invalidar esto.

La única herramienta que conozco en OSX que puede copyr files dispersos de manera eficiente es rsync . Sin embargo, lo que está haciendo aquí no es copyr un file de un sistema de files a otro, sino copyr una secuencia de bytes (que proviene de un file) en un disco. Solo puede hacer esto si los datos realmente se ajustan en el disco de destino.

Me encontré con un problema muy similar al tratar de transferir un Debian live binary.img a una unidad flash USB de 2 GB. El tamaño de la image fue listdo como 1.6GB. El comentario anterior de Matt con respecto al uso de statistics fue muy útil y después de calcular el tamaño de bloque en 4096 veces el número de bloques (3,109,040), pone el tamaño en 12,734,627,840, que es casi 8 veces el tamaño de 1,6 GB de la list. Observé que en el command dd también estaba usando bs = 1M, así que volví a intentar con el bs = 4096 como figura en el command stat, y copió el file como se esperaba originalmente en 1.6 GB. Así que mi printing es que si copys trozos más grandes que el tamaño del bloque, simplemente copy bloque por bloque. Pero si copy en el tamaño de bloque (y posiblemente más pequeño, aunque no probado), dd evalúa qué hay dentro del bloque y recorta la basura superflua. Gracias por el consejo Matt.