Как переместить / скопировать логический том (lv) в другую группу томов (vg)?

17

По сути, я хочу переместить / скопировать несколько логических томов (lv) в новую группу томов (vg). Новая группа томов находится на новом наборе физических томов. Кто-нибудь знает, как сделать это безопасно, не повреждая данные внутри этих логических томов?

никто
источник
Можете ли вы предоставить более подробную информацию? Вы знаете, как сделать новые VG и LV? Вы перемещаете раздел данных или ваш корневой раздел?
Пантера
@ bodhi.zazen: На самом деле я пытался переместить раздел данных. Под «видом» я понимал, что эти логические тома являются виртуальными машинами. (т.е. эти логические тома отображаются на виртуальных машинах как блочные устройства). В любом случае, я смог справиться с ситуацией по-своему. Шаги приведены в моем ответе. Тем не менее, вы и все вы можете прокомментировать мой метод. Если есть / есть лучший способ сделать это, пожалуйста, будьте любезны поделиться им. :)
никто не
Сначала я создал бы новый PV / LV, выключил виртуальную машину, затем скопировал данные с помощью dd, загрузил новую виртуальную машину и подтвердил, что она работает.
Пантера

Ответы:

12

vgmerge позволяет объединить два VG. Вы также можете использовать pvmove для перемещения данных в VG и vgsplit, если вы хотите вернуться к нескольким VG.

Габриель
источник
Одна нота. Для этого у вас должно быть временное устройство, используемое для перевода онлайн LV в другой VG. Конечно, после переноса вы должны обновить / etc / fstab и другую затронутую конфигурацию, а также запланировать некоторое время автономной работы для перезагрузки и, в конечном итоге, внести некоторые изменения в конфигурацию. Если вы выполняете какие-либо действия с rootfs или bootfs, у вас должен быть дистрибутив linux live для восстановления основной системы.
Зник
10

Нет причин сначала копировать его в файл .img, просто сначала выполните lvcreate, а затем непосредственно скопируйте его:

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
скоро
источник
2
Это слишком коротко. Это не говорит, что именно упомянутые размеры - например, <размер> может быть очень маленьким, поскольку это только для различий снимка.
Гор
1
@ Заработал верную точку зрения, но он отвечал ни на один из приведенных ниже ответов, который был первым в то время. Прочитайте это для дополнительного контекста.
Тобиас Дж
7

Хорошо, я смог справиться с ситуацией по-своему. Вот шаги, которые я предпринял:

1) Сделайте снимок целевого логического тома.

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

Примечание. Размер снимка может быть как угодно большим. Важно иметь достаточно места, чтобы зафиксировать изменения во время снимка.

2) Создайте копию изображения снимка с помощью dd

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

3) Создайте новый логический том достаточного размера в целевой (новой) группе томов.

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

4) Запишите данные на новый логический том из резервной копии образа, используя dd

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

5) удалить снимок и резервную копию изображения, используя lvremoveи rmсоответственно.

Вот и все, ребята ... Надеюсь, это кому-нибудь поможет :)

никто
источник
Если у кого-то есть лучший вариант / метод, дайте мне знать :-)
никто не
ising backup.img для временного резервного копирования хранилища не требуется. Вы можете напрямую перейти от исходного снимка к целевому LV с не смонтированным состоянием.
Зник
3

По состоянию на 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.
Фахим Митха
источник
1
это просто бессмысленно. Вы должны размонтировать файловые системы, деактивировать тома и т. Д. Вы можете просто размонтировать dir и скопировать данные.
user189142
Во-первых, как сказал пользователь 189142, это бессмысленно. во-вторых, это применяется только в ситуации, когда мы можем остановить сервисы, используя перемещенный объем. Это проблема с сервисами, работающими 24/7, и объем очень велик с данными, подсчитанными с терабайтами. По этой причине эта процедура требует очень длительного времени обслуживания. По этой причине гораздо проще просто создать новый том, rsync онлайн, а затем через короткое время rsync в автономном режиме для обновления, перемонтирования и возврата системы в оперативное состояние. Конечно, очень хорошая идея - стереть ненужные данные с исходного тома. может быть временно переместить его в какое-то временное место.
Зник
3

До сих пор все 4 ответа пропускают, что точный размер объема часто неизвестен. lvdisplayпоказывает только значения, округленные до 2 десятичных знаков, и man lvdisplayуказывает только на другие команды для доступных параметров. Далее выбирается MiB, что является достаточно точным с размером блока LVM по умолчанию 4 MiB:

lvdisplay --units m

MiB также является единицей по умолчанию для --sizeof lvcreate. В случае сомнений дважды проверьте правильный размер lvdisplayпосле создания целевого тома. Затем, как и в других ответах, сделайте копию. Кроме того, я бы порекомендовал проверить копию , например, с cmp.

Вот почему используется снимок и что он защищает и не защищает:

  • Снимок сделан таким образом, что все данные копируются так, как это было на момент создания снимка. Действия на исходном томе в процессе копирования не будут отражены в копии.

  • Снимок также защищает исходный том от человеческих ошибок в ddкомандной строке. Если вы случайно записали снимок, будут повреждены только данные снимка, и вы можете просто удалить снимок и начать все сначала.

  • Целевой том не защищен во время процессов копирования. Если другой администратор (или автоматический процесс, такой как os-prober of dracut) монтирует неполный том, монтирование может испортить вещи. (Даже монтирование только для чтения может записывать записи журнала в том.)

Иоахим Вагнер
источник
2

Я предложу свое:

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/

если все хорошо, удали источник

lvremove vgsource/lv0
конан
источник
Что делать, если исходный том очень велик и служба или система не должны быть остановлены?
Зник
0

Если вам нужно скопировать логический том из VG A в другой VG B, я нашел интересный вариант, используя partclone. Снимок и копирование с использованием dd - хороший метод, но он может быть медленным, если ваши файловые системы не переполнены. Это решение очень быстрое, потому что оно копирует только используемые блоки.

  1. Сначала создайте снимок исходного LV
lvcreate --snapshot --size 1G /dev/sourcevg/lv --name lv-backup

--sizeздесь сколько записи может произойти до того , как снимок будет отключен

  1. Создайте LV назначения в VG назначения
lvcreate --size <new_lv_size> /dev/destvg --name newlv

new_lv_size должен быть не меньше размера исходного LV

  1. Скопируйте файловую систему из резервной копии исходного lv в LV назначения
partclone.<fs_type> --dev-to-dev --source /dev/sourcevg/lv-backup --output /dev/destvg/newlv

fs_typeможет быть ext4, fat32, btrfs, xfs, ... любой FS поддерживается partclone

  1. Удалить снимок
lvremove /dev/sourcevg/lv-backup
HugoPoi
источник