Работа с LVM
LVM (Logical Volume Manager) — это система управления дисками, которая добавляет уровень абстракции поверх физического хранилища. Она позволяет гибко распределять дисковое пространство, изменять его размер без остановки системы и создавать резервные копии на основе снимков. LVM широко используется в качестве уровня хранения для виртуализации. На зашифрованных системах LVM часто размещается поверх устройства, зашифрованного с помощью LUKS, поэтому после одной разблокировки становится доступна вся группа томов.
В этой статье рассматриваются установка LVM в Linux, создание физических томов, групп томов и логических томов, изменение их размеров, работа со снимками и использование thin provisioning.
Установка LVM
LVM по умолчанию включён в большинство дистрибутивов Linux. Если он отсутствует, установите пакет lvm2 с помощью системного менеджера пакетов.
В Debian и Ubuntu:
sudo apt-get install lvm2
В RHEL, CentOS Stream, AlmaLinux и Rocky Linux:
sudo dnf install lvm2
Создание физического тома
Физический том (PV) — это базовый строительный блок LVM. В качестве него может использоваться целый диск (например, /dev/sdb) или отдельный раздел (например, /dev/sdb1).
Использование целого диска в качестве PV упрощает последующее изменение размера, поскольку сначала не требуется увеличивать расположенный под ним раздел. Использование раздела предпочтительно, если на диске также должны размещаться данные, не связанные с LVM, или если другие инструменты системы ожидают наличие таблицы разделов.
Создайте физический том с помощью pvcreate:
sudo pvcreate /dev/sdb
Замените /dev/sdb путём к вашему блочному устройству.
Проверьте результат с помощью pvdisplay:
sudo pvdisplay
В выводе будут перечислены физические тома, которыми в данный момент управляет LVM, а также их размер и информация о группе томов.
Создание группы томов
Группа томов (VG) объединяет один или несколько физических томов в единый пул хранилища. Из этого пула создаются логические тома.
Создайте группу томов с именем vg0 из одного физического тома:
sudo vgcreate vg0 /dev/sdb
Или сразу из нескольких физических томов:
sudo vgcreate vg0 /dev/sdb /dev/sdc
Проверьте результат с помощью vgdisplay:
sudo vgdisplay
Создание логического тома
Логический том (LV) отображается в системе как обычное блочное устройство. Его можно отформатировать файловой системой и смонтировать.
Создайте логический том lv0 размером 10 ГБ внутри группы томов vg0:
sudo lvcreate -n lv0 -L 10G vg0
Флаг -n задаёт имя логического тома, а -L — его размер.
Проверьте результат с помощью lvdisplay:
sudo lvdisplay
Создайте файловую систему на логическом томе:
sudo mkfs.ext4 /dev/vg0/lv0
Создайте точку монтирования и подключите файловую систему:
sudo mkdir -p /mnt/lv0 sudo mount /dev/vg0/lv0 /mnt/lv0
Новая файловая система теперь доступна в /mnt/lv0. Чтобы автоматически монтировать её при загрузке, добавьте соответствующую запись в /etc/fstab.
LVM предоставляет каждый логический том по двум эквивалентным путям: /dev/<vg>/<lv> и /dev/mapper/<vg>-<lv>. Для приведённого выше примера это /dev/vg0/lv0 и /dev/mapper/vg0-lv0. Оба пути указывают на одно и то же устройство; инструменты и конфигурационные файлы могут использовать любой из них.
Чтобы увидеть полную иерархию PV/VG/LV вместе с обычными блочными устройствами, выполните:
lsblk
Изменение размеров томов
LVM поддерживает изменение размера в работающей системе на каждом уровне: физических томов, групп томов и логических томов.
pvresize обновляет представление LVM о физическом томе после изменения размера underlying блочного устройства (например, после увеличения виртуального диска в гипервизоре):
sudo pvresize /dev/sdb
vgextend добавляет физический том в существующую группу томов, увеличивая её размер:
sudo vgextend vg0 /dev/sdc
vgreduce удаляет физический том из группы томов:
sudo vgreduce vg0 /dev/sdc
lvresize изменяет размер логического тома. Например, чтобы добавить 5 ГБ к lv0:
sudo lvresize -L +5G /dev/vg0/lv0
Или чтобы расширить логический том на всё свободное место в группе томов:
sudo lvresize -l +100%FREE /dev/vg0/lv0
Обратите внимание на разницу между -L (заглавная буква) и -l (строчная буква). Заглавная версия принимает размер с суффиксом единицы измерения, например M, G или T. Строчная версия принимает количество экстентов или процент.
Изменение размера логического тома не изменяет размер файловой системы на нём. Используйте соответствующий инструмент для конкретной файловой системы. Для ext2, ext3 и ext4:
sudo resize2fs /dev/vg0/lv0
Для XFS выполните xfs_growfs для точки монтирования файловой системы.
Для поддерживаемых файловых систем, включая ext4 и XFS, команда lvextend с флагом -r изменяет размер логического тома и файловой системы за один шаг:
sudo lvextend -r -L +5G /dev/vg0/lv0
Это наиболее распространённый способ онлайн-увеличения размера.
Уменьшение логического тома выполняется в обратном порядке: сначала необходимо уменьшить файловую систему и только после этого логический том. Если сделать наоборот, базовое устройство будет обрезано в то время, когда файловая система всё ещё считает, что имеет исходный размер, что приводит к уничтожению данных. Для ext4 операция выполняется офлайн. Размонтируйте файловую систему, выполните sudo e2fsck -f /dev/vg0/lv0, уменьшите файловую систему с помощью sudo resize2fs /dev/vg0/lv0 <new_size>, уменьшите логический том до того же размера с помощью sudo lvresize -L <new_size> /dev/vg0/lv0, а затем снова смонтируйте файловую систему. XFS вообще не поддерживает уменьшение размера; единственный способ сделать файловую систему XFS меньше — создать резервную копию, создать файловую систему меньшего размера и восстановить данные.
Каждая из приведённых выше команд поддерживает параметр --help для получения полного списка опций.
Снимки LVM
Снимок фиксирует состояние логического тома в определённый момент времени. Он работает по принципу copy-on-write: по мере изменения исходного логического тома изменённые блоки сохраняются в зарезервированном пространстве снимка, поэтому снимок продолжает отображать исходное состояние.
Снимки полезны для создания согласованных сбоевой точкой резервных копий работающей файловой системы и для тестирования изменений, которые можно отменить удалением снимка. Для создания согласованных с приложением резервных копий требуется дополнительная координация, например заморозка файловой системы или перевод приложения в состояние ожидания перед созданием снимка.
Создание снимка
Создайте снимок с помощью lvcreate и флага -s:
sudo lvcreate -L 1G -s -n myvolume_snap /dev/myvg/myvolume
Эта команда создаёт снимок myvolume_snap логического тома myvolume в группе томов myvg, резервируя 1 ГБ для изменений. Выбирайте размер зарезервированного пространства в зависимости от ожидаемого объёма изменений в течение срока существования снимка: для почти не изменяющихся томов требуется немного места, а для активно записываемых томов может потребоваться значительная часть исходного размера.
Для долгоживущих снимков и сценариев, где используется много снимков, рассмотрите возможность использования thin-снимков внутри thin pool. Они получают пространство из общего пула по мере необходимости вместо предварительного резервирования фиксированного объёма, что обычно более эффективно с точки зрения использования пространства.
Если исходный логический том изменится сильнее, чем способен вместить снимок, снимок станет недействительным, а захваченные им данные будут потеряны. Размер снимка должен соответствовать ожидаемому объёму изменений за время его существования.
Использование снимка
Снимок можно смонтировать как обычный логический том. Для резервного копирования и проверки рекомендуется монтировать его только для чтения, если запись действительно не требуется:
sudo mkdir -p /mnt/snapshot sudo mount -o ro /dev/myvg/myvolume_snap /mnt/snapshot
После монтирования снимок можно использовать для чтения, резервного копирования или проверки данных.
Удаление снимка
Когда снимок больше не нужен, удалите его с помощью lvremove:
sudo lvremove /dev/myvg/myvolume_snap
Удаление снимка освобождает зарезервированное им пространство. Все данные, записанные непосредственно в сам снимок, а не в исходный том, будут потеряны.
Чтобы откатить исходный том к состоянию, сохранённому в снимке, используйте lvconvert --merge вместо lvremove:
sudo lvconvert --merge /dev/myvg/myvolume_snap
После слияния снимок будет автоматически использован и удалён. Если исходный том в данный момент используется, операция слияния будет отложена до следующего момента активации тома.
Thin provisioning
Thin pool — это особый тип логического тома, который выделяет хранилище по мере необходимости. Логические тома, созданные внутри него (thin volumes), могут иметь заявленный размер, превышающий фактически свободное пространство пула, при этом реально выделенное место расходуется только для записанных блоков.
Эта технология широко используется в виртуализации, где множество виртуальных дисков используют один общий пул хранения, но редко одновременно достигают заявленной ёмкости.
Создание thin pool
Создайте thin pool mythinpool размером 50 ГБ в группе томов myvg:
sudo lvcreate -L 50G -T -n mythinpool myvg
Флаг -L задаёт размер пула, -T указывает lvcreate создать thin pool, а -n задаёт имя пула. LVM выделяет пространство для пула из свободного места группы томов; в конце команды можно указать конкретные физические тома, если пул необходимо разместить на определённых устройствах.
Создание thin volume
Создайте thin volume mythinvolume размером 10 ГБ внутри mythinpool:
sudo lvcreate -V 10G -T myvg/mythinpool -n mythinvolume
Флаг -V задаёт виртуальный размер thin volume, -T указывает thin pool, а -n задаёт имя нового тома.
Использование thin volume
Thin volume используется так же, как любой другой логический том. Создайте на нём файловую систему:
sudo mkfs.ext4 /dev/myvg/mythinvolume
После этого thin volume можно смонтировать и использовать как обычное блочное устройство.
Поскольку thin pool может использовать overcommit, необходимо контролировать фактическое использование пула. Пространство данных и пространство метаданных могут закончиться независимо друг от друга, и оба ресурса критичны: если thin pool исчерпает пространство данных или метаданных во время записи в thin volume, операции записи в этот том начнут завершаться с ошибками.
Текущее использование пространства данных и метаданных всех логических томов, включая thin pools, можно проверить с помощью lvs:
sudo lvs -o +data_percent,metadata_percent
Когда значение data_percent или metadata_percent приближается к 100, расширьте thin pool с помощью lvextend до того, как он будет полностью заполнен.
Справочник команд
Основные команды LVM, сгруппированные по уровням.
Физические тома:
- pvcreate инициализирует блочное устройство как физический том.
- pvdisplay показывает подробную информацию о физических томах.
- pvs показывает компактную сводную таблицу физических томов.
- pvresize обновляет физический том после изменения размера underlying устройства.
Группы томов:
- vgcreate создаёт группу томов из одного или нескольких физических томов.
- vgextend добавляет физический том в группу томов.
- vgreduce удаляет физический том из группы томов.
- vgdisplay показывает подробную информацию о группах томов.
- vgs показывает компактную сводную таблицу групп томов.
Логические тома:
- lvcreate создаёт логический том.
- lvextend и lvresize изменяют размер логического тома.
- lvremove удаляет логический том.
- lvconvert --merge объединяет снимок обратно с исходным томом.
- lvdisplay показывает подробную информацию о логических томах.
- lvs показывает компактную сводную таблицу логических томов.
Для повседневного использования короткие команды pvs, vgs и lvs обычно удобнее подробных вариантов *display. Каждая команда поддерживает --help для получения полного списка параметров.