Logical Volume Manager

Ещё одна из прослоек между пользователем и железом, которая по идее должна упрощать жизнь как пользователей, так и людей, поддерживающих эти системы, но мы-то знаем.

Базовые понятия

По сути у LVM есть четыре основных понятия:

  • RAW-диск (диск в системе, никак не взаимодействующий с LVM)
  • PV (physical volume)
  • VG (virtual group)
  • LV (logical volume)

Как они написаны - так они и вкладываются друг в друга. Т.е. сначала мы создаём Physical volume из Raw диска, после чего добавляем Physical volume в Volume group (создаём новую или расширяем уже существующую), и уже из Volume group нарезаем Logical volumes, которые подаются в систему как блочные устройства.

Physical volumes

Первый уровень абстракции в LVM, который превращает “физические” диски в понятный для LVM вид. Собственно действий с ними не много. Создать:

# pvcreate /dev/(sd|hd|dm-)([0-9])

И удалить:

# pvremove /dev/(sd|hd|dm-)([0-9])

Пока на PV есть хоть один VG - удалить его нельзя.

Посмотреть существующие PV:

# pvs

Volume groups

Здесь уже веселее, можно, например, объединить несколько Physical volumes в один Volume group (тем самым сделав подобие RAID-0, однако в отличии от страйпа здесь запись производится линейно, сначала на первый PV, пока он не заполнится, потом на второй)

Итак, создать VG очень просто

# vgcreate <vgname> <PV> [<PV>]

Как видно из вышеприведённого примера VG можно создавать из нескольких PV. Однако если у нас уже есть VG и мы хотим докинуть туда ещё один PV - нет ничего проще

# vgextend <vgname> <PV> [<PV>]

В противовес приведённой выше команде есть и обратная - способная вывести PV из VGL

# vgreduce <vgname> <PV>

Так же есть и команда, которая позволяет избавиться от ненавистной VG:

# vgremove <vgname> [<vgname>]

Кстати интересный факт - пока не будут удалены все LV с VG удалить последний не получится 1)

Ну и собственно самая интересная команда - просмотр существующих VG:

# vgs

Если мы хотим, например, со сбойного диска переместить все данные на живой при этом не останавливая весь IO - есть вполне рабочий вариант. Предположим, что у нас есть один диск на 1 Тб, который сбоит, в VG test и мы вставили в соседний слот такой же диск на 1 Тб, дальше всё достаточно просто:

# pvcreate /dev/sdb
# vgextend test /dev/sdb
# pvmove /dev/sda /dev/sdb
# vgreduce test /dev/sda
# pvremove /dev/sda

По окончании всех операций получаем все данные на новом диске, а старый можно спокойно вытаскивать из сервера (если он конечно умеет hotswap)

Ещё по поводу VG есть такой интересный момент, что они могут быть определены системой, светиться в vgs, однако в /dev будут недоступны её LV - это значит, что VG находятся в состоянии inactive. Лечится это активацией VG (я обычно сильно этим не заморачиваюсь и активирую все найденные):

# vgchange -a y

Logical volume

Ну и, собственно, одна из самых важных и нужных частей LVM. Как и со всеми предыдущими сущностями эту можно создать:

# lvcreate [--name lvname] {-l <size>[%(VG|PVS|FREE)]|-L <size>[B|S|K|M|G|T]} <VG> [<PV>]

удалить:

# lvremove <lvname|lvpath>

расширить:

# lvextend {-l <size>[%(VG|PVS|FREE)]|-L <size>[B|S|K|M|G|T]} <lvname>

уменьшить:

# lvreduce {-l <size>[%(VG|PVS|FREE)]|-L <size>[B|S|K|M|G|T]} <lvname>

а так же можно создать снапшот с существующего LV:

# lvcreate -s <lvname_orig> --name <lvname>
1)
что, в общем-то, логично