risposta-alla-domanda-sullo-sviluppo-web-bd.com

dd su tutto il disco, ma non vuoi porzione vuota

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.

41
Jonathan Henson

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.

39
Rob Bos

Supponendo di voler salvare /dev/sdXN per /tgtfs/image.rawe sei root:

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

  2. 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

  3. 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)

21

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).

14
Tom Looby

Mentre /dev/zeroing 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/zeroing è dolorosamente lento - per non parlare del fatto che, come notato da altre risposte, /dev/zeroing 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

  • Usato
    dd 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)

  • Usato
    dd if=/path/to/image.gz | gunzip -c | dd bs=1M of=/dev/sdY per copiare nuovamente i dati su un altro disco
  • Utilizzato nuovamente gparted per 'espandere' la partizione

Non 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.

10
Ashish Chopra

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.

8
c2h5oh

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.

7
Zoredache

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"
4
Aloha D