Следующая возможность LVM — это возможность дополнять группу томов новыми физическими томами (например, если уже не хватает имеющихся) и выводить из группы не нужные больше физические тома (например, скорая поломка диска или замена оборудования). Лично я видел на форумах, что некоторые таким образом даже переносят работающую систему с одного диска на другой.
Давайте вернемся к нашему примеру. Допустим нам перестало хватать места в нашей группе томов и мы ее хотим дополнить новыми физическими томами. Делается это командой vgextend:
[root@localhost ~]# vgextend fileserver /dev/sdb6
Volume group "fileserver" successfully extended
[root@localhost ~]# vgdisplay fileserver
--- Volume group ---
VG Name fileserver
System ID
Format lvm2
Metadata Areas 3
Metadata Sequence No 5
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 3
Act PV 3
VG Size 1.99 GB
PE Size 4.00 MB
Total PE 510
Alloc PE / Size 75 / 300.00 MB
Free PE / Size 435 / 1.70 GB
VG UUID SZLgLK-b9V8-RiZV-gH5i-N0pA-2ppf-axLqfO
Как мы видим (выделено), пул дискового пространства, которым мы располагаем, увеличился. Теперь его тоже можно использовать для увеличения существующих логических томов данной группы и для создания новых.
Следующая операция, которую тоже можно делать с LVM — это уменьшение группы томов. Прежде чем вывести физический том из группы — его необходимо освободить от данных. Первое, что тут следует сделать в данном случае — это убедиться, что дискового пространства, которое останется в группе, хватит для размещения этих данных. Разработчики LVM пока не владеют методами размещения данных в астральном пространстве, но работа над этим ведется :). Итак, посмотреть это можно командой pvscan:
[root@localhost ~]# pvscan
PV /dev/sdb1 VG fileserver lvm2 [476.00 MB / 176.00 MB free]
PV /dev/sdb5 VG fileserver lvm2 [476.00 MB / 476.00 MB free]
PV /dev/sdb6 VG fileserver lvm2 [1.06 GB / 1.06 GB free]
Здесь мы видим, что реально сейчас используется только первый физический том — /dev/sdb1. И еще мы тут видим один интересный аспект работы LVM: если какой-то логический том можно разместить на отдельном физическом целиком — LVM выберет именно этот путь.
Кстати, под словом free команда pvscan подразумевает не свободное от данных пространство, а пространство не выделенное в логические тома.
Итак, для освобождения физических томов от данных и размещения их на других физических томах той же группы есть команда pvmove:
[root@localhost ~]# pvmove /dev/sdb1
/dev/sdb1: Moved: 100.0%
По умолчанию данная программа требует только одного аргумента — имени освобождаемого тома. Также ей можно указать (вторым аргументом) и имя тома, на который нужно поместить данные.
Вывод команды pvscan теперь выглядит вот так:

[root@localhost ~]# pvscan
PV /dev/sdb1 VG fileserver lvm2 [476.00 MB / 476.00 MB free]
PV /dev/sdb5 VG fileserver lvm2 [476.00 MB / 476.00 MB free]
PV /dev/sdb6 VG fileserver lvm2 [1.06 GB / 788.00 MB free]
Как мы видим, теперь наш логический том «уехал» на другой раздел диска. Причем этот том смонтирован и с ним в этот момент могут работать пользователи.
Убрать освобожденный том из группы можно командой vgreduce:

[root@localhost ~]# vgreduce fileserver /dev/sdb1
Removed "/dev/sdb1" from volume group "fileserver"
[root@localhost ~]# pvscan
PV /dev/sdb5 VG fileserver lvm2 [476.00 MB / 476.00 MB free]
PV /dev/sdb6 VG fileserver lvm2 [1.06 GB / 788.00 MB free]
PV /dev/sdb1 lvm2 [478.47 MB]
Теперь мы видим, что наш физический том /dev/sdb1 «осиротел» и больше не принадлежит ни одной группе.

Удаление логических томов

Логический том должен быть размонтирован перед удалением:

%# umount /dev/fileserver/nfs
lvremove -- do you really want to remove "/dev/fileserver/nfs"? [y/n]: y
lvremove -- doing automatic backup of volume group "vg00"
lvremove -- logical volume "/dev/fileserver/nfs" successfully removed

Удаление физических томов из группы томов

Убедитесь, что физический том не используется никакими логическими томами. Для этого используйте команду 'pvdisplay':

%# pvdisplay /dev/sdd1
--- Physical volume ---
  PV Name               /dev/sdd1
  VG Name               nfs
  PV Size               2,73 TiB / not usable 3,00 MiB
  Allocatable           yes
  PE Size               4,00 MiB
  Total PE              715396
  Free PE               715396
  Allocated PE          0
  PV UUID               mye4S4-dMJq-VS7S-bcYR-ymmn-IeNd-QtCQWD

Если же физический том используется, вам нужно будет перенести данные на другой физический том.

После этого можно использовать 'vgreduce' для удаления физических томов:

