
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/sdXN
y /tgtfs/image.raw
es root:
mkdir /srcfs && mount /dev/sdXN /srcfs
Utilice
zerofill
,zerofree
o 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
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. 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.