Kopieren Sie die gesamte Dateisystemhierarchie von einem Laufwerk auf ein anderes

95

Ich möchte die gesamte Dateisystemhierarchie von einem Laufwerk auf ein anderes kopieren. Der Inhalt jedes Verzeichnisses sowie die regulären Dateien auf der Linux-Plattform. Wäre dankbar, zu wissen, wie man das am besten mit möglicherweise in Linux eingebauten Funktionen macht. Das Dateisystem ist eine ext-Familie.

Jongleur
quelle
1
Ähm ... wo ist die Liebe zu dd? dd if=/dev/sda1 of=/dev/sdb1 bs=4096
juniorRubyist
@juniorRubyist +1 für dd. Ich benutze das immer. Aber welche Flags sollen verwendet werden? Ich benutze conv=notrunc,noerror,sync.
BeniBela
-1 aus ddzwei Gründen: Erstens ist es eine schlechte Idee, eine Kopie eines Dateisystems auf Blockebene durchzuführen, das gemountet ist (was der Fall ist /), und zweitens ddwerden keine Daten von Quellen kopiert, die innerhalb des Dateisystems wie /bootund gemountet sind /home.
Eric

Antworten:

33

Ich benutze oft

> cp -ax / /mnt

Vorausgesetzt, / mnt ist der neue Datenträger auf / mnt und es gibt keine anderen Mounts auf /.

das -x hält es auf dem einen Dateisystem.

Dies muss natürlich als root oder mit sudo erfolgen.

Dieser Link enthält einige Alternativen, einschließlich der oben genannten

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

WolfmanJM
quelle
während dieser tote alte Antwort ist , ist es noch erwähnenswert, dass Sie in der Regel der Stoff in nicht alle kopieren möchten /, ohne das heißt /dev, /sys, /procetc. Daher vor der Ausgabe , dass cpich für eine bessere Ansätze empfehlen die Suche (auch rsync)
Marcin Orlowski
2
@MarcinOrlowski WolfJMs Verwendung des -xFlags bedeutet, dass die von Ihnen erwähnten synthetischen Dateisysteme nicht kopiert werden.
Jim L.
192

Was Sie wollen, ist Rsync .

Mit diesem Befehl können Sie einen Ordner synchronisieren und den Kopiervorgang fortsetzen, wenn er zur Hälfte abgebrochen wurde. Der Befehl zum Kopieren einer Festplatte lautet:

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

Die Optionen sind:

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

Um die Kopiergeschwindigkeit zu verbessern, fügen Sie -W( --whole-file) hinzu, um die Berechnung von Deltas / Diffs der Dateien zu vermeiden. Dies ist die Standardeinstellung, wenn sowohl die Quelle als auch das Ziel als lokale Pfade angegeben werden, da der eigentliche Vorteil des Delta-Transfer-Algorithmus von rsync darin besteht, die Netzwerknutzung zu reduzieren.

--numeric-idsErwägen Sie auch das Hinzufügen , um das Zuordnen von UID- / GID-Werten nach Benutzer- / Gruppennamen zu vermeiden.

Michael Aaron Safyan
quelle
1
Genie, danke. Übrigens habe ich am Ende verwendet, rsync -avxHAWX --numeric-ids --progress / mnt/aber ich hätte es tun sollen rsync -avxHAWX --numeric-ids --progress / mnt/ > ~/rsync.out. Ich vermute, das Eingießen der Ausgabe in das Terminal hat den Prozess verlangsamt. : D
Chris K
28
--info=progress2anstatt --progressist nützlich für große Übertragungen, da es den Gesamtfortschritt anzeigt, anstatt (Millionen von Zeilen für) einzelne Dateien.
Florian
3
Ich musste Xund Amit ersetzen E, da erweiterte Attribute und ACLs von Eauf meinem Mac abgedeckt werden . Getestet:rsync version 2.6.9 protocol version 29
Jonathan Komar
1
Zusätzlich zu > ~/rsync.out, 2> ~/rsync.errspeichert alle Fehler in einer separaten Datei.
Aneel
2
Wenn Sie aus einem anderen Ordner als kopieren /, beachten Sie, dass ein abschließender Schrägstrich (oder nicht) im Quellverzeichnis einen Unterschied macht: rsync source/ dest/kopiert alles , was sich source/darin befindet dest/, während rsync source dest/der Ordner sourceund alles, was sich darin befindet , kopiert werden dest/.
Semi-Extrinsic
45

Die Antwort von Michael Aaron Safyan berücksichtigt keine spärlichen Dateien. -SOption behebt das.

