dd en todo el disco, pero no quiero una parte vacía

dd en todo el disco, pero no quiero una parte vacía

Tengo un disco, digamos /dev/sda.

Aquí está fdisk -l:

 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

Necesito crear una imagen para almacenarla en nuestro servidor de archivos y usarla en la actualización de otros dispositivos que estamos fabricando, por lo que solo quiero el espacio usado (solo alrededor de 4 GB). Quiero conservar el mbr, etc. ya que este dispositivo debería estar listo para arrancar tan pronto como finalice la copia.

¿Algunas ideas? Anteriormente había estado usando dd if=/dev/sda of=[//fileserver/file], pero en ese momento, mi copia maestra estaba en una unidad flash de 4 GB.

Respuesta1

En el pasado me encontré con un problema similar con las distribuciones integradas de Linux: deshacerme de toda la basura antes de comprimir la imagen.

dd if=/dev/zero of=asdf.txt. Espere 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 escasa.

Probablemente no se escale muy bien y podría causar problemas si realmente necesitas escribir en el disco, pero bueno.

Puede tomar una instantánea rsync del disco a otro volumen, ponerla a cero y luego tomar esa imagen del disco.

Nota: Podría ser peligroso para SSD; el usuario debe considerar esta operación antes de confirmarla.

Respuesta2

Suponiendo que desea guardar /dev/sdXNy /tgtfs/image.rawes root:

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

  2. Utilice zerofill, zerofreeo simplemente:
    dd if=/dev/zero of=/srcfs/tmpzero.txt
    para llenar los 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 compresión, no necesita perforar los ceros con dd ya que los bloques de ceros 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, que su sistema de archivos de origen sea un SSD) de forma regular, ya que provocará una escritura extensa. a su SSD y reducir su vida útil. (pero está bien para transferencias ocasionales de datos)

Respuesta3

Utilice dd, con la opción de contar.

En su caso estaba usando fdisk, así que adoptaré ese enfoque. Su "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 debes tener en cuenta son 1) el tamaño de la unidad y 2) la columna "Fin". En su caso tiene 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 una cantidad específica de bloques. Haremos esto último usando la opción de contar 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 servirá siempre que 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 recuento en 1 para capturar el último bloque).

Respuesta4

No puedes. ddEs 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.

información relacionada