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 hacer una imagen para almacenarla en nuestro servidor de archivos para usarla en otros dispositivos que estamos fabricando, así que solo quiero el espacio utilizado (solo alrededor de 4 gb). Quiero mantener el mbr, etc., ya que este dispositivo debe estar listo para el arranque 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 memoria flash de 4 gb.
linux
hard-drive
dd
Jonathan Henson
fuente
fuente
dd conv=sparse
.Respuestas:
En el pasado me encontré con un problema similar con las distribuciones de Linux integradas: deshazte de toda la basura antes de comprimir la imagen.
dd if=/dev/zero of=asdf.txt
. Espera hasta que muera. Eliminar asdf.txt.Acaba 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 escala muy bien y podría causar problemas si realmente necesita escribir en el disco, pero bueno.
Podría llevar una instantánea rsync del disco a otro volumen, poner 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 comprometerse.
fuente
dd if=sda2.gz | gunzip > /dev/sda2
ydd if=/dev/sda2 | gzip > sda2.gz
of
ruta para cada partición.Suponiendo que desea guardar
/dev/sdXN
a/tgtfs/image.raw
y que sea root:mkdir /srcfs && mount /dev/sdXN /srcfs
Use zerofill 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 entoncesrm /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 marcar los ceros con dd, ya que los bloques cero son altamente compresibles:
PD: debe tener en cuenta que esta no es una buena idea en un medio de almacenamiento basado en memoria flash (es decir, su sistema de archivos de origen sea SSD)
fuente
dd conv=sparse
.btrfs snapshot
ybtrfs send
herramientas) es una mejor solución en mi humilde opinión.gz
en suPATH
(como no lo hice, en GParted Live), puede usargzip -c
en su lugar.Use dd, con la opción de conteo.
En su caso, estaba usando fdisk, así que adoptaré ese enfoque. Su "sudo fdisk -l" produjo:
Las dos cosas que debe tener en cuenta son: 1) el tamaño de la unidad y 2) la columna "Fin". En su caso, tiene cilindros que son iguales a 8225280 Bytes. En la columna "Fin", sda8 termina en 525 (que es 525 [unidades] * 16065 * 512 = ~ 4.3GB)
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 lo último usando la opción de conteo en dd. El comando aparecería de la siguiente manera:
Donde -bs es el tamaño del bloque (es más fácil usar la unidad que usa fdisk, pero cualquier unidad lo hará siempre que la opción de conteo se declare en estas unidades), y contar es el número de unidades que queremos copiar (nota que incrementemos el recuento en 1 para capturar el último bloque).
fuente
fdisk -l -u=cylinders /dev/sda
Si bien
/dev/zero
el espacio libre en disco y el usodd conv=sparse
/gz -c
es posible, en discos enormes con espacio vacío ejecutándose en cientos de GB,/dev/zero
ing es dolorosamente lento, por no mencionar que, como lo señalaron otras respuestas,/dev/zero
un SDD hasta EOF.Esto es lo que hice cuando me encontré con esta situación:
En un CD en vivo de lubuntu, se usa
gparted
para 'reducir' el disco al tamaño mínimo posible, dejando el resto del espacio sin asignarSe utiliza
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 por lo demás está inclinado a reducir la carga de la CPU)dd if=/path/to/image.gz | gunzip -c | dd bs=1M of=/dev/sdY
para copiar los datos nuevamente en un disco diferentegparted
nuevamente para 'expandir' la particiónNo lo he probado para varias particiones, pero creo que el proceso anterior se puede adaptar para copiar 'particiones' si la tabla de particiones en el disco de destino se crea primero y solo se copian los datos contenidos en la partición
dd
: compensación de lectura / escritura (skip
/seek
opción dedd
, respectivamente) se requeriría según corresponda.fuente
count
parámetroNo 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 póngalo a través de gzip.
fuente
Suponiendo que el resto de la unidad está vacía (todos ceros), podría canalizar su DD a través de gzip, lo que debería comprimir el espacio vacío bastante bien. Puede usar una herramienta como zerofree para asegurarse de que su espacio vacío esté realmente en blanco para que se comprima bien.
Si usa una herramienta como partimage , clonezilla o alguna de las otras herramientas de clonación de Linux, manejarán la mayor parte de esto automáticamente.
fuente
La respuesta aceptada no es correcta. Estoy de acuerdo con el comentario anterior. Utilizo dd con el parámetro count para hacer una copia de seguridad de mi disco de forma regular. Simplemente reemplace el BACKUP_FOLDER y la letra de su dispositivo con "X":
Defina el último bloque usado del disco:
Luego clonando el disco (excluyendo su espacio vacío):
fuente