Jak sklonować system plików btrfs na inny nośnik, zachowując dane udostępniania migawek

9

Zdecydowałem się wypróbować możliwości rajdowe btrfs. Założyłem btrfs z

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

Teraz chcę sklonować moją istniejącą partycję btrfs (która znajduje się na szczycie linux-raid). nie mogę użyć prostego cp -a, ponieważ istnieje ponad 40 kopii zapasowych opartych na migawkach (które chciałbym zachować), a po prostu przepełniłbym całe miejsce, które mogłem zaoszczędzić wiele razy.

Do tej pory widzę dwie opcje:

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

i chyba też musiałbym btrfs balance start /dev/sda9

i

zrób: przyrostowo kopiuj cp -atyle, ile zmieści się w pamięci, a następnie użyj bedupdo usuwania duplikatów plików i zapętlania.

Jaka jest preferowana (tj. Najlepsza praktyka) metoda? Wolałbym ten pierwszy; powinno to zająć znacznie mniej czasu. A może w każdej z tych procedur czai się jakiś „gotcha” (poza tym, że btrfs jest oczywiście eksperymentalny)


Pierwsze pytanie jest po prostu wykluczone; jakkolwiek jest to wspaniałe narzędzie partclone.btrfs, oczywiście nie obsługuje systemów plików z wieloma urządzeniami. :-(

Adam Ryczkowski
źródło

Odpowiedzi:

7

Poprosiłem podobne pytanie 2 lata temu.

Jednak w moim przypadku planowałem skopiować tylko jedno urządzenie na raid0.

W końcu znalazłem rozwiązanie . W tym czasie nie można było przekonwertować z raid0 na raid10, ale tak to wygląda od jądra 3.3, teraz możesz. To rozwiązanie może Ci w końcu zadziałać.

Problem z tym podejściem polega na tym, że kopiuje fsuid. Co oznacza, że ​​nie możesz zamontować zarówno FS, jak i jego kopii na tym samym komputerze. W tym czasie nie było narzędzia do zmiany fsuidFS, ale mogło się to teraz zmienić.

Chodzi o to, aby dodać warstwę kopiowania przy zapisie na oryginalnym urządzeniu, aby można ją było zapisać, ale każda modyfikacja jest wykonywana w innym miejscu, które można później odrzucić. Oznacza to, że potrzebujesz dodatkowej przestrzeni dyskowej (na przykład na dysku zewnętrznym).

Następnie zamontuj ten COW'd FS zamiast oryginału, dodaj urządzenia do kopii FS i usuń urządzenie COW.

Do kopiowania przy zapisie możesz użyć mapera urządzeń.

Do jednorazowego kopiowania w obszarze zapisu używam tutaj urządzenia pętlowego.

Powiedzmy, że chcesz sklonować /dev/sdana /dev/sd[bcde]:

Utwórz sklep COW back:

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

Teraz odmontuj FS źródłowy, jeśli jest zainstalowany, i modprobe -r btrfsupewnij się, że nie będzie przeszkadzał i sprawi, że zapomni o skanowaniu urządzenia.

Następnie wykonaj urządzenie COW'd:

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

Teraz /dev/mapper/cowedjest tak, /dev/sdaże wszystko, co do niej napisane, skończy się /dev/loop0i /dev/sdapozostanie nietknięte.

Teraz możesz go zamontować:

mount /dev/mapper/cowed /mnt

Dodaj inne urządzenia:

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

I usuń stary:

btrfs dev del /dev/mapper/cowed /mnt

Kiedy to się skończy, możesz chcieć zamknąć i odłączyć wtyczkę lub zrobić /dev/sdatylko do odczytu, ponieważ ponieważ ma ten sam fsuid jak inne, btrfsnadal może z tym popsuć.

Teraz, jeśli dobrze rozumiem, zakładając, że masz najnowszą wersję btrfs-prog, powinieneś być w stanie wykonać:

btrfs balance start -d convert=raid10 /mnt

Aby przekonwertować na raid10. Teoretycznie powinno to zapewnić, że każdy fragment danych zostanie skopiowany na co najmniej 2 dyskach.

Zdecydowanie zaleciłbym, aby najpierw wykonać testy na atrapie btrfs na urządzeniach pętlowych, ponieważ wszystko pochodzi z pamięci i mogłem się pomylić (patrz na przykład moja pierwsza odpowiedź przed edycją).

Zauważ, że ponieważ jądro 3.6, btrfs implementuje wysyłanie / odbieranie trochę jak w ZFS. To może być dla ciebie opcja.

Stéphane Chazelas
źródło
Świetna odpowiedź, dziękuję. Przetestuję to. Teraz eksperymentuję z wysyłaniem / odbieraniem.
Adam Ryczkowski
@ Stéphane Chazelas Łącza gminne są martwe (prawdopodobnie na zawsze). Czy możesz dostosować swoją odpowiedź?
Jonas Stein
4

Pomysł Stephane mogą być wykonywane przez btrfs wbudowanych narzędzi (dlatego jest chłodno): make stare btrfs urządzenie ziarno poprzez btrfstune -S 1 /dev/devicedodaj urządzeń, wyjąć urządzenie z nasion, zrobić btrfs balance start. Urządzenie inicjujące to urządzenie tylko do odczytu, które może być częścią systemu plików do odczytu.

ignis
źródło
1

Próbowałem zastosować się do sugestii @ ignis, by użyć seedowania, ale miałem z tym problemy; system zgłosił błąd podczas próby usunięcia urządzenia nasiennego i nie mogłem tego rozwiązać. Potem odkryłem, że istnieje (teraz - btrfs-progs v3.19-64-g19a806f, może nie wcześniej) polecenie:

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

co sprawiło, że klonowanie mojego istniejącego systemu plików btrfs (znajdującego się w woluminie logicznym LVM) na nowej partycji było unikalne. Pamiętaj, że w maju 2015 r. Nie działa w przypadku profili RAID5 / 6 - sprawdź stronę podręcznika, aby uzyskać pełne informacje.

gogoud
źródło
1
Nigdy nie używaj btrfs replace startdo tworzenia kopii zapasowych !! To psuje drzewo urządzeń i czyni dysk niemożliwym do zamontowania! Nie mogłem odzyskać od błędów, więc przywróciłem kopię obrazu z innego urządzenia blokowego za pomocą narzędzia dd- tool. Używaj tylko btrfs replacedo migracji dysku końcowego.
Karmus
0

Opcja 1 - Kopiowanie danych, a następnie zmiana UUID

Upewnij się, że partycja źródłowa jest odmontowana i nie zostanie automatycznie zamontowana.

Użyj albo dd(wolno, głupio) lubpartclone.btrfs -b -s /dev/src -o /dev/target

Służy btrfstune -udo zmiany UUID po kopiowaniu i przed montażem.

Ostrzeżenie utrata danych : Do NIE próbować (auto) zamontować albo oryginał lub kopia aż UUID zmieniła


Opcja 2 - btrfs-clone

Nie próbowałem osobiście btrfs-clone, ale ma to na celu sklonowanie istniejącego systemu plików BTRFS do nowego, klonując kolejno każdą podobjętość.

Tom Hale
źródło