Jak przenieść / skopiować wolumin logiczny (lv) do innej grupy woluminów (vg)?

17

Zasadniczo chcę przenieść / skopiować kilka woluminów logicznych (lv) do nowej grupy woluminów (vg). Nowa grupa woluminów znajduje się na nowym zestawie woluminów fizycznych. Czy ktoś wie, jak to zrobić bezpiecznie, nie uszkadzając danych w tych logicznych woluminach?

nikt
źródło
Czy możesz podać więcej szczegółów? Czy wiesz, jak zrobić nowe VG i LV? Czy przenosisz partycję danych czy swoją partycję główną?
Panther
@ bodhi.zazen: Właściwie to próbowałem przenieść rodzaj partycji danych. Przez „rodzaj” rozumiałem przez to, że te logiczne woluminy są maszynami wirtualnymi. (tzn. te logiczne woluminy pojawiają się na maszynach wirtualnych jako urządzenia blokowe). W każdym razie byłem w stanie poradzić sobie z sytuacją na swój własny sposób. Kroki są podane w mojej odpowiedzi. Jednak ty i wszyscy możecie komentować moją metodę. Jeśli istnieje / jest lepszy sposób (-y) na wykonanie tego rodzaju czynności, prosimy o uprzejmość, aby je udostępnić. :)
nikt
Najpierw stworzyłbym nowe PV / LV, zamknąłem maszynę wirtualną, a następnie skopiowałem dane za pomocą dd, uruchom nową maszynę wirtualną i potwierdź, że działała.
Panther

Odpowiedzi:

12

vgmerge pozwala łączyć dwa VG. Możesz także użyć pvmove do przenoszenia danych w VG i vgsplit, jeśli chcesz wrócić do wielu VG.

Gabriel
źródło
Jedna uwaga. Aby to zrobić, musisz mieć urządzenie tymczasowe używane do przeniesienia LV online do innego VG. Oczywiście po przeniesieniu powinieneś zaktualizować / etc / fstab i inną konfigurację, której dotyczy problem, i zaplanować trochę czasu offline na ponowne uruchomienie, i ewentualnie dokonać aktualizacji konfiguracji. Jeśli wykonasz jakąś akcję z rootfami lub bootfami, powinieneś mieć trochę dystrybucji Linuksa na żywo dla głównego systemu odzyskiwania.
Znik
10

Nie ma powodu, aby najpierw skopiować go do pliku .img, po prostu wykonaj najpierw lvcreate, a następnie bezpośrednio skopiuj:

lvcreate --snapshot --name <the-name-of-the-snapshot> --size <the size> /dev/volume-group/logical-volume
lvcreate --name <logical-volume-name> --size <size> the-new-volume-group-name
dd if=/dev/volume-group/snapshot-name of=/dev/new-volume-group/new-logical-volume
zaraz
źródło
2
To trochę za krótko. Nie mówi dokładnie, jakie są wymienione rozmiary - na przykład <rozmiar> może być bardzo mały, ponieważ dotyczy to tylko różnic migawkowych.
gorn
1
@gorn ważny punkt, ale odpowiadał na niczyją odpowiedź poniżej, która była pierwsza w tym czasie. Przeczytaj to dla dodatkowego kontekstu.
Tobias J
7

Okej, byłem w stanie poradzić sobie z sytuacją na swój własny sposób. Oto kroki, które podjąłem:

1) Zrób migawkę woluminu logicznego targetowania.

lvcreate --snapshot --name <the-name-of-the-snapshot> --size <the size> /dev/volume-group/logical-volume

Uwaga: Rozmiar migawki może być tak duży lub tak mały, jak chcesz. Liczy się wystarczająca ilość miejsca, aby uchwycić zmiany w okresie migawki.

2) Utwórz kopię obrazu zawartości migawki za pomocą dd

dd if=/dev/volume-group/snapshot-name of=/tmp/backup.img

3) Utwórz nowy wolumin logiczny o wystarczającej wielkości w docelowej (nowej) grupie woluminów.

lvcreate --name <logical-volume-name> --size <size> the-new-volume-group-name

4) Zapisz dane na nowym woluminie logicznym z kopii zapasowej obrazu za pomocą dd

dd if=/tmp/backup.img of=/dev/new-volume-group/new-logical-volume

5) usuń migawkę i kopię zapasową obrazu, używając odpowiednio lvremovei rm.

To wszystko ludzie ... Mam nadzieję, że to komuś pomoże :)

