GNU/Linux >> Tutoriales Linux >  >> Linux

dd en todo el disco, pero no quiero una porción vacía

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:

  1. mkdir /srcfs && mount /dev/sdXN /srcfs

  2. 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

  3. 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.


Linux
  1. Los administradores de sistemas de Linux quieren saber:¿Adónde se fue mi espacio en disco?

  2. ¿Puede un script ser ejecutable pero no legible?

  3. Linux:¿`sync + Drop_caches` no elimina cachés?

  4. Linux – Referencias ¿Pero para Linux?

  5. ¿El disco duro de Ubuntu no es detectado por BIOS pero es visible en la administración de discos?

¿Núcleo volcado, pero el archivo principal no está en el directorio actual?

Tomcat funcionando, pero el puerto 8080 no responde

¿Linux cómo copiar pero no sobrescribir?

php.ini cambia pero no es efectivo en ubuntu

`ssh <host>` es un shell de inicio de sesión, pero `ssh <host> <comando>` no lo es.

El disco duro no entra en modo de espera automáticamente