Основы LVM

27 Июнь 2021 20:05 Сергей Морозов (изменено 12 Июль 2023 16:59)

LVM — logical Volume Management.

Это удобный инструмент работы с логическими томами в Linux, и удобен он в том числе благодаря возможности сделать многие операции on-line, во время работы системы. Например, можно перенести логический том (файловую систему) с одного физического носителя на другой не только без отключения, но и без размонтирования соответствующей файловой системы. Прежде, чем рассказать о базовых операциях, надо описать сущности, из которых состоит LVM.

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

PV — Physical Volume, физический том. Это самый низкий уровень в иерархии. Физические тома — это разделы на дисках, или диски целиком.

VG — Volume Group, группа томов. Физические тома объединяются в группы, размер группы томов равен сумме размеров физических томов, которые в неё входят.

LV — Logical Volume, логический том. Верхний уровень иерархии. Логические тома — блочные устройства, на которых создаются файловые системы.

Все утилиты для работы с физическими томами начинаются на pv, для работы с группами томов — на vg, и для работы с логическими томами — на lv.

Создание томов

Для большего понимания, попробую это описать на конкретном примере. Допустим, у нас есть система Linux, установленная на диске /dev/sda, и у нас есть ещё 3 диска по 1 Tb, /dev/sdb, /dev/sdc и /dev/sdd, которые нам надо объединить в общее пространство (группу томов), откуда мы потом выделим место под логические тома, которые мы потом смонтируем. Это будут тома music, files, video и games.

Для начала создадим разделы на дисках, на каждом диске по 1 разделу максимального размера. Используйте для этого любой инструмент, которой вам нравится. Я использую gdisk, так как он умеет работать и с mbr, и с gpt. Для корректного распознавания физических томов LVM ядром Linux, у них должен быть тип 8E для mbr и 8E00 для GPT. После создания разделов, у нас есть блочные устройства /dev/sdb1, /dev/sdc1 и /dev/sdd1, на которых нам надо создать физические тома:

# pvcreate /dev/sdb1
  Physical volume "/dev/sdb1" successfully created.
# pvcreate /dev/sdc1
  Physical volume "/dev/sdc1" successfully created.
# pvcreate /dev/sdd1
  Physical volume "/dev/sdd1" successfully created.

Теперь у нас есть 3 физических тома, которые можно объединить в группу томов. Назовём её media:

# vgcreate media /dev/sdb1 /dev/sdc1 /dev/sdd1
  Volume group "media" successfully created

В результате, у нас есть группа томов «media», размер которой равен сумме всех физических томов, которые в неё входят. Теперь создадим логические тома music, files, video и games:

# lvcreate -n music -L 200G media
  Logical volume "music" created.
# lvcreate -n files -L 100G media
  Logical volume "files" created.
# lvcreate -n video -L 1500G media
  Logical volume "video" created.
# lvcreate -n games -L 400G media
  Logical volume "games" created.

Вы могли заметить, что было распределено не всё свободное пространство из группы томов, но это обычная практика — оставлять свободное место на случай, если оно понадобится в дальнейшем. Тем более, если место закончится в одном из логических томов, его с лёгкостью можно будет туда добавить без остановки системы, и даже без размонтирования файловой системы. Теперь у нас есть 4 логических тома, вот их блочные устройства: /dev/media/music, /dev/media/files, /dev/media/video и /dev/media/games.

Создание файловой системы на этих устройствах ни чем не отличается от обычных разделов, и для файловой системы ext4 это может быть сделано командой mke2fs /dev/media/music.

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

Изменение размеров томов

Допустим, у нас кончилось месть в /dev/media/games, и нам надо добавить туда 50G места из группы томов. Нет ничего проще:

# lvresize -L+50G -r /dev/media/games

При чём, как это было отмечено выше, делается это без размонтирования файловой системы. В данном случае, мы указали 2 ключа:

-L — указываем, как мы хотим изменить размер логического тома. Если указать -L50G, то размер тома станет 50G вне зависимости от того, какого размера он был до этого. Будьте осторожны! Уменьшение объёма — это деструктивная операция, и может (но не обязательно) привести к потере данных. В нашем же случае, указывая -L+50G, мы увеличиваем размер тома на 50Gb.

-r — с помощью этого ключа мы указываем, что хотим в процессе изменить размер файловой системы. Если его не указать, то, не смотря на изменение размера тома, размер свободного места в нём не изменится, и нам придётся вручную запускать resize2fs для того, чтобы размер файловой системы изменился.

Добавление и удаление физических томов

Теперь допустим, что у нас появился жёсткий диск /dev/sde, и нам надо заменить им другой диск, пусть это будет /dev/sdb. Все описанные здесь операции можно производить без размонтирования файловых систем, без остановки и без простоя (за исключением физического подключения, здесь всё зависит от возможностей вашего железа).

После создания раздела на /dev/sde, у нас есть раздел /dev/sde1, давайте создадим там физический том:

# pvcreate /dev/sde1
  Physical volume "/dev/sde1 successfully created.

Теперь добавим этот физический том в группу томов:

# vgextend media /dev/sde4
  Volume group "media" successfully extended

С добавлением нового физического тома, размер группы томов увеличился. Но на старом физическом томе (/dev/sdb1) всё ещё есть данные, и их надо переместить на другие физические тома перед тем, как мы сможем удалить этот физический том из группы томов. Делается это командой:

# pvmove /dev/sdb1
  /dev/sdb1: Moved: 1,33%
  /dev/sdb1: Moved: 2,66%
  /dev/sdb1: Moved: 4,01%
...

Это может занять довольно много времени, и прогресс будет отображаться в консоли. Надо сказать, что это довольно безопасный процесс, и если произойдёт отключение питания, процесс просто продолжится с прерванного места. Для того, чтобы продолжить отслеживать процесс перемещения данных, надо запустить команду pvmove без параметров.

Это ещё не всё. После завершения процесса, нам надо удалить старый том из группы томов, делается это командой vgreduce:

# vgreduce media /dev/sdb1
  Removed "/dev/sdb1" from volume group "media"

Почти всё, и диск уже можно удалять, но я так же рекомендую удалять физический том, так как LVM пишет на физический том специальную последовательность данных, чтобы том можно было опознать, как пренадлежащий LVM:

# pvremove /dev/sdb1
  Labels on physical volume "/dev/sdb1" successfully wiped.

Это лишь малая часть того, что умеет LVM, просто демонстрация для того, чтобы Вы начали им пользоваться, и, если вы до сих пор не используете LVM везде, где это возможно, самое время начать.

Полезные команды

pvcreate — создать физический том
vgcreate — создать группу томов
lvcreate — создать логический том
pvremove — удалить физический том
vgremove — удалить группу томов
lvremove — удалить логический том
vgextend — добавить в группу томов физический том
vgreduce — удалить из группы томов физический том
lvresize — изменение размера логического тома
pvs / pvdisplay — отобразить параметры всех логических томов
vgs / vgdisplay — отобразить параметры всех групп томов
lvs / lvdisplay — отобразить параметры всех логических томов.
pvchange — изменить атрибуты физического тома
vgchange — изменить атрибуты группы томов
lvchange — изменить атрибуты логического тома