Soluzione 1:
In passato mi sono imbattuto in un problema simile con le distribuzioni Linux integrate:elimina tutta la spazzatura prima di comprimere l'immagine.
dd if=/dev/zero of=asdf.txt
. Aspetta finché non muore. Elimina asdf.txt.
Hai appena scritto zeri in tutto lo spazio libero sul dispositivo.
Ora prendi un'immagine del disco ed eseguila tramite gzip. Voilà, immagine scarsa.
Probabilmente non scala molto bene e potrebbe causare problemi se hai effettivamente bisogno di scrivere sul disco, ma ehi.
Potresti acquisire un'istantanea rsync del disco su un altro volume, azzerarla e quindi acquisire l'immagine del disco.
Nota:potrebbe essere pericoloso per SSD, l'utente dovrebbe prendere in considerazione questa operazione prima di eseguire il commit.
Soluzione 2:
Supponendo che tu voglia risparmiare /dev/sdXN
a /tgtfs/image.raw
e tu sei root:
-
mkdir /srcfs && mount /dev/sdXN /srcfs
-
Usa
zerofill
o semplicemente:
dd if=/dev/zero of=/srcfs/tmpzero.txt
riempire i blocchi inutilizzati con zero; attendi che riempia completamente il file system quindi:
rm /srcfs/tmpzero.txt
-
Prendi l'immagine con dd e usa conv=sparse per perforare gli zeri al volo:
dd conv=sparse if=/dev/sdxn of=/tgtfs/image.raw
Se desideri utilizzare la compressione, non è necessario inserire gli zeri con dd poiché i blocchi zero sono altamente comprimibili:
dd if=/dev/sdxn | gz -c | dd of=/tgtfs/image.raw
PS:dovresti notare che non è una buona idea (riempire il file system con zeri) su un supporto di archiviazione basato su memoria flash (ovvero il tuo file system di origine è un SSD) su base regolare, poiché causerà una scrittura estesa al tuo SSD e ridurne la durata. (ma va bene per il trasferimento occasionale di dati)
Soluzione 3:
Usa dd, con l'opzione count.
Nel tuo caso stavi usando fdisk, quindi adotterò questo approccio. Il tuo "sudo fdisk -l "ha prodotto:
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
Le due cose di cui dovresti prendere nota sono 1) la dimensione dell'unità e 2) la colonna "Fine". Nel tuo caso hai cilindri pari a 8225280 byte. Nella colonna "Fine" sda8 termina a 525 (che è 525[unità]*16065*512 =~4.3GB)
dd può fare molte cose, come iniziare dopo un offset o fermarsi dopo un numero specifico di blocchi. Faremo quest'ultimo usando l'opzione count in dd. Il comando apparirebbe come segue:
sudo dd if=/dev/sda of=/your_directory/image_name.iso bs=8225280 count=526
Dove -bs è la dimensione del blocco (è più facile usare l'unità usata da fdisk, ma qualsiasi unità lo farà fintanto che l'opzione count è dichiarata in queste unità), e count è il numero di unità che vogliamo copiare (nota che incrementiamo il conteggio di 1 per catturare l'ultimo blocco).
Soluzione 4:
Mentre /dev/zero
ing lo spazio libero su disco e utilizzare dd conv=sparse
/gz -c
è possibile, su dischi enormi con spazio vuoto in esecuzione in centinaia di GB, /dev/zero
ing è dolorosamente lento, per non parlare del fatto che, come hanno notato altre risposte, /dev/zero
ing un SDD fino a EOF.
Ecco cosa ho fatto quando mi sono imbattuto in questa situazione:
-
Su un live CD di Lubuntu, ho usato
gparted
per "ridurre" il disco alla dimensione minima possibile, lasciando il resto dello spazio non allocato -
Usato
dd bs=1M count=<size_in_MBs> if=/dev/sdX | gzip -c --fast| dd of=/path/to/image.gz
per creare l'immagine compressa velocemente (inutile dire che potresti voler saltare la compressione se disponi di spazio sufficiente per archiviare i dati grezzi (o sei comunque incline a ridurre il carico della CPU) - Usato
dd if=/path/to/image.gz | gunzip -c | dd bs=1M of=/dev/sdY
per copiare i dati su un altro disco - Usato
gparted
di nuovo per "espandere" la partizione
Non l'ho provato per più partizioni, ma credo che il processo sopra possa essere adattato per copiare "partizioni" se viene creata prima la tabella delle partizioni sul disco di destinazione e solo i dati contenuti nella partizione vengono copiati tramite dd
- offset di lettura/scrittura (skip
/seek
opzione di dd
, rispettivamente) sarebbero richiesti come appropriato.
Soluzione 5:
Non puoi. dd
è uno strumento di livello molto basso e non ha modo di distinguere tra file e spazio vuoto.
D'altra parte, lo spazio vuoto si comprimerà molto, molto bene, quindi se ti preoccupi solo dello spazio di archiviazione, non per esempio del tempo di scrittura, allora passa semplicemente attraverso gzip.