%# vgreduce nfs /dev/sdd1

Делается это все так: 1. Размонтируем файловую систему: umount /dev/fileserver/samba 2. Уменьшаем размер файловой системы. Для этого сначала сделаем проверку самой файловой системы. Утилита resize2fs не даст изменить размер до выполнения проверки. Конечно, у нее есть ключ -f, который заставит ее это сделать, но лучше перестраховаться и все-таки выполнить проверку:

e2fsck -f /dev/VolGroup00/LogVol00
resize2fs /dev/VolGroup00/LogVol00 9G

Только после корректного выполнения двух предыдущих шагов уменьшаем размер логического тома:

lvreduce -L 9G /dev/VolGroup00/LogVol00

После этого монтируем файловую систему и смотрим что поменялось:

mount /dev/VolGroup00/LogVol00 /mnt/disk
df -h

Большинство таких инструментов разметки обычно по умолчанию создают новые разделы с идентификатором раздела 0×83 (Linux). Вы можете использовать установки по умолчанию, но лучше изменить их на 0x8e (Linux LVM).

#fdisk -l /dev/sdb

Изменим тип раздела на 0x8e (Linux LVM).

fdisk /dev/sdb
 Command (m for help): t
 Selected partition 1
 Hex code (type L to list codes): 8e
 Changed system type of partition 1 to 8e (Linux LVM)
 Command (m for help): w

 

Теперь инициализируем каждый раздел с помощью pvcreate:

pvcreate /dev/hda2

Физические тома и группы томов создаются за один шаг: vgcreate:

vgcreate test-volume /dev/hda2

Команда создает логический том с именем test-volume, используя в качестве исходных физических томов /dev/hda2.

После создания группы томов test-volume ведите команду vgdisplay для просмотра общей информации о вновь созданной группе томов.

Создание новых логических томов (разделов)

lvcreate -L 5G -n data test-volume

Создается логический том размером 5 ГБ с именем data.

Создадим новый логический том nfs-121 заняв все свододное место (-l 100%FREE)

lvcreate -l 100%FREE -n nfs-121 test-volume

После создания тома data вы можете проверить наличие узла этого устройства:

root@klausk:/# ls -l /dev/mapper/test--volume-data
brw-rw---- 1 root disk 253, 4 2006-11-28 17:48 /dev/mapper/test--volume-data
root@klausk:/# ls -l /dev/test-volume/data
lrwxrwxrwx 1 root root 29 2006-11-28 17:48 /dev/test-volume/data ->
/dev/mapper/test--volume-data

Вы также можете просмотреть свойства логического тома с помощью команды lvdisplay

Монтирование логического тома

root@klausk:~# mkfs.ext4 /dev/test-volume/data
root@klausk:~# mkdir /data
root@klausk:~# mount -t ext4 /dev/test-volume/data /data/
root@klausk:~# df -h /data
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/test--volume-data
                      5.0G   33M  5.0G   1% /data

Вам также может потребоваться изменить файл fstab(5) для автоматического монтирования файловой системы во время загрузки:

mount Logical Volume 'data' under /data
/dev/test-volume/data   /data   ext4        defaults        0 2

Удалить физический том из группы томов

 vgreduce nfs /dev/sdb1

Данная утилита позволяет решить задачу переноса виртуальной машины с одного сервера KVM на другой, с минимальным простоем виртуальной машины, без использования общего хранилища (non-shared storadge).
Передавать мы будем весь раздел LVM, на который установлена виртуальная машина. Ну а уменьшить время простоя нам поможет магия работы LVM snapshot, информацию о которой вы с легкостью можете найти в интернете.

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

  1. Делаем снимок LVM раздела.
  2. Передаем основной LVM раздел по сети, не останавливая нашу VM.
  3. Когда закончится передача основного раздела, останавливаем VM.
  4. Запускаем lvmsync для передачи снимка по сети. Передается не весь снимок, а только измененные блоки.
  5. Подготавливаем и запускаем VM на новом сервере.

В результате, при использовании lvmsync время простоя виртуальной машины будет равно времени передачи измененных блоков в снимке основного раздела.

Подробнее о работе lvmsync, и дополнительных плюшках вы можете почитать на [urlspan]страничке проекта[/urlspan].

Далее предполагается что у нас есть права sudo в системе, ssh доступ настроен по ключам, а вход под рутом запрещен.

Приступим к переносу VM:
Установка:

Для работы lvmsync нам потребуется Ruby 1.8 (or later), ssh, и dmsetup.
Скачиваем lvmsync на локальный компьютер:

wget https://github.com/mpalmer/lvmsync.git

Копируем lvmsync в root PATH, например в /usr/bin/

Подготовка удаленного сервера (server2):

1) Скачиваем и устанавливаем lvmsync.
2) Создаем LVM раздел для копируемой VM.

server2# lvcreate vg -n new-virtual  -L 16G