Auch diese Variante spamt nicht mit jeder Datei und führt keine Delta-Synchronisierung durch, was die Leistung in Fällen, in denen kein Netzwerk vorhanden ist, beeinträchtigt.

Perfekt zum Kopieren des Dateisystems von einem lokalen Laufwerk auf ein anderes lokales Laufwerk.

rsync -axHAWXS --numeric-ids --info=progress2
Ilia Sidorenko
quelle
1
Tolle. Das macht wirklich einen guten Job
Gildas
1
Dies sollte die akzeptierte Antwort sein, funktioniert super. Beispiel55,431,669,792 57% 97.47MB/s 0:06:56 xfr#2888, ir-chk=5593/8534)
Drew
1
<3 das ist perfekt
Tim Strijdhorst
6

Für eine One - Shot lokale Kopie von einem Laufwerk auf ein anderes, ich denke , cp von Wolfmann , wie hier oben reicht.

Für größere Arbeiten wie beispielsweise lokale oder Remote-Backups ist rsync am besten geeignet .

Natürlich ist die Verwendung von rsync wesentlich komplexer.

Warum rsync:

  • Auf diese Weise können Sie alle oder einen Teil Ihres Laufwerks A auf Laufwerk B kopieren (synchronisieren). Sie haben viele Optionen, z. B. das Ausschließen einiger Verzeichnisse aus der Kopie (z. B. / proc).

  • Ein weiterer großer Vorteil ist, dass dieses native Tool die Dateiübertragung überwacht: Bei umfangreichen Übertragungen wird die Verbindung vom Haltepunkt aus fortgesetzt, wenn die Verbindung unterbrochen wird.

  • Und last but not least verwendet rsync die ssh-Verbindung, sodass Sie remote synchronisierte gesicherte "Kopien" erhalten. Schauen Sie sich die Manpage sowie hier einige Beispiele an .

Hornetbzz
quelle
4

Wie Michael Safyan oben vorschlägt, habe ich rsyncfür diesen Zweck verwendet. Ich schlage vor, einige zusätzliche Optionen zu verwenden, um Verzeichnisse auszuschließen, die Sie wahrscheinlich nicht kopieren möchten.

Diese Version ist ziemlich spezifisch für Gnome- und Debian / Ubuntu-basierte Systeme, da sie Unterverzeichnisse der für Gnome spezifischen Benutzerverzeichnisse sowie den APT-Paket-Cache enthält.

In der letzten Zeile werden alle Verzeichnisse mit dem Namen cache / Cache / .cache ausgeschlossen, die für einige Verwendungszwecke möglicherweise zu aggressiv sind:

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
Dan
quelle
2

Hinzufügen von zwei nützlichen Bits zum Thread-Re-Sync: Ändern der Verschlüsselung und Verwenden von --update:

Laut Wolfmans Beitrag cp -axist er elegant und cool für lokale Sachen.

Allerdings rsyncist auch genial. Im Anschluss an Michaels Antwort Re -W, der CYPHER Veränderung kann auch die Dinge beschleunigen (lesen obwohl auf alle Auswirkungen auf die Sicherheit nach oben).

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

Es gibt einige Diskussionen (und Benchmarks) darüber, dass eine langsame CPU der eigentliche Engpass ist, aber es scheint mir zu helfen, wenn die Maschine geladen ist und gleichzeitig andere Dinge erledigt.

Einer der anderen Hauptgründe für die Verwendung von rsync in einer großen, rekursiven Kopie wie dieser ist der Schalter -u (oder --update ). Wenn es während des Kopierens ein Problem gibt, können Sie es beheben, und rsync wird dort weitermachen, wo es aufgehört hat (ich glaube nicht, dass scp dies hat). Wenn Sie es lokal machen, hat cp auch einen -u-Schalter.

(Ich bin mir nicht sicher, welche Auswirkungen --update und --whole-file zusammen haben, aber sie scheinen bei dieser Art von Aufgabe immer sinnvoll zu funktionieren.)

Mir ist klar, dass dies kein Thread über die Funktionen von rsync ist, aber einige der häufigsten, die ich dafür verwende, sind:

  • --delete-after etc (wie Michael im Nachhinein erwähnt hat), wenn Sie das neue System wieder an den ursprünglichen Ort synchronisieren möchten oder so ähnlich. Und,
  • --exclude - zum Überspringen von Verzeichnissen / Dateien, zum Beispiel zum Kopieren / Erstellen eines neuen Systems an einen neuen Ort, während Benutzerverzeichnisse usw. übersprungen werden (entweder mounten Sie Häuser von einem anderen Ort aus oder erstellen Sie neue Benutzer usw.).