nikt
źródło
Jeśli ktoś ma lepszą opcję / metodę, daj mi również znać :-)
nikt
ising backup.img do tymczasowego przechowywania kopii zapasowej jest całkowicie niepotrzebny. możesz bezpośrednio dd ze źródłowej migawki, do docelowego LV ze stanem niezmontowanym.
Znik
3

Począwszy od LVM w odcinku Debiana (9.0), a mianowicie 2.02.168-2, jest możliwe do wykonania kopii objętości logicznego w grupach objętości za pomocą kombinacji vgmerge, lvconverti vgsplit. Ponieważ przeniesienie jest kombinacją kopii i usunięcia, zadziała to również w przypadku przeniesienia.

Możesz też użyć pvmovedo przeniesienia głośności.

Kompletna, samodzielna przykładowa sesja z wykorzystaniem urządzeń pętlowych i lvconvertnastępnych.

Podsumowanie: tworzymy grupę woluminów vg1 z logicznym woluminem lv1 i vg2 z lv2 i tworzymy kopię lv1 w vg2.

Utwórz pliki.

truncate pv1 --size 100MB
truncate pv2 --size 100MB

Skonfiguruj urządzenia pętlowe na plikach.

losetup /dev/loop1 pv1
losetup /dev/loop2 pv2

Utwórz woluminy fizyczne na urządzeniach pętli (zainicjuj urządzenia pętli do użytku przez LVM).

pvcreate /dev/loop1 /dev/loop2

Utwórz grupy woluminów vg1 i vg2 odpowiednio w / dev / loop1 i / dev / loop2.

vgcreate vg1 /dev/loop1
vgcreate vg2 /dev/loop2

Utwórz woluminy logiczne lv1 i lv2 odpowiednio w wersjach vg1 i vg2.

lvcreate -L 10M -n lv1 vg1
lvcreate -L 10M -n lv2 vg2

Twórz systemy plików ext4 na poziomach 1 i 2.

mkfs.ext4 -j /dev/vg1/lv1
mkfs.ext4 -j /dev/vg2/lv2

Opcjonalnie napisz coś na lv1, aby później sprawdzić, czy kopia została poprawnie utworzona. Uaktywnij vg1.

vgchange -a n vg1

Uruchom polecenie scalania w trybie testowym. To łączy lv1 z lv2.

vgmerge -A y -l -t -v <<destination-vg>> <<source-vg>>
vgmerge -A y -l -t -v vg2 vg1

A potem naprawdę.

vgmerge -A y -l -v vg2 vg1

Następnie utwórz parę kopii RAID 1 lv1przy użyciu lvconvert. Argument <> mówi, lvconvertaby kopia lustrzana była lv1_copywłączona /dev/loop2.

lvconvert --type raid1 --mirrors 1 <<source-lv>> <<dest-pv>>
lvconvert --type raid1 --mirrors 1 /dev/vg2/lv1 /dev/loop2

Następnie podziel lustro. Nowa LV jest teraz lv1_copy.

lvconvert --splitmirrors 1 --name <<source-lv-copy>> <<source-lv>>
lvconvert --splitmirrors 1 --name lv1_copy /dev/vg2/lv1

Uaktywnij vg2.

vgchange -a n vg2

Następnie (tryb testowy)

vgsplit -t -v <<source-vg>> <<destination-vg>> <<moved-to-pv>>
vgsplit -t -v /dev/vg2 /dev/vg1 /dev/loop1

Na serio

vgsplit -v /dev/vg2 /dev/vg1 /dev/loop1

Wynikowy wynik:

lvs
[...]
lv1        vg1       -wi-a-----  12.00m
lv1_copy   vg2       -wi-a-----  12.00m
lv2        vg2       -wi-a-----  12.00m

UWAGI:

1) Większość tych poleceń będzie musiała być uruchomiona jako root.

2) W przypadku jakiegokolwiek powielenia nazw woluminów logicznych w dwóch grupach woluminów vgmergeodmówi kontynuowania.

3) Po scaleniu:

Logical volumes in `vg1` must be inactive

I przy podziale:

Logical volume `vg2/lv1` must be inactive.
Faheem Mitha
źródło
1
to jest po prostu bezcelowe. Musisz odmontować systemy plików, dezaktywować woluminy itp. Możesz po prostu odmontować katalog i skopiować dane.
user189142,
po pierwsze, jak powiedział użytkownik 189142, jest to bezcelowe. po drugie, jest stosowany tylko w sytuacji, gdy możemy zatrzymać usługi przy użyciu przeniesionego woluminu. jest to problem z usługami działającymi 24 godziny na dobę, 7 dni w tygodniu, a wolumen jest bardzo duży, a dane są liczone w terabajtach. To powoduje, że ta procedura wymaga bardzo długiego czasu obsługi. To powoduje, że o wiele łatwiej jest po prostu utworzyć nowy wolumin, rsync online, a następnie w krótkim czasie rsync offline do aktualizacji, ponownego zamontowania i przywrócenia systemu do stanu online. Oczywiście, bardzo dobrym pomysłem jest usunięcie niepotrzebnych danych z woluminu źródłowego. może tymczasowo przenieść go w jakieś tymczasowe miejsce.
Znik
3

W 4 dotychczasowych odpowiedziach brakuje, że dokładny rozmiar tomu często nie jest znany. lvdisplaypokazuje tylko wartości zaokrąglone do 2 miejsc po przecinku i man lvdisplaywskazuje tylko inne polecenia dla dostępnych opcji. Następujące wybiera MiB, który jest wystarczająco dokładny przy domyślnym rozmiarze bloku LVM 4 MiB:

lvdisplay --units m

MiB jest także domyślne urządzenie do --sizez lvcreate. W razie wątpliwości sprawdź dwukrotnie poprawny rozmiar lvdisplaypo utworzeniu woluminu docelowego. Następnie przejdź dalej, jak w innych odpowiedziach, aby wykonać kopię. Ponadto zalecam sprawdzenie kopii , na przykład za pomocą cmp.

Oto dlaczego używana jest migawka oraz co chroni i nie chroni:

  • Migawka jest tworzona w taki sposób, że wszystkie dane są kopiowane tak, jak w momencie tworzenia migawki. Działania na woluminie źródłowym podczas procesu kopiowania nie zostaną odzwierciedlone w kopii.

  • Migawka chroni również wolumin źródłowy przed błędami ludzkimi w ddwierszu polecenia. Jeśli przypadkowo napiszesz do migawki, tylko dane migawki zostaną uszkodzone i możesz po prostu usunąć migawkę i zacząć od nowa.

  • Wolumin docelowy nie jest chroniony podczas procesów kopiowania. Jeśli inny administrator (lub proces automatyczny, taki jak os-prober dracut) zamontuje niekompletny wolumin, to montaż może coś popsuć . (Nawet montowanie tylko do odczytu może nadal zapisywać pozycje dziennika w woluminie).

Joachim Wagner
źródło
2

Oferuję własne:

umount /somedir/

lvdisplay /dev/vgsource/lv0 --units b

lvcreate -L 12345b -n lv0 vgtarget

dd if=/dev/vgsource/lv0 of=/dev/vgtarget/lv0 bs=1024K conv=noerror,sync status=progress

mount /dev/vgtarget/lv0 /somedir/

jeśli wszystko jest w porządku, usuń źródło

lvremove vgsource/lv0
Conan
źródło
co jeśli wolumin źródłowy jest bardzo duży i nie należy zatrzymywać usługi lub systemu?
Znik
0

Jeśli chcesz skopiować wolumin logiczny z VG A do innego VG B, znalazłem interesujący wariant przy użyciu partclone. Migawka, a następnie kopiowanie za pomocą dd jest dobrą metodą, ale może być powolna, jeśli twój system plików nie jest pełny. To rozwiązanie jest bardzo szybkie, ponieważ kopiuje tylko używane bloki.

  1. Najpierw utwórz migawkę źródłowego LV
lvcreate --snapshot --size 1G /dev/sourcevg/lv --name lv-backup

--sizeo to ile zapisu może wystąpić zanim migawka będzie wyłączone

  1. Utwórz docelowy LV w docelowym VG
lvcreate --size <new_lv_size> /dev/destvg --name newlv

new_lv_size musi być co najmniej wielkości źródła LV

  1. Skopiuj system plików ze źródłowej kopii zapasowej LV do docelowej LV
partclone.<fs_type> --dev-to-dev --source /dev/sourcevg/lv-backup --output /dev/destvg/newlv

fs_typemoże być ext4, fat32, btrfs, xfs, ... wszelkie FS obsługiwany przez partclone

  1. Usuń migawkę
lvremove /dev/sourcevg/lv-backup
HugoPoi
źródło