Clonare l'intera partizione o disco rigido in un file sparse


35

Mi piace clonare un'intera partizione o un intero disco rigido su un disco esterno più grande, ma mi piace creare un file sparso. Uso spesso ddper la clonazione, ma non supporta file sparsi. Come soluzione alternativa ho usato qualcosa del tipo:

cp --sparse=always <(dd if=/dev/sda1 bs=8M) /mount/external/backup/sda1.raw

Tuttavia, questo è un po 'troppo complicato per i miei gusti e non mi consente di riprendere il processo se interrotto. È divertente che ci sia uno strumento NTFS per questo ( ntfsclone) ma non esiste uno strumento simile per i file system nativi di Linux (EXT2-4).

Esiste uno strumento migliore per questo, ad esempio una ddvariante con supporto scarso? Non cerco alcun software proprietario per i backup del disco ma voglio semplicemente fare una copia clone sparsa che posso montare come dispositivo loop se necessario.


7
+1 per un uso creativo di cp, non mi è mai venuto in mente che potevi sparse-copiare un'immagine del disco. Li ho sempre compressi solo se avevo bisogno di risparmiare spazio. Ora, perché in una domanda non è una risposta?
Caleb,

Risposte:


21

Tu vuoi dd_rescue.

dd_rescue -a -b 8M /dev/sda1 /mount/external/backup/sda1.raw

1
Grande! Il manuale dice "Se il processo di copia viene interrotto dall'utente è possibile continuare in qualsiasi posizione in seguito". e "-a scrittura del file spArse (default = no)". Esattamente quello che voglio! Grazie!
Martin Scharrer,

3
Cercando dd_rescueonline ho scoperto che esiste anche uno strumento diverso chiamato ddrescue(senza il carattere di sottolineatura) che è stato sviluppato indipendentemente da dd_rescuema sembra fare sostanzialmente lo stesso. Ho appena detto che qui come FYI generale.
Martin Scharrer,

Sì, dd_rescuee ddrescuenon sono la stessa cosa. Teoricamente fanno lo stesso lavoro, ma in genere ho avuto più fortuna con il vecchio / originale dd_rescue.
Steven Pritchard,

1
Nel caso qualcuno si stia chiedendo, puoi interrompere la copia in qualsiasi momento con Ctrl-C. Ti mostrerà la tua posizione corrente e puoi usare quel valore per riavviare aggiungendo -se la posizione al comando originale. (Così sembrerebbe dd_rescue -a -b 8M -s 42000k /dev/sda1 /mount/external/backup/sda1.raw.)
Steven Pritchard,

1
@Steven Pritchard: non è necessario ricordare la posizione. Specificare un terzo nome file, che sarà il file di registro, e al riavvio lo leggerà e riprenderà da dove era stato interrotto.
Tanith Rosenbaum,

20

Solo per completezza, la richiesta di ddrescue . Il flag --sparseo -Sconsente alla destinazione di essere scritta scarsamente:

$ ddrescue -S -b8M /dev/sda1 /mount/external/backup/sda1.raw

O con un'opzione lunga:

$ ddrescue --sparse --block-size 8M /dev/sda1 /mount/external/backup/sda1.raw

O se preferisci i MiB :

$ ddrescue -S -b8Mi /dev/sda1 /mount/external/backup/sda1.raw

Per consentire l'interruzione e la ripresa del salvataggio, è inoltre possibile utilizzare un file di registro:

$ ddrescue -S -b8Mi /dev/sda1 /mount/external/backup/sda1.raw ~/sda1.rescue.log

Nota che GNU ddrescuee dd_rescuesono programmi diversi. Ma GNU ddrescuesembra essere più diffuso. Ad esempio, è già impacchettato con GRML .


È necessario un trattamento speciale dell'immagine durante il ripristino, è possibile fornire il comando utilizzato per ripristinare un ddrescue?
user12439

In teoria il supporto di memoria che si sta utilizzando per il salvataggio dovrebbe essere più affidabile, in modo da poter in genere basta usare dd per scrivere sul disco di sostituzione: dd if=sda1.raw of=/dev/sdb1. Tuttavia, per utilizzare ddrescue per il ripristino, è sufficiente modificare l'origine / destinazione utilizzata per il salvataggio nella nuova origine / destinazione, preferibilmente con un nuovo file di registro. Se possibile (spesso no), puoi ovviamente usare ddrescue per copiare i dati direttamente dal disco di origine danneggiato su un disco sostitutivo.
zaTricky,

