GNU/Linux >> Linux Esercitazione >  >> Linux

dd su tutto il disco, ma non voglio una parte vuota

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:

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

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

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


Linux
  1. Gli amministratori di sistema Linux vogliono sapere:dove è andato a finire il mio spazio su disco?

  2. Uno script può essere eseguibile ma non leggibile?

  3. Linux – `sync + Drop_caches` non sta eliminando le cache?

  4. Linux – Riferimenti ma per Linux?

  5. usa RPATH ma non RUNPATH?

Core scaricato, ma il file core non si trova nella directory corrente?

Eseguire l'installazione, ma non nelle directory predefinite?

Lo script Bash stampa Command Not Found su righe vuote

Tomcat in esecuzione, ma la porta 8080 non risponde

Linux come copiare ma non sovrascrivere?

Il disco rigido non va automaticamente in standby