Übrigens, wenn ich jemals Windows verwenden muss, verwende ich rsync von cygwin, um große rekursive Kopien zu erstellen, da der Explorer nicht mehr von vorne anfangen möchte (obwohl Finder OS X für mich noch schlimmer ist).

Herdingofthecats
quelle
2

rsync

"Dieser Ansatz wird als besser angesehen als das Klonen von Festplatten mit dd, da er die Verwendung einer anderen Größe, Partitionstabelle und eines anderen Dateisystems ermöglicht und besser als das Kopieren mit cp -a, da er eine bessere Kontrolle über die Dateiberechtigungen und Attribute ermöglicht , Zugriffssteuerungslisten (Access Control Lists, ACLs) und erweiterte Attribute. "

Von:

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

Manpage hier

Mauro Colella
quelle
2

Wie in den Kommentaren von juniorRubyist erwähnt, sollte hier der bevorzugte Ansatz verwendet werden dd. Der Hauptgrund ist die Leistung, es ist eine Block-für-Block-Kopie anstelle von Datei-für-Datei.

Eine Partition klonen

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

Klonen einer gesamten Festplatte

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

Verweise

  1. https://wiki.archlinux.org/index.php/disk_cloning
Rikard Söderström
quelle
dd/Dies ist aus zwei Gründen eine sehr schlechte Idee: Erstens führt das Kopieren eines bereitgestellten Dateisystems auf Blockebene (was der Fall ist ) höchstwahrscheinlich zu Fehlern im Zieldateisystem und zweitens ddwerden keine Daten aus bereitgestellten Quellen kopiert das Dateisystem wie /bootund /home. Ihr Link ist gültig für das Klonen von Datenträgern, nicht für das Klonen von "Dateihierarchien"
Eric
1

'dd' ist großartig, aber ddrescue (apt install gddrescue) ist noch besser. Wenn dd unterbrochen wird, gibt es keine Möglichkeit zum Neustart (ein weiterer guter Grund, rsync zu verwenden). Wenn Sie ddrescue mit einer Protokolldatei verwenden, wird protokolliert, welche Blöcke kopiert wurden.

Beim Sichern eines Dual-Boot-Windows / Linux-Systems verwende ich ntfsclone für die Windows-Partitionen und ddrescue für die Linux-Partition und dd für den MBR. (Ich habe nicht versucht, ein Dual-Boot-System mit GPT / UEFI zu sichern.)

Was ich gerne sehen würde, ist ein ddrescue-Tool, das Dateien wie ntfsclone erstellen kann, in denen nicht zugewiesener Speicherplatz mit Steuerzeichen markiert ist. Dadurch kann das Image nicht direkt eingehängt werden, sondern ist nur so groß wie die enthaltenen Daten.

Jemand, bitte überlegen Sie sich das "spezielle Bildformat" von ntfsclone für ddrescue ...

EuGH
quelle
0

rsync ist die perfekte Lösung wie oben erklärt.

Ich würde nur hinzufügen, -Sum " mit spärlichen Dateien effizient umzugehen", falls es ein Docker-Devicemapper-Volume oder ähnliches gibt, das kopiert werden soll.

Jürgen Weigert
quelle
0

Ich habe die hier vorgeschlagenen rsync-Befehle ausprobiert, aber schließlich habe ich mit viel saubereren und schnelleren Ergebnissen partclone. Hängen Sie die Quell- und Zielpartitionen aus und führen Sie dann Folgendes aus:

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

Dies führt die folgenden Schritte aus:

  1. Klonen Sie (nur die verwendeten Teile) der Partition
  2. Stellen Sie sicher, dass das Dateisystem in Ordnung ist (resize2fs erzwingt diesen Schritt)
  3. Ändern Sie die Größe der Partition in das neue Dateisystem

Das Obige funktioniert, wenn die Zielpartition dieselbe Größe oder größer als die Quellpartition hat. Wenn Ihr Ziel kleiner als die Quelle ist (aber für alle Daten geeignet ist), gehen Sie wie folgt vor:

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 verkleinert das Dateisystem auf die minimale Größe, bevor die Daten geklont werden.

Beachten Sie, dass partcloneauf den meisten Systemen nicht standardmäßig installiert ist. Verwenden Sie eine Live-Distribution wie clonezilla oder installieren Sie partclone von Ihrem Distributionspaket-Manager ( apt-get install partcloneauf Debian-basierten Systemen).

Thawn
quelle