Существует ли простой способ перемещения / копирования логического тома из одной группы томов в другую? (LVM2)

15

Я переставляю кучу дисков на своем сервере дома, и я нахожусь в положении желания переместить кучу логических томов LVM в другую группу томов. Есть ли простой способ сделать это? Я видел упоминание о cplvкоманде, но она, кажется, либо старая, либо недоступна для Linux.

JKP
источник

Ответы:

20

Если вы можете сделать так, чтобы логический том находился в отдельном подмножестве физических томов от остальной части исходной группы томов ( lvconvert sourcevg/sourcelv /dev/pv1 ...может помочь), вы можете использовать, vgsplitчтобы разделить lv на новый vg и vgmergeобъединить новый vg с цель VG.

Хотя в LVM есть функция зеркалирования, вы не можете (разумно) использовать ее для копирования между группами томов, поскольку обе ветви зеркала должны находиться на одном и том же vg, и связь не может быть нарушена .

Вы можете скопировать том LVM на другой, как если бы вы копировали любой том на другой: создайте целевой lv соответствующего размера, а затем скопируйте содержимое с помощью dd if=/dev/sourcevg/sourcelv of=/dev/targetvg/targetlv bs=4M. Если исходный том активен, вы можете использовать LVM для создания согласованной копии: сначала сделайте снимок исходного lv с помощью lvcreate -s, а затем скопируйте снимок.

Жиль "ТАК - перестань быть злым"
источник
1
Brilliant Gilles .... vgsplit / vgmerge, вероятно, будет в порядке: после этого я могу использовать pvmove, чтобы переместить физические экстенты на новый диск, а затем удалить старый том из VG.
JKP
Позор, в конце концов это не сработало для меня из-за разных размеров экстента. Если это не проблема для вас, хотя я предлагаю этот метод будет самым простым.
JKP
После dd(если вы не спешите сбрасывать старые тома), не забудьте изменить UUID новых файловых систем: tune2fs -U random / dev / targetvg / targetlv
midenok
2
pvmove -n lvol1 /dev/sdb1 /dev/sdc1

pvmove может перемещать данные между физическими томами: Руководство администратора LVM

Милан
источник
10
Но не между объемными группами.
MattBianco
Я повторяю: это не работает для двух отдельных групп томов
kissgyorgy
Сначала vgextendvg1 с новым pv, затем pvmoveваш lv в новый pv, vgsplitвременный vg, который вы vgmergeв vg2. Затем pvmoveснова lv to vg2 оригинальный pv, vgreducevg2, чтобы прочитать промежуточный pv. Или чтобы избежать промежуточной копии, вы можете просто сначала объединить vg1 в vg2, pvmovelv1 и vgsplitснова vg1 из vg2. Это должно ответить на возражения @ MattBianco и @kissgyorgy и эквивалентно решению @Gilles , но заменяя снимок и низкоуровневых ddнаpvmove
marcz
1

По состоянию на LVM в Debian участке (9.0), а именно 2.02.168-2, это возможно сделать копию логического тома по группам томов , используя комбинацию vgmerge, lvconvertи vgsplit. Поскольку перемещение представляет собой комбинацию копии и удаления, это также будет работать для перемещения.

Кроме того, вы можете использовать, pvmoveчтобы просто переместить громкость.

Полный автономный пример сеанса с использованием петлевых устройств и далее lvconvert.

Резюме: мы создаем группу томов vg1с логическим томом lv1, а vg2также lv2и делаем копию lv1в vg2.

Создавайте файлы.

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

Настройте устройства петли на файлах.

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

Создайте физические тома на петлевых устройствах (инициализируйте петлевые устройства для использования LVM).

pvcreate /dev/loop1 /dev/loop2

Создайте группы томов vg1и vg2на /dev/loop1и /dev/loop2 соответственно.

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

Создайте логические тома lv1и lv2на vg1и vg2соответственно.

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

Создайте файловые системы ext4 на lv1и lv2.

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

При желании, напишите что-нибудь, lv1чтобы потом можно было проверить, правильно ли была создана копия. Сделать vg1неактивным.

vgchange -a n vg1

Запустите команду слияния в тестовом режиме. Это сливается lv1в lv2.

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

А потом по-настоящему.

vgmerge -A y -l -v vg2 vg1

Затем создайте зеркальную пару RAID 1 с lv1помощью lvconvert. <> Аргумент говорит , lvconvertчтобы сделать зеркальную копию lv1_copyна /dev/loop2.

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

Затем разделите зеркало. Новый LV сейчас lv1_copy.

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

Сделать vg2неактивным.

vgchange -a n vg2

Тогда (режим тестирования)

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

Серьезно

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

Результирующий вывод:

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

ПРИМЕЧАНИЯ:

1) Большинство из этих команд нужно будет выполнять от имени пользователя root.

2) Если есть какое-либо дублирование имен логических томов в двух группах томов, vgmergeоткажется продолжить.

3) При слиянии:

Logical volumes in `vg1` must be inactive

И на раскол:

Logical volume `vg2/lv1` must be inactive.
Фахим Митха
источник