
Можно ли полностью переместить логический том из одной группы томов в другую?
Можно создать (более или менее) соответствующий lv и скопировать данные, но есть ли способ сделать это только с помощью инструментов LVM?
Если нет, то есть ли теоретическая причина или техническое ограничение (размеры экстентов)?
решение1
Группа томов состоит из целых физических томов. Физический том состоит из множества экстентов (обычно экстент составляет 4 МБ); каждый экстент может принадлежать к отдельному логическому тому. Чтобы перенести логический том в другую группу, нельзя просто перенести экстенты, поскольку это может привести к разделению физического тома между исходной VG и целевой VG.
Что вы можете сделать, так это перенести один или несколько PV из исходного VG в целевой VG, при этомvgsplit
команда. Вы можете указать, какие PV вы хотите передать, или какой LV (но только по одному за раз). Если вы указываете LV, он и другие LV в исходной VG должны быть на отдельных PV. Целевая VG будет создана, если VG с указанным именем не существует.
vgsplit -n source_group/volume_to_copy source_group target_group
vgsplit source_group target_group /dev/sdy99 /dev/sdz99
Вам может понадобиться использоватьpvmove
сначала необходимо разместить логические тома, которые вы хотите переместить, на отдельных физических дисках.
Если вы хотите сохранить физические границы VG и переместить данные, то встроенного инструмента нет, но вы можетесделайте зеркало, а затем удалите оригинал.
решение2
Начиная с LVM в Debian stretch (9.0), а именно 2.02.168-2, можно сделать копию логического тома по группам томов, используя комбинацию vgmerge
, lvconvert
и vgsplit
. Поскольку перемещение представляет собой комбинацию копирования и удаления, это также будет работать для перемещения.
В качестве альтернативы вы можете использовать pvmove
для перемещения физических экстентов. ЦитатаU&L: Цель физических экстентов:
Один физический экстент — это наименьшая единица дискового пространства, которой LVM может управлять индивидуально.
Ниже приведен полный автономный пример сеанса с использованием петлевых устройств
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
Запустите команду merge в тестовом режиме. Это объединит vg1 с vg2.
# 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
.
dest-pv
Аргумент указывает lvconvert
сделать зеркальную копию на /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/lv1
неактивным.
lvchange -a n /dev/vg2/lv1
Затем (тестовый режим)
# 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
ПРИМЕЧАНИЯ:
Большинство этих команд нужно будет запустить как root.
#
Перед некоторыми командами указывается, что это комментарий. Он не представляет собой приглашение root.Если обнаружится дублирование имен логических томов в двух группах томов,
vgmerge
продолжение работы будет отклонено.При слиянии логические тома в
vg1
должны быть неактивны. А при разделении логические тома вvg2
принадлежащиеvg1
должны быть неактивны. В нашем случае этоlv1
.
решение3
Я предложу свой вариант:
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
решение4
Допустим, у вас есть том с именемs0
$ pvs -o+pv_used
PV VG Fmt Attr PSize PFree Used
/dev/sda2 cl lvm2 a-- <118.24g 0 <118.24g
/dev/sdb s0 lvm2 a-- <223.57g 0 <223.57g
/dev/sdc1 s0 lvm2 a-- <465.76g 0 <465.76g
/dev/sdd1 lvm2 --- 931.51g 931.51g 0
Я хочу переехать /dev/sdb
на /dev/sdc1
новый психический диск/dev/sdd1
Создать физический том на sdd1
$ pvcreate /dev/sdd1
Теперь вы можете расширить свою группу томов s0
с помощью нового диска.
$ vgextend s0 /dev/sdd1
Теперь вы можете начать перемещение данных
$ pvmove /dev/sdb /dev/sdd1
Подождите, пока закончите
/dev/sdb: Moved: 10.0%
...
/dev/sdb: Moved: 50.0%
...
/dev/sdb: Moved: 100.0%
Проверять
$ pvs -o+pv_used
PV VG Fmt Attr PSize PFree Used
/dev/sda2 cl lvm2 a-- <118.24g 0 <118.24g
/dev/sdb lvm2 --- 223.57g 223.57g 0
/dev/sdc1 s0 lvm2 a-- <465.76g 0 <465.76g
/dev/sdd1 s0 lvm2 a-- <931.51g 707.94g <223.57g
Теперь вы можете удалить /dev/sdb
из s0
группы
$ vgreduce s0 /dev/sdb
Выполните те же шаги для/dev/sdc1