Je možné přesunout logický svazek z jedné skupiny svazků do druhé jako celek?
Je možné vytvořit (více či méně) odpovídající lv a zkopírovat data, ale existuje nějaký způsob, jak to udělat pouze s nástroji LVM?
Pokud ne, existuje teoretický důvod nebo technické omezení (velikosti rozsahu)?
Přijatá odpověď:
Od LVM v Debian stretch (9.0), konkrétně 2.02.168-2, je
možné vytvořit kopii logického svazku napříč skupinami svazků pomocí
kombinace vgmerge
, lvconvert
a vgsplit
. Vzhledem k tomu, že přesun je
kombinací kopírování a smazání, bude to fungovat i pro přesun.
Případně můžete použít pvmove
stačí přesunout hlasitost.
Kompletní samostatná ukázková relace využívající smyčková zařízení a lvconvert
následuje.
Shrnutí:vytváříme skupinu svazků vg1
s logickým svazkem lv1
a vg2
s lv2
a vytvořte kopii lv1
v vg2
.
Vytvářejte soubory.
truncate pv1 --size 100MB
truncate pv2 --size 100MB
Nastavte smyčková zařízení u souborů.
losetup /dev/loop1 pv1
losetup /dev/loop2 pv2
Vytvořte fyzické svazky na smyčkových zařízeních (inicializujte smyčková zařízení pro
použití LVM).
pvcreate /dev/loop1 /dev/loop2
Vytvořte skupiny svazků vg1 a vg2 na /dev/loop1 a /dev/loop2
.
vgcreate vg1 /dev/loop1
vgcreate vg2 /dev/loop2
Vytvořte logické svazky lv1 a lv2 na vg1 a vg2.
lvcreate -L 10M -n lv1 vg1
lvcreate -L 10M -n lv2 vg2
Vytvořte souborové systémy ext4 na lv1 a lv2.
mkfs.ext4 -j /dev/vg1/lv1
mkfs.ext4 -j /dev/vg2/lv2
Volitelně napište něco na lv1, abyste mohli později zkontrolovat, zda byla kopie
správně vytvořena. Deaktivujte vg1.
vgchange -a n vg1
Spusťte příkaz sloučení v testovacím režimu. Toto sloučí vg1 do vg2.
vgmerge -A y -l -t -v <<destination-vg>> <<source-vg>>
vgmerge -A y -l -t -v vg2 vg1
A pak doopravdy.
vgmerge -A y -l -v vg2 vg1
Poté vytvořte zrcadlový pár RAID 1 z lv1
pomocí lvconvert
. dest-pv
argument říká lvconvert
k vytvoření zrcadlové kopie
na /dev/loop2
.
lvconvert --type raid1 --mirrors 1 <<source-lv>> <<dest-pv>>
lvconvert --type raid1 --mirrors 1 /dev/vg2/lv1 /dev/loop2
Pak rozdělte zrcadlo. Nový LV je nyní lv1_copy
.
lvconvert --splitmirrors 1 --name <<source-lv-copy>> <<source-lv>>
lvconvert --splitmirrors 1 --name lv1_copy /dev/vg2/lv1
Vytvořte vg2/lv1
neaktivní.
lvchange -a n /dev/vg2/lv1
Potom (režim testování)
vgsplit -t -v <<source-vg>> <<destination-vg>> <<moved-to-pv>>
vgsplit -t -v /dev/vg2 /dev/vg1 /dev/loop1
Skutečně
vgsplit -v /dev/vg2 /dev/vg1 /dev/loop1
Výsledný výstup:
lvs
[...]
lv1 vg1 -wi-a----- 12.00m
lv1_copy vg2 -wi-a----- 12.00m
lv2 vg2 -wi-a----- 12.00m
POZNÁMKY:
1) Většinu těchto příkazů bude nutné spouštět jako root.
2) Pokud dojde k duplicitě názvů logických svazků v
dvou skupinách svazků, vgmerge
odmítne pokračovat.
3) Při sloučení logické svazky v vg1
musí být neaktivní. A na rozdělených logických svazcích ve vg2
patřící do vg1
musí být neaktivní. V našem případě je to lv1
.