So klonen Sie das btrfs-Dateisystem auf ein anderes Medium, wobei die Freigabedaten von Snapshots erhalten bleiben

9

Ich habe beschlossen, btrfs raid-Funktionen auszuprobieren. Ich habe ein btrfs mit eingerichtet

sudo mkfs.btrfs -m raid10 -d raid10 /dev/sda9 /dev/sdb9 /dev/sdc9 /dev/sdd9

Jetzt möchte ich meine vorhandene btrfs-Partition klonen (die sich über Linux-RAID befindet). cp -aIch kann kein einfaches verwenden , da es über 40 Snapshot-basierte Backups gibt (die ich beibehalten möchte), und ich würde einfach den gesamten Speicher überfüllen, den ich mehrmals sparen kann.

Bisher sehe ich zwei Möglichkeiten:

partclone.btrfs -s /path/to/original/fs -o /dev/sda9 -b

und ich nehme an, ich müsste es auch btrfs balance start /dev/sda9

und

do: Inkrementelles Kopieren mit cp -aso viel, wie in den Speicher passt, und dann bedupzum Deduplizieren von Dateien und zum Schleifen.

Was ist die bevorzugte (dh Best-Practice-) Methode? Ich würde den ersten sehr bevorzugen; es sollte viel weniger Zeit dauern. Oder vielleicht lauert in einem dieser Verfahren ein böses "Gotcha" (abgesehen von der Tatsache, dass btrfs natürlich experimentell ist)


Die erste Frage kommt einfach nicht in Frage; So wunderbar das Tool auch partclone.btrfsist, es unterstützt offensichtlich keine Dateisysteme mit mehreren Geräten. :-(

Adam Ryczkowski
quelle

Antworten:

7

Ich habe vor 2 Jahren eine ähnliche Frage gestellt .

In meinem Fall hatte ich jedoch nur vor, ein einzelnes Gerät auf raid0 zu kopieren.

Ich habe schließlich eine Lösung gefunden . Zu der Zeit konnten Sie nicht von raid0 nach raid10 konvertieren, aber es sieht so aus, als ob Sie dies seit Kernel 3.3 jetzt können. Diese Lösung könnte also am Ende für Sie funktionieren.

Ein Problem bei diesem Ansatz ist, dass die fsuid kopiert wird. Das heißt, Sie können den FS und seine Kopie nicht auf demselben Computer bereitstellen. Zu der Zeit gab es kein Werkzeug, um das fsuideines FS zu ändern , aber es könnte sich jetzt geändert haben.

Die Idee ist, eine Copy-on-Write-Ebene über dem Originalgerät hinzuzufügen, damit darauf geschrieben werden kann. Änderungen werden jedoch an einer anderen Stelle vorgenommen, die Sie später verwerfen können. Das heißt, Sie benötigen zusätzlichen Speicherplatz (z. B. auf einem externen Laufwerk).

Hängen Sie dann diesen COW'd FS anstelle des Originals ein, fügen Sie die Geräte für die FS-Kopie hinzu und entfernen Sie das COW-Gerät.

Zum Kopieren beim Schreiben können Sie den Geräte-Mapper verwenden.

Für die Einwegkopie im Schreibbereich verwende ich hier ein Loop-Gerät.

Angenommen, Sie möchten klonen /dev/sdaauf /dev/sd[bcde]:

Erstellen Sie den COW Back Store:

truncate -s 100G /media/STORE/snap-store
losetup /dev/loop0 /media/STORE/snap-store

Hängen Sie nun den Ursprungs-FS aus, wenn er gemountet ist, und modprobe -r btrfsstellen Sie sicher, dass er nicht stört, und vergessen Sie den Gerätescan.

Dann machen Sie das COW-Gerät:

echo "echo 0 $(blockdev --getsize /dev/sda) snapshot /dev/sda /dev/loop0 N 8 | dmsetup create cowed

Jetzt /dev/mapper/cowedist es so, /dev/sdaaußer dass alles, was darauf geschrieben wird, endet /dev/loop0und /dev/sdaunberührt bleibt.

Jetzt können Sie es montieren:

mount /dev/mapper/cowed /mnt

Fügen Sie die anderen Geräte hinzu:

btrfs dev add /dev/sd[bcde] /mnt

Und entferne den alten:

btrfs dev del /dev/mapper/cowed /mnt

Wenn das vorbei ist, möchten Sie vielleicht herunterfahren und den Netzstecker ziehen oder schreibgeschützt machen, /dev/sdada es die gleiche Fsuid wie die anderen hat und btrfsmöglicherweise immer noch Probleme damit hat.

Wenn ich das richtig verstehe, sollten Sie unter der Annahme, dass Sie das neueste btrfs-prog haben, in der Lage sein, Folgendes zu tun:

btrfs balance start -d convert=raid10 /mnt

In raid10 konvertieren. Theoretisch sollte dies sicherstellen, dass jeder Datenblock auf mindestens 2 Festplatten kopiert wird.

Ich würde dringend empfehlen, dass Sie zuerst Tests mit einem Dummy-BTRFS auf Loop-Geräten durchführen, da alles aus dem Speicher stammt und ich es möglicherweise falsch verstanden habe (siehe zum Beispiel meine erste Antwort vor meiner Bearbeitung).

Beachten Sie, dass btrfs seit Kernel 3.6 das Senden / Empfangen ein bisschen wie in zfs implementiert. Das könnte eine Option für Sie sein.

Stéphane Chazelas
quelle
Tolle Antwort, danke. Ich werde es testen. Jetzt experimentiere ich mit dem Senden / Empfangen.
Adam Ryczkowski
@ Stéphane Chazelas Die Gmane-Links sind tot (wahrscheinlich für immer). Könnten Sie Ihre Antwort anpassen?
Jonas Stein
4

Stephanes Idee kann mit den in btrfs integrierten Tools umgesetzt werden (deshalb ist es cool): Machen Sie das alte btrfs zu einem Seed-Gerät über btrfstune -S 1 /dev/device, fügen Sie Geräte hinzu, entfernen Sie das Seed-Gerät, tun Sie es btrfs balance start. Ein Seed-Gerät ist ein schreibgeschütztes Gerät, das Teil eines schreibgeschützten Dateisystems sein kann.

ignis
quelle
1

Ich habe versucht, dem Vorschlag von @ ignis zu folgen, Seeding zu verwenden, hatte aber Probleme damit. Das System hat beim Versuch, das Seed-Gerät zu entfernen, einen Fehler ausgegeben, den ich nicht überwinden konnte. Dann fand ich heraus, dass es (jetzt - btrfs-progs v3.19-64-g19a806f, vielleicht nicht früher) den Befehl gibt:

  btrfs replace start [-Bfr] <srcdev>|<devid> <targetdev> <path>

Das machte das Klonen meines vorhandenen btrfs-Dateisystems (das sich in einem logischen LVM-Volume befand) auf eine neue Partition zu einem Kinderspiel. Beachten Sie, dass es ab Mai 2015 nicht für RAID5 / 6-Profile funktioniert. Weitere Informationen finden Sie auf der Manpage.

gogoud
quelle
1
Niemals btrfs replace startfür Backup-Zwecke verwenden !! Es beschädigt Ihren Gerätebaum und macht das Laufwerk unmontierbar! Es war mir unmöglich, die Fehler zu beheben, daher habe ich mit dem dd -tool eine Image-Kopie von einem anderen Blockgerät wiederhergestellt. Nur btrfs replacefür die Migration des endgültigen Laufwerks verwenden.
Karmus
0

Option 1 - Datenkopie, dann UUID ändern

Stellen Sie sicher, dass die Quellpartition nicht bereitgestellt ist und nicht automatisch bereitgestellt wird.

Verwenden Sie entweder dd(langsam, dumm) oderpartclone.btrfs -b -s /dev/src -o /dev/target

Verwenden Sie btrfstune -udiese Option, um die UUID nach dem Kopieren und vor dem Mounten zu ändern.

Datenverlust - Warnung : Do NOT versuchen, (auto) montieren entweder Original oder Kopie , bis die UUID hat sich geändert


Option 2 - btrfs-clone

Ich habe es nicht persönlich versucht btrfs-clone, aber es gibt vor, ein vorhandenes BTRFS-Dateisystem in ein neues zu klonen und jedes Subvolume der Reihe nach zu klonen.

Tom Hale
quelle