Solución 1:
En el pasado me encontré con un problema similar con las distribuciones integradas de Linux:deshágase de toda la basura antes de comprimir la imagen.
dd if=/dev/zero of=asdf.txt
. Espera hasta que muera. Eliminar asdf.txt.
Acabas de escribir ceros en todo el espacio libre del dispositivo.
Ahora tome una imagen de disco y ejecútela a través de gzip. Voila, imagen dispersa.
Probablemente no escale muy bien y podría causar problemas si realmente necesita escribir en el disco, pero bueno.
Podría tomar una instantánea de rsync del disco a otro volumen, ponerlo a cero y luego tomar esa imagen de disco.
Nota:Podría ser peligroso para SSD, el usuario debe considerar esta operación antes de realizarla.
Solución 2:
Suponiendo que desea guardar /dev/sdXN
a /tgtfs/image.raw
y eres root:
-
mkdir /srcfs && mount /dev/sdXN /srcfs
-
Usa
zerofill
o solo:
dd if=/dev/zero of=/srcfs/tmpzero.txt
para llenar bloques no utilizados con cero; espere a que llene el sistema de archivos por completo y luego:
rm /srcfs/tmpzero.txt
-
Tome la imagen con dd y use conv=sparse para marcar ceros sobre la marcha:
dd conv=sparse if=/dev/sdxn of=/tgtfs/image.raw
Si desea utilizar la compresión, no necesita perforar los ceros con dd ya que los bloques cero son altamente comprimibles:
dd if=/dev/sdxn | gz -c | dd of=/tgtfs/image.raw
PD:debe tener en cuenta que no es una buena idea hacer esto (llenar el sistema de archivos con ceros) en un medio de almacenamiento basado en memoria flash (es decir, su sistema de archivos de origen es un SSD) de forma regular, ya que provocará una escritura extensa. a su SSD y reducir su vida útil. (pero está bien para la transferencia ocasional de datos)
Solución 3:
Use dd, con la opción de contar.
En su caso, estaba usando fdisk, así que tomaré ese enfoque. Tu "sudo fdisk -l "produjo:
Disk /dev/sda: 64.0 GB, 64023257088 bytes
255 heads, 63 sectors/track, 7783 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0000e4b5
Device Boot Start End Blocks Id System
/dev/sda1 * 1 27 209920 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 27 525 4000768 5 Extended
Partition 2 does not end on cylinder boundary.
/dev/sda5 27 353 2621440 83 Linux
/dev/sda6 353 405 416768 83 Linux
/dev/sda7 405 490 675840 83 Linux
/dev/sda8 490 525 282624 83 Linux
Las dos cosas que debe tener en cuenta son 1) el tamaño de la unidad y 2) la columna "Fin". En tu caso tienes cilindros que equivalen a 8225280 Bytes. En la columna "Fin", sda8 termina en 525 (que es 525[unidades]*16065*512 =~4,3 GB)
dd puede hacer muchas cosas, como comenzar después de un desplazamiento o detenerse después de un número específico de bloques. Haremos esto último usando la opción de conteo en dd. El comando aparecería de la siguiente manera:
sudo dd if=/dev/sda of=/your_directory/image_name.iso bs=8225280 count=526
Donde -bs es el tamaño del bloque (es más fácil usar la unidad que usa fdisk, pero cualquier unidad funcionará siempre y cuando la opción de conteo esté declarada en estas unidades), y conteo es el número de unidades que queremos copiar (nota que incrementamos el conteo en 1 para capturar el último bloque).
Solución 4:
Mientras que /dev/zero
ing el espacio libre en disco y use dd conv=sparse
/gz -c
es posible, en discos enormes con espacio vacío ejecutándose en cientos de GB, /dev/zero
ing es terriblemente lento, sin mencionar que, como se señaló en otras respuestas, /dev/zero
ing un SDD hasta EOF.
Esto es lo que hice cuando me encontré con esta situación:
-
En un CD en vivo de Lubuntu, usé
gparted
para 'reducir' el disco al tamaño mínimo posible, dejando el resto del espacio sin asignar -
Usó
dd bs=1M count=<size_in_MBs> if=/dev/sdX | gzip -c --fast| dd of=/path/to/image.gz
para crear la imagen comprimida rápidamente (no hace falta decir que es posible que desee omitir la compresión si tiene espacio suficiente para almacenar datos sin procesar (o si prefiere reducir la carga de la CPU) - Usado
dd if=/path/to/image.gz | gunzip -c | dd bs=1M of=/dev/sdY
para volver a copiar los datos en un disco diferente - Usado
gparted
de nuevo para 'expandir' la partición
No lo he probado para varias particiones, pero creo que el proceso anterior se puede adaptar para copiar 'particiones' si primero se crea la tabla de particiones en el disco de destino y solo se copian los datos contenidos en la partición a través de dd
- compensaciones de lectura/escritura (skip
/seek
opción de dd
, respectivamente) serían requeridos según corresponda.
Solución 5:
no puedes dd
es una herramienta de muy bajo nivel y no tiene forma de distinguir entre archivos y espacios vacíos.
Por otro lado, el espacio vacío se comprimirá muy, muy bien, por lo que si solo le preocupa el espacio de almacenamiento, no por ejemplo el tiempo de escritura, simplemente canalícelo a través de gzip.