Размер раздела должен быть равен исходному разделу (в принципе он может быть и больше исходного, но этот вариант мной не тестировался).

Подготовка локального сервера и перенос VM.

Далее все команды необходимо выполнять на сервере, с которого мы хотим переместить виртуальную машину (server1).

1) Создаем definition xml:

server1# virsh dumpxml virtual > virtual.xml

2) Делаем снимок раздела:

server1# lvcreate --snapshot -L10G -n virtual-snap /dev/vg/virtual

Warning!

Обратите внимание, что размер снимка должен выбираться в зависимости от интенсивности использования VM. Т.к. все данные, пока мы переносим основной раздел, будут «сохраняться» на снимок.
И при полном заполнении снимка, он автоматически [urlspan]деактивируется[/urlspan].

3) Не останавливая VM, переносим основной раздел с помощью dd:

server1# dd if=/dev/vg/virtual bs=1M | gzip -c | pv -ptrb | ssh me@server2 "gunzip -c | sudo dd of=/dev/vg/new-virtual"

Здесь добавлено сжатие передаваемых данных гзипом, и отображение хода передачи данных с помощью pv.

4) Когда перенос будет закончен, останавливаем виртуальную машину:

server1# virsh shutdown virtual

5) И после полной остановки машины запускаем lvmsync для переноса снимка:

server1# lvmsync --stdout /dev/vg/virtual-snap | ssh me@server2 sudo lvmsync --apply - /dev/vg/new-virtual

Эта операция не только перенесет снимок на новый сервер, но и смержит его сразу с основным разделом LVM.

6) Копируем definition xml на удаленный сервер:

server1# scp virtual.xml me@server2:/home/me/new-virtual.xml

Подготовка и запуск виртуальной машины на новом сервере:

1) Изменяем definition xml, если необходимо.

2) Создаем виртуальную машину на основе xml:

server2# virsh define new-virtual.xml

3) Запускаем нашу виртуальную машину, и прописываем ее в автостарт:

server2# virsh start new-virtual
server2# virsh autostart new-virtual

Вот и все, перенос виртуальной машины закончен!

Примечания

Утилита тестировалась на Centos 6.4. Про временя переноса сказать что-либо затрудняюсь, т.к. все зависит от интенсивности работы с виртуальной машиной во время ее переноса, и, соответственно, размера снапшота.


[urlspan]http://www.pvsm.ru/linux/37753[/urlspan]

Если случайно был удален том lvm (или специально, но потом понадобилось восстановление) — механизм резервного копирования метаданных vloume group может спасти ситуацию.
Настройка архивирования находится в /etc/lvm/lvm.conf в секции backup.
По умолчанию (в debian) архивирование включено, папка для архивов — /etc/lvm/archive и содержит архивы изменения vg за 30 дней.
Посмотреть чего менялось можно командой vgcfgrestore -l VG

#vgcfgrestore -l VG..... skipped .....
  File:         /etc/lvm/archive/VG_00390.vg
  VG name:      VG
  Description:  Created*before* executing 'lvremove /dev/VG/lv_name_1'
  BackupTime:  MonOct1516:22:502012

  File:         /etc/lvm/archive/VG_00391.vg
  VG name:      VG
  Description:  Created*before* executing 'lvremove /dev/VG/lv_name_2'
  BackupTime:  MonOct1516:22:552012

  File:         /etc/lvm/archive/VG_00392.vg
  VG name:      VG
  Description:  Created*before* executing 'lvremove /dev/VG/lv_name_3'
  BackupTime:  MonOct1516:23:182012

  File:         /etc/lvm/archive/VG_00393.vg
  VG name:      VG
  Description:  Created*before* executing 'lvremove /dev/VG/lv_name_4'
  BackupTime:  MonOct1516:23:202012
  File:         /etc/lvm/archive/VG_00394.vg
  VG name:      VG
  Description:  Created*before* executing 'lvcreate -L20g -nsome_new_lv VG'
  BackupTime:  TueOct1600:32:402012

Здесь видно имя файла архива и команда, перед (или иногда после) которой архивирование метаданных VG было выполнено.
В данном случае были удалены некоторые LV и после них создан новый.
Чтобы узнать, попал новый LV поверх старых (тогда естественно данные будут перезаписаны, зависит от количества записей в новый LV) надо посмотреть в архиве до удаления параметры extent_count и stripes нужного LV. stripes это номер начала блока на PV, extent_count — количество.
LV может состоять из нескольких сегментов, в каждом будет свой набор extent_count и stripes.
Потом посмотреть эти же параметры нового LV, но в архиве поcле создания нового LV.
Если эти регионы не пересеклись — значит новый LV создался в другом месте, чем удаленные LV.
Восстановить метаданные просто —

vgcfgrestore -f /etc/lvm/backup/VG_00390.vg VG

это откатит все изменения с текущего момента до нужного архива, предшествующего указанной в vgcfgrestore -l команде.
Дальше остается только активировать восстановленные LV командой

lvchange -a y /dev/VG/lv_name