Ho un disco, ad esempio/dev/sda.
Ecco 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
Devo creare un'immagine da archiviare sul nostro file server per utilizzarla per il flashing di altri dispositivi che stiamo producendo, quindi desidero solo lo spazio utilizzato (solo circa 4 GB). Voglio mantenere il mbr ecc ... poiché questo dispositivo dovrebbe essere pronto all'avvio non appena la copia è terminata.
Qualche idea? In precedenza avevo utilizzato dd if=/dev/sda of=[//fileserver/file]
, ma a quel tempo, la mia copia principale era su un ide flash da 4 GB.
In passato ho riscontrato un problema simile con le distribuzioni Linux integrate: sbarazzarsi di tutta la spazzatura prima di comprimere l'immagine.
dd if=/dev/zero of=asdf.txt
. Aspetta che muoia. Elimina asdf.txt.
Hai appena scritto zeri in tutto lo spazio libero sul dispositivo.
Ora prendi un'immagine del disco ed eseguila tramite gzip. Voila, immagine sparsa.
Probabilmente non si adatta molto bene e potrebbe causare problemi se in realtà è necessario scrivere sul disco, ma ehi.
È possibile eseguire un'istantanea rsync del disco su un altro volume, azzerarlo, quindi acquisire l'immagine del disco.
Nota: potrebbe essere pericoloso per SSD, l'utente deve considerare questa operazione prima di impegnarsi.
Supponendo di voler salvare /dev/sdXN
per /tgtfs/image.raw
e sei root:
mkdir /srcfs && mount /dev/sdXN /srcfs
Usa zerofill
o semplicemente:dd if=/dev/zero of=/srcfs/tmpzero.txt
per riempire i blocchi inutilizzati con zero; attendere che riempia completamente il file system quindi:rm /srcfs/tmpzero.txt
Prendi l'immagine con dd e usa conv = sparse per colpire al volo gli zeri:dd conv=sparse if=/dev/sdxn of=/tgtfs/image.raw
Se si desidera utilizzare la compressione non è necessario punzonare 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 questo (riempire il file system con zeri) su un supporto di archiviazione basato su memoria flash (cioè il tuo file system di origine essendo un SSD) su base regolare, poiché causerà una scrittura estesa sul tuo SSD e ridurne la durata. (ma va bene per il trasferimento occasionale di dati)
Usa dd, con l'opzione count.
Nel tuo caso stavi usando fdisk, quindi seguirò questo approccio. Il tuo "Sudo fdisk -l" 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 che dovresti prendere in considerazione sono 1) la dimensione dell'unità e 2) la colonna "Fine". Nel tuo caso hai cilindri che sono pari a 8225280 byte. Nella colonna "Fine" sda8 termina a 525 (ovvero 525 [unità] * 16065 * 512 = ~ 4.3 GB)
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 appare 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à utilizzata da fdisk, ma qualsiasi unità lo farà fino a quando l'opzione di conteggio è 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).
Mentre /dev/zero
ing lo spazio libero su disco e usa dd conv=sparse
/gz -c
è possibile, su enormi dischi con spazio vuoto in esecuzione in centinaia di GB, /dev/zero
ing è dolorosamente lento - per non parlare del fatto che, come notato da 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, usato gparted
per 'ridurre' il disco alla dimensione minima possibile, lasciando il resto dello spazio non allocato
Usatodd bs=1M count=<size_in_MBs> if=/dev/sdX | gzip -c --fast| dd of=/path/to/image.gz
per creare l'immagine a compressione rapida (inutile dirlo, potresti voler saltare la compressione se hai spazio sufficiente per archiviare i dati grezzi (o sei altrimenti incline a ridurre il caricamento della CPU)
dd if=/path/to/image.gz | gunzip -c | dd bs=1M of=/dev/sdY
per copiare nuovamente i dati su un altro discogparted
per 'espandere' la partizioneNon l'ho provato per più partizioni ma credo che il processo sopra descritto possa essere adattato per copiare "partizioni" se la tabella delle partizioni sul disco di destinazione viene creata per prima e solo i dati contenuti nella partizione vengono copiati tramite dd
- gli offset di lettura/scrittura (skip
/seek
opzione di dd
, rispettivamente) sarebbero richiesti come appropriato.
Non puoi. dd
è uno strumento di livello molto basso e non ha alcun mezzo per distinguere tra file e spazio vuoto.
D'altra parte, lo spazio vuoto si comprime molto, molto bene, quindi se ti preoccupi solo dello spazio di archiviazione, non ad esempio il tempo di scrittura, allora esegui semplicemente il pipe attraverso gzip.
Supponendo che il resto dell'unità sia vuoto (tutti zeri), è possibile reindirizzare il DD tramite gzip, che dovrebbe comprimere lo spazio vuoto abbastanza bene. Puoi usare uno strumento come zerofree per assicurarti che il tuo spazio vuoto sia effettivamente vuoto, quindi comprime bene.
Se usi uno strumento come partimage , clonezilla o alcuni degli altri strumenti di clonazione di Linux, gestiranno la maggior parte di questo automaticamente per te.
La risposta accettata non è giusta. Sono d'accordo con il commento sopra. Uso dd con count parametro per eseguire il backup del mio disco su base regolare. Sostituisci semplicemente BACKUP_FOLDER e la lettera del tuo dispositivo con "X":
Definisci l'ultimo blocco utilizzato del disco:
ct=$(fdisk -l | awk '$1 == "/dev/sdX" { print $3 }')
Quindi clonare il disco (escluso il suo spazio vuoto):
dd if=/dev/sdX bs=512 count=$ct | gzip > BACKUP_FOLDER/sdX_$(date +"%Y-%m-%d").img.gz >>"$LOG"