Copia l'intera gerarchia del file system da un'unità a un'altra


95

Vorrei copiare l'intera gerarchia del file system da un disco all'altro ... i contenuti di ciascuna directory, nonché i file regolari nella piattaforma Linux. Sarebbe grato di conoscere il modo migliore per farlo con possibilmente le funzioni integrate di Linux. Il file system è una famiglia ext.


1
Umm ... dov'è l'amore dd? dd if=/dev/sda1 of=/dev/sdb1 bs=4096
juniorRubyist,

@juniorRubyist +1 per dd. Lo uso sempre. Ma quali bandiere usare? Io uso conv=notrunc,noerror,sync.
BeniBela,

-1 per dd2 motivi: in primo luogo è una cattiva idea eseguire una copia a livello di blocco di un filesystem che è montato (che è il caso /) e in secondo luogo ddnon copiare i dati da fonti montate all'interno del filesystem come /boote /home.
Eric

Risposte:


33

Lo uso spesso

> cp -ax / /mnt

Presumendo / mnt è il nuovo disco montato su / mnt e non ci sono altri supporti su /.

-x lo mantiene su un unico filesystem.

Questo ovviamente deve essere fatto come root o usando sudo.

Questo link ha alcune alternative, tra cui quella sopra

http://linuxdocs.org/HOWTOs/mini/Hard-Disk-Upgrade/copy.html


mentre questo è risposta vecchia morto è ancora la pena di notare che di solito non si desidera copiare tutto il materiale presente in /, escludendo cioè /dev, /sys, /procecc Pertanto prima di emettere che cpvi suggerisco di ricerca di migliori approcci (anche tramite rsync)
Marcin Orlowski

2
L'uso della -xbandiera da parte di @MarcinOrlowski WolfJM significa che i filesystem sintetici citati non verranno copiati.
Jim L.

192

Quello che vuoi è rsync .

Questo comando può essere utilizzato per sincronizzare una cartella e anche riprendere a copiare quando viene interrotto a metà. Il comando per copiare un disco è:

rsync -avxHAX --progress / /new-disk/

Le opzioni sono:

-a  : all files, with permissions, etc..
-v  : verbose, mention files
-x  : stay on one file system
-H  : preserve hard links (not included with -a)
-A  : preserve ACLs/permissions (not included with -a)
-X  : preserve extended attributes (not included with -a)

Per migliorare la velocità di copia, aggiungi -W( --whole-file), per evitare il calcolo di delta / diff dei file. Questo è il valore predefinito quando sia l'origine che la destinazione sono specificate come percorsi locali, poiché il vero vantaggio dell'algoritmo di trasferimento delta di rsync sta riducendo l'utilizzo della rete.

Considera anche l'aggiunta --numeric-idsper evitare di mappare i valori uid / gid per nome utente / gruppo.


1
Genio, grazie. A proposito, ho finito per usare rsync -avxHAWX --numeric-ids --progress / mnt/ma avrei dovuto farlo rsync -avxHAWX --numeric-ids --progress / mnt/ > ~/rsync.out. Sospetto che il versamento dell'output sul terminale abbia rallentato il processo. : D
Chris K,

28
--info=progress2invece di --progressè utile per trasferimenti di grandi dimensioni, in quanto fornisce progressi generali, anziché (milioni di righe per) singoli file.
Florian,

3
Ho dovuto sostituire Xe Acon E, perché gli attributi estesi e ACL sono coperti dal Emio mac. Testato:rsync version 2.6.9 protocol version 29
Jonathan Komar il

1
Inoltre > ~/rsync.out, 2> ~/rsync.errsalverà eventuali errori in un file separato.
Aneel

2
Se si sta copiando da qualche altra cartella che /, si noti che avere una barra finale (o meno) sulla directory di origine fa la differenza: rsync source/ dest/le copie tutto dentro source/a dest/, mentre rsync source dest/le copie della cartella sourcee tutto dentro in dest/.
semi-estrinseco il

45

La risposta di Michael Aaron Safyan non tiene conto dei file sparsi. -Sl'opzione lo risolve.

Inoltre, questa variante non fa spam con il progredire di ogni file e non esegue la sincronizzazione delta che uccide le prestazioni in casi non di rete.

Perfetto per copiare il filesystem da un'unità locale a un'altra unità locale.

