2011-07-07 03:30:57 +0000 2011-07-07 03:30:57 +0000
100
100

Copiare l'intera gerarchia del file system da un'unità all'altra

Vorrei copiare l'intera gerarchia del file system da un'unità all'altra, cioè il contenuto di ogni directory e i file regolari nella piattaforma Linux. Sarei grato di conoscere il modo migliore per farlo, possibilmente con le funzioni incorporate di Linux. Il file system è una famiglia ext.

Risposte (11)

208
208
208
2011-07-07 03:36:43 +0000

Quello che vuoi è rsync .

Questo comando può essere usato per sincronizzare una cartella e anche per riprendere la copia quando viene interrotta a metà strada. 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, aggiungere -W (--whole-file), per evitare di calcolare delta/diff dei file. Questo è il default quando sia l'origine che la destinazione sono specificate come percorsi locali, poiché il vero beneficio dell'algoritmo di trasferimento delta di rsync è ridurre l'uso della rete.

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

56
56
56
2017-03-05 10:42:04 +0000

La risposta di Michael Aaron Safyan non tiene conto dei file sparsi. L'opzione -S risolve questo problema.

Inoltre questa variante non fa spam con l'avanzamento di ogni file e non fa 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
35
35
35
2011-07-07 03:42:40 +0000

Io uso spesso

> cp -ax / /mnt

Presumendo che /mnt sia il nuovo disco montato su /mnt e che non ci siano altri montaggi su /.

il -x lo mantiene su un filesystem.

Questo naturalmente deve essere fatto come root o usando sudo.

Questo link ha alcune alternative, inclusa quella sopra http://linuxdocs.org/HOWTOs/mini/Hard-Disk-Upgrade/copy.html

6
6
6
2011-07-07 20:53:25 +0000

Per una copia locale da un drive all'altro, credo che cp sia sufficiente come descritto da Wolfmann qui sopra.

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

Naturalmente, rsync è significativamente più complesso da usare.

Perché rsync :

  • questo ti permette di copiare (copia sincronizzata) tutto o parte del tuo disco A sul disco B, con molte opzioni, come escludere alcune directory dalla copia (per esempio escludere /proc).

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

  • E ultimo ma non meno importante, rsync usa la connessione ssh, quindi questo permette di ottenere “copie” sicure sincronizzate a distanza. Date un'occhiata alla man page così come qui per alcuni esempi .

5
5
5
2014-02-06 06:11:42 +0000

Come suggerisce Michael Safyan sopra, ho usato rsync per questo scopo. Suggerisco di usare alcune opzioni aggiuntive per escludere le directory che probabilmente non volete copiare.

Questa versione è abbastanza specifica per i sistemi basati su Gnome e Debian/Ubuntu, poiché include le sottodirectory delle home directory degli utenti che sono specifiche di Gnome, così come la cache dei pacchetti APT.

L'ultima riga escluderà qualsiasi directory chiamata cache/Cache/.cache, il che potrebbe essere troppo aggressivo 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
2
2
2012-03-19 23:53:05 +0000

Aggiungendo due bit utili al thread re rsync: cambiando cypher, e usando --update:

Come da post di Wolfman, cp -ax è elegante, e bello per le cose locali.

Tuttavia, anche rsync è fantastico. In seguito alla risposta di Michael su -W, cambiare il cifrario può anche accelerare le cose (informatevi sulle implicazioni di sicurezza però).

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

C'è qualche discussione (e benchmark) in giro sul fatto che una CPU lenta sia l'effettivo collo di bottiglia, ma sembra aiutarmi quando la macchina è carica facendo altre cose in contemporanea.

Una delle altre grandi ragioni per usare rsync in una grande copia ricorsiva come questa è a causa dello switch -u (o –update). Se c'è un problema durante la copia, potete sistemarlo, e rsync riprenderà da dove ha lasciato (non credo che scp abbia questo). Facendolo localmente, cp ha anche uno switch -u.

(non sono sicuro di quali siano le implicazioni di –update e –whole-file insieme, ma sembrano sempre funzionare sensatamente per me in questo tipo di compito)

Mi rendo conto che questo non è un thread sulle caratteristiche di rsync, ma alcune delle più comuni che uso per questo sono:

  • –delete-after etc (come Michael ha menzionato nel follow-up), se volete sincronizzare il nuovo sistema con il posto originale o qualcosa del genere. E,
  • –exclude - per saltare directory/file, per casi come la copia/creazione di un nuovo sistema in un nuovo posto mentre si saltano le directory home degli utenti ecc (o si montano le home da qualche altra parte, o si creano nuovi utenti ecc).

Per inciso, se mai dovessi usare windows, uso rsync da cygwin per fare grandi copie ricorsive, a causa del fatto che explorer è un po’ cerebrale e vuole iniziare dall'inizio (anche se trovo che Finder di OS X sia anche peggio)

2
2
2
2015-05-18 15:45:08 +0000

rsync

“Questo approccio è considerato migliore della clonazione del disco con dd poiché permette di usare una dimensione, una tabella delle partizioni e un filesystem diversi, e migliore anche della copia con cp -a, poiché permette un maggiore controllo sui permessi dei file, sugli attributi, sulle Access Control Lists (ACL) e sugli attributi estesi.”

Da: https://wiki.archlinux.org/index.php/Full_sistemabackupcon_rsync

Man Page Qui

2
2
2
2018-06-14 17:30:20 +0000

Come menzionato nei commenti di juniorRubyist, l'approccio preferito qui dovrebbe essere quello di usare dd. La ragione principale è la performance, è una copia blocco per blocco invece che 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
1
1
1
2019-01-27 21:53:49 +0000

‘dd’ è fantastico, ma ddrescue (apt install gddrescue) è ancora meglio. Se dd viene interrotto, non c'è modo di riavviare (un'altra buona ragione per usare rsync). Quando usate ddrescue con un logfile, tiene traccia di quali blocchi sono stati copiati.

Quando faccio il backup di un sistema dual boot Windows/Linux, uso ntfsclone per le partizioni Windows e ddrescue per la partizione Linux e dd per il MBR. (Non ho provato a fare il backup di un sistema dual boot usando GPT/UEFI.)

Quello che mi piacerebbe vedere è uno strumento ddrescue che possa creare file come ntfsclone dove lo spazio non allocato è marcato con caratteri di controllo. Questo rende l'immagine non direttamente montabile, ma le permette di essere grande solo quanto i dati contenuti.

Qualcuno per favore proponga il “formato immagine speciale” ntfsclone per ddrescue…

1
1
1
2019-07-31 21:30:35 +0000

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

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

Questo esegue i seguenti passi:

  1. Clonare (solo le parti usate) la partizione
  2. assicurarsi che il file system sia a posto (resize2fs esegue questo passo)
  3. ridimensionare la partizione al nuovo file system

Quanto sopra funziona nel caso in cui la partizione di destinazione sia della stessa dimensione o più grande di quella sorgente. Se la destinazione è più piccola della sorgente (ma contiene tutti i dati), allora fate 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 restringe il filesystem alla dimensione minima prima di clonare i dati.

Notate che partclone non è installato di default sulla maggior parte dei sistemi. Usare una distro live come clonezilla o installare partclone dal gestore di pacchetti della propria distro (apt-get install partclone sui sistemi basati su debian).

0
0
0
2015-08-07 18:04:55 +0000

rsync è la soluzione perfetta come spiegato sopra.

Aggiungerei solo -S a “gestire i file sparsi in modo efficiente” nel caso ci sia un volume docker devicemapper o simile da copiare.