3

Nel 2007 è stata offerta una patch per fornire supporto ai file sparsi in GNU dd, ma sembra non averlo trasformato in coreutils (almeno non da 8.4). Dubito che dd sia cambiato troppo da allora, la patch potrebbe essere applicata alla versione attuale senza molto lavoro.

Sono anche davvero impressionato dall'uso creativo di cpnella tua domanda, e mi ha portato sulla buona strada per usarlo per realizzare la ripresa (qui riprendo da ~ 80 M alla fonte):

cp --sparse=always \
  <(dd if=/dev/sda1 bs=8M skip=10) /dev/stdout \
  | dd bs=8M seek=10 of=/mount/external/backup/sda1.raw

Modifica: grattalo. Il secondo ddsarebbe ovviamente cercare una posizione errata nel file di output, poiché non ha la stessa lunghezza dell'input.


1
Come nel caso della risposta di Bhinesley, sarebbe meglio registrare i progressi di dd per un accurato ripristino. Se dovessi usare questo approccio sia per la prima esecuzione che per riprendere e registrare entrambi i dd paralleli in modo indipendente, allora potresti sapere fino a che punto cercare l'output. Se avrò tempo, proverò a risolverlo.
Eli Heady,

2
Grazie per il link alla patch. Stavo iniziando a pensare di programmare qualcosa di simile da solo :-) I file sparsi non possono essere inseriti in modo che il codice non funzioni.
Martin Scharrer,

Sì, l'ho scoperto da solo. Oh beh, è ​​stato divertente trovare nuovi e folli usi cp- grazie!
Eli Heady,

1
dd commit al 2012: git.savannah.gnu.org/cgit/coreutils.git/commit/… "dd: aggiungi il supporto per l'opzione conv = sparse" ("(iwrite): converti una scrittura di un blocco NUL in una ricerca se richiesto. ")
osgx

1

Sto solo aggiungendo i miei 2 centesimi. Un altro modo per creare un file sparse da un disco non elaborato è con qemu-img usando qualcosa come:

qemu-img convert -f raw /dev/sda /tmp/sda.raw

Puoi usarlo anche su una singola partizione. Inoltre, hai la possibilità di convertire il disco / partizione non formattato in qualsiasi altro formato supportato da qemu-img (QCOW2, VHD [x], vmdk, ecc.)


1

Un'altra opzione è rsync . Per esempio:

rsync -SP --copy-devices /dev/sda1 /mount/external/backup/sda1.raw

Spiegazione:

  • -S/ --sparseper saltare blocchi sparsi in scrittura
  • -P/ --partial --progressper mostrare i progressi e mantenere i file parzialmente trasferiti
  • --copy-devices per copiare i contenuti del dispositivo

È possibile aggiungere --appendper riprendere una copia interrotta (o --append-verifyper confermare il checksum su corrispondenze di dati vecchi e nuovi).

Modifica : ho appena realizzato che copy-devices.diff è in fase di studio e potrebbe non essere presente su molti sistemi (sebbene sia incluso da Fedora , Ubuntu , Debian e altri)


0

Nota: questo non funziona per i motivi descritti nei commenti, lo lascio qui come riferimento.

Monitora le statistiche di dd usando kill -USR1:

$ cp --sparse=always <(dd if=/dev/urandom bs=8M) \
    /mount/external/backup/sda1.raw&
$ watch kill -USR1 `pidof -s /bin/dd`

Riprendi usando skip / seek:

$ i_bytes= # get from the last dd statistic
$ o_bytes=`du -b /mount/external/backup/sda1.raw | cut -f 1`   
$ cp --sparse=always <(dd if=/dev/urandom bs=8M skip=$i_bytes \
    seek=$o_bytes) /mount/external/backup/sda1.raw&
$ watch kill -USR1 `pidof -s /bin/dd`

Senza $ i_bytes sarebbe più difficile riprendere. Probabilmente è più facile registrare le statistiche dd su un file nel caso in cui la macchina si blocchi o altro.


Il secondo cpsovrascriverà semplicemente il file esistente, no? Conosco le skipaltre opzioni di dd. Il problema è la cpparte.
Martin Scharrer,

Hm, si, hai ragione.
bhinesley,


0

Perché non semplicemente:

cp --sparse=always /dev/sda1 /mount/external/backup/sda1.raw
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.