rsync -axHAWXS --numeric-ids --info=progress2

1
Sorprendente. Sta davvero facendo un buon lavoro
Gildas,

1
Questa dovrebbe essere la risposta accettata, funziona alla grande. Esempio55,431,669,792 57% 97.47MB/s 0:06:56 xfr#2888, ir-chk=5593/8534)
disegnato il

1
<3 questo è perfetto
Tim Strijdhorst il

6

Per una copia locale di uno scatto da un'unità all'altra, immagino che cp sia sufficiente come descritto da Wolfmann qui sopra.

Per lavori più grandi come i backup locali o remoti, ad esempio, il migliore è rsync .

Naturalmente, rsync è significativamente più complesso da usare.

Perché rsync:

  • ciò consente di copiare (copia sincronizzata) tutta o parte dell'unità A sull'unità B, con molte opzioni, come l'esclusione di alcune directory dalla copia (ad esempio l'esclusione / proc).

  • Un altro grande vantaggio è che questo strumento nativo monitora il trasferimento di file: ad esempio per trasferimenti di massa, se la connessione viene interrotta, continuerà dal punto di interruzione.

  • E, ultimo ma non meno importante, rsync utilizza la connessione ssh, quindi ciò consente di ottenere "copie" sicure remote sincronizzate. Dai un'occhiata alla pagina man e anche qui per alcuni esempi .


4

Come Michael Safyan suggerisce sopra, ho usato rsyncper questo scopo. Suggerisco di utilizzare alcune opzioni aggiuntive per escludere le directory che probabilmente non si desidera copiare.

Questa versione è abbastanza specifica per i sistemi basati su Gnome e Debian / Ubuntu, poiché include sottodirectory delle home directory degli utenti specifiche di Gnome, nonché la cache del pacchetto APT.

L'ultima riga esclude qualsiasi directory denominata cache / Cache / .cache, che potrebbe essere troppo aggressiva per alcuni usi:

rsync -WavxHAX --delete-excluded --progress \
  /mnt/from/ /mnt/to/
  --exclude='/home/*/.gvfs' \
  --exclude='/home/*/.local/share/Trash' \
  --exclude='/var/run/*' \
  --exclude='/var/lock/*' \
  --exclude='/lib/modules/*/volatile/.mounted' \
  --exclude='/var/cache/apt/archives/*' \
  --exclude='/home/*/.mozilla/firefox/*/Cache' \
  --exclude='/home/*/.cache/chromium'
  --exclude='home/*/.thumbnails' \
  --exclude=.cache --exclude Cache --exclude cache

2

Aggiunta di due bit utili al thread re rsync: modifica cypher e utilizzo --update:

Secondo il post di Wolfman, cp -axè elegante e alla moda per le cose locali.

Tuttavia, rsyncè anche fantastico. Oltre alla risposta di Michael in merito -W, la modifica del cifrario può anche accelerare le cose (leggere su eventuali implicazioni di sicurezza).

rsync --progress --rsh="ssh -c blowfish" / /mnt/dest -auvx

C'è un po 'di discussione (e parametri di riferimento) in giro sul fatto che una CPU lenta sia il vero collo di bottiglia, ma sembra aiutarmi quando la macchina viene caricata facendo altre cose simultanee.

Una delle altre grandi ragioni per usare rsync in una copia grande e ricorsiva come questa è a causa dell'opzione -u (o --update ). Se si verifica un problema durante la copia, puoi risolverlo e rsync riprenderà da dove era stato interrotto (non credo che scp abbia questo). Facendolo localmente, cp ha anche un interruttore -u.

(Non sono sicuro di quali siano le implicazioni di --update e - whole-file insieme, ma sembrano sempre funzionare in modo ragionevole per me in questo tipo di attività)

Mi rendo conto che questo non è un thread sulle funzionalità di rsync, ma alcuni dei più comuni che utilizzo per questo sono:

  • --delete-after etc (come menzionato da Michael nel follow-up), se si desidera sincronizzare il nuovo sistema con la posizione originale o qualcosa del genere. E,
  • --esclude - per saltare directory / file, ad esempio per copiare / creare un nuovo sistema in un nuovo posto mentre si saltano le directory home degli utenti ecc. (o si stanno montando case da qualche altra parte o si creano nuovi utenti ecc.).

Per inciso, se dovessi mai usare Windows, uso rsync da Cygwin per fare grandi copie ricorsive, a causa del fatto che un po 'morto di cervello dell'esploratore vuole iniziare dall'inizio (anche se trovo Finder è OS X ancora peggio)


2

rsync

"Questo approccio è considerato migliore della clonazione del disco con dd poiché consente di utilizzare dimensioni, tabella delle partizioni e filesystem diversi e migliore della copia anche con cp -a, poiché consente un maggiore controllo su autorizzazioni file, attributi , Elenchi di controllo di accesso (ACL) e attributi estesi. "

A partire dal:

https://wiki.archlinux.org/index.php/Full_system_backup_with_rsync

Pagina uomo qui


2

Come menzionato nei commenti di juniorRubyist, l'approccio preferito qui dovrebbe essere l'uso dd. Il motivo principale è rappresentato dalle prestazioni, è una copia blocco per blocco anziché file per file.

Clonazione di una partizione

# dd if=/dev/sda1 of=/dev/sdb1 bs=64K conv=noerror,sync status=progress

Clonazione di un intero disco

# dd if=/dev/sdX of=/dev/sdY bs=64K conv=noerror,sync status=progress

Riferimenti

  1. https://wiki.archlinux.org/index.php/disk_cloning

ddè una pessima idea per 2 motivi: in primo luogo l'esecuzione di una copia a livello di blocco di un filesystem che è montato (il che è il caso /) causerà molto probabilmente errori di filesystem di destinazione, e in secondo luogo ddnon copierà i dati da fonti montate all'interno il filesystem piace /boote /home. Il tuo link è valido per la clonazione del disco, non per la clonazione della "gerarchia dei file"
Eric

1

'dd' è fantastico, ma ddrescue (apt install gddrescue) è ancora migliore. Se dd viene interrotto, non c'è modo di riavviare (un altro buon motivo per usare rsync). Quando si utilizza ddrescue con un file di registro, tiene traccia di quali blocchi sono stati copiati.

Quando eseguo il backup di un sistema Windows / Linux a doppio avvio, utilizzo ntfsclone per le partizioni Windows e ddrescue per la partizione Linux e dd per l'MBR. (Non ho provato a eseguire il backup di un sistema a doppio avvio utilizzando GPT / UEFI.)

Quello che mi piacerebbe vedere è uno strumento ddrescue che può creare file come ntfsclone in cui lo spazio non allocato è contrassegnato da caratteri di controllo. Ciò rende l'immagine non montabile direttamente, ma consente di essere grande solo quanto i dati contenuti.

Qualcuno, per favore, trovi il "formato immagine speciale" di ntfsclone per ddrescue ...


0

rsync è la soluzione perfetta come spiegato sopra.

Aggiungerei semplicemente -Sper " gestire i file sparsi in modo efficiente " nel caso in cui vi sia un volume docker devicemapper o simile da copiare.


0

Ho provato i comandi rsync proposti qui, ma alla fine ho ottenuto risultati molto più puliti e più veloci con partclone. Smonta le partizioni di origine e destinazione e quindi esegui quanto segue:

partclone.ext4 -b -s /dev/sd(source) -o /dev/sd(target)
e2fsck -f /dev/sd(target)
resize2fs /dev/sd(target)

Ciò esegue i seguenti passaggi:

  1. Clonare (solo le parti utilizzate) della partizione
  2. assicurati che il file system sia ok (resize2fs impone questo passaggio)
  3. ridimensionare la partizione sul nuovo file system

Quanto sopra funziona nel caso in cui la partizione di destinazione abbia le stesse dimensioni o più grande dell'origine. Se la tua destinazione è più piccola della fonte (ma si adatta a tutti i dati), procedi come segue:

e2fsck -f /dev/sd(target)
resize2fs -M /dev/sd(target)
partclone.ext4 -b -s /dev/sd(source) -o /dev/sd(target)
resize2fs /dev/sd(target)

resize2fs -M riduce il file system alla dimensione minima prima di clonare i dati.

Si noti che partclonenon è installato per impostazione predefinita sulla maggior parte dei sistemi. Usa una distro live come clonezilla o installa partclone dal gestore pacchetti distro ( apt-get install partclonesu sistemi basati su debian).

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.