Зачем нужен LVM вместо обычных разделов
Обычный раздел диска имеет фиксированный размер, заданный при разметке. Чтобы его изменить, нужно переразмечать диск, а часто — останавливать сервисы и перезагружать систему. LVM (Logical Volume Manager) добавляет уровень абстракции между физическим диском и файловой системой:
- Физический том (PV) — целый диск или раздел, отданный под управление LVM.
- Группа томов (VG) — пул пространства, собранный из одного или нескольких PV.
- Логический том (LV) — виртуальный «раздел» внутри VG, на котором живёт файловая система.
Такая схема позволяет расширять тома на лету, переносить данные между дисками и делать снапшоты без остановки сервисов.
Установка инструментов
Пакет
lvm2 присутствует в большинстве дистрибутивов по умолчанию. Если его нет:
Bash:
## Debian / Ubuntu
sudo apt install lvm2
## RHEL / CentOS / Fedora
sudo dnf install lvm2
После установки убедитесь, что демон активен:
Bash:
systemctl status lvm2-lvmpolld
Создание логического тома с нуля
Шаг 1. Подготовка физического тома
Добавьте новый диск (например,
/dev/sdb) или используйте свободный раздел. Инициализируйте его как PV:
Bash:
sudo pvcreate /dev/sdb
Проверка:
Bash:
sudo pvs
Вывод покажет размер и свободное место нового PV.
Шаг 2. Создание группы томов
Bash:
sudo vgcreate vg_data /dev/sdb
Здесь
vg_data — произвольное имя группы. Если нужно объединить несколько дисков в один пул, перечислите их через пробел:
Bash:
sudo vgcreate vg_data /dev/sdb /dev/sdc
Шаг 3. Создание логического тома
Bash:
sudo lvcreate -L 50G -n lv_app vg_data
Флаг
-L задаёт размер, -n — имя. Том будет доступен как /dev/vg_data/lv_app или через символическую ссылку /dev/mapper/vg_data-lv_app.Шаг 4. Файловая система и монтирование
Bash:
sudo mkfs.ext4 /dev/vg_data/lv_app
sudo mkdir -p /mnt/app
sudo mount /dev/vg_data/lv_app /mnt/app
Для автоматического монтирования при загрузке добавьте строку в
/etc/fstab:
Код:
/dev/vg_data/lv_app /mnt/app ext4 defaults 0 2
Расширение логического тома без остановки сервисов
Расширение — самая частая операция с LVM. Она выполняется онлайн для ext4 и XFS.
Увеличение на конкретный размер
Bash:
sudo lvextend -L +20G /dev/vg_data/lv_app
Использование всего свободного места в VG
Bash:
sudo lvextend -l +100%FREE /dev/vg_data/lv_app
Расширение файловой системы
Для ext4:
Bash:
sudo resize2fs /dev/vg_data/lv_app
Для XFS:
Bash:
sudo xfs_growfs /mnt/app
Обратите внимание:
xfs_growfs принимает точку монтирования, а не устройство.Сокращение до одной команды
Флаг
-r у lvextend автоматически вызывает нужную утилиту расширения файловой системы:
Bash:
sudo lvextend -r -L +20G /dev/vg_data/lv_app
Это работает и для ext4, и для XFS.
Добавление нового диска в существующую VG
Если свободное место в VG закончилось, добавьте ещё один физический том:
Bash:
sudo pvcreate /dev/sdc
sudo vgextend vg_data /dev/sdc
sudo lvextend -r -l +100%FREE /dev/vg_data/lv_app
Уменьшение логического тома
Уменьшение — операция с повышенным риском. Порядок действий зависит от файловой системы.
ext4: уменьшение возможно
Bash:
## 1. Размонтировать том
sudo umount /mnt/app
## 2. Проверить файловую систему (обязательно перед уменьшением)
sudo e2fsck -f /dev/vg_data/lv_app
## 3. Уменьшить файловую систему до 30G
sudo resize2fs /dev/vg_data/lv_app 30G
## 4. Уменьшить логический том до 30G
sudo lvreduce -L 30G /dev/vg_data/lv_app
Команда
lvreduce запросит подтверждение. Чтобы избежать интерактивного запроса в скриптах, добавьте флаг -y, но только если вы уверены в размере.XFS: уменьшение не поддерживается
XFS не умеет уменьшаться. Единственный способ — создать новый том меньшего размера, скопировать данные и переключить монтирование.
Типичная ошибка при уменьшении
Если уменьшить LV раньше файловой системы, данные будут потеряны. Всегда сначала
resize2fs, потом lvreduce. Обратный порядок приводит к обрезанию данных за пределами нового размера тома.Диагностика и мониторинг
Просмотр структуры LVM
Bash:
## Физические тома
sudo pvs
sudo pvdisplay
## Группы томов
sudo vgs
sudo vgdisplay
## Логические тома
sudo lvs
sudo lvdisplay
Краткие команды (
pvs, vgs, lvs) удобны для скриптов и быстрого обзора. Полные (pvdisplay, vgdisplay, lvdisplay) дают больше деталей.Проверка свободного места в VG
Bash:
sudo vgs -o vg_name,vg_size,vg_free
Если
vg_free равен нулю, расширение невозможно без добавления нового PV.Просмотр маппинга устройства
Bash:
sudo dmsetup info vg_data-lv_app
Показывает, какие физические extent'ы и на каких дисках используются конкретным LV.
Снапшоты логических томов
LVM поддерживает снапшоты на уровне блочного устройства. Это не замена бэкапу, но удобный способ получить консистентную копию перед рискованной операцией.
Bash:
sudo lvcreate -L 5G -s -n lv_app_snap /dev/vg_data/lv_app
Снапшот будет доступен как
/dev/vg_data/lv_app_snap. Его можно смонтировать в режиме только для чтения и скопировать данные.Размер снапшота определяет, сколько изменений он способен вместить. Если снапшот заполнится, он станет невалидным. Проверяйте заполнение через
lvs:
Bash:
sudo lvs -o lv_name,snap_percent
Перенос данных между физическими томами
Если нужно освободить диск из VG (например, для замены), используйте
pvmove:
Bash:
sudo pvmove /dev/sdb /dev/sdc
Команда переносит все extent'ы с
/dev/sdb на /dev/sdc онлайн, без размонтирования. После завершения диск можно вывести из группы:
Bash:
sudo vgreduce vg_data /dev/sdb
sudo pvremove /dev/sdb
pvmove работает медленно на больших объёмах и создаёт нагрузку на I/O. Планируйте операцию на период низкой нагрузки.Типичные ошибки и их последствия
| Ошибка | Последствие | Как избежать |
|---|---|---|
lvreduce до resize2fs | Потеря данных | Всегда уменьшать сначала ФС |
| Уменьшение XFS | Невозможно, команда выдаст ошибку | Использовать копирование на новый том |
| Снапшот слишком малого размера | Снапшот становится невалидным | Выделять не менее 10–20% от размера LV |
vgextend без pvcreate | Ошибка: устройство не является PV | Сначала pvcreate |
Забытый fstab после создания LV | Том не монтируется после перезагрузки | Добавить запись в /etc/fstab сразу |
Проверка результата после операций
После расширения убедитесь, что файловая система видит новый размер:
Bash:
df -h /mnt/app
После уменьшения проверьте целостность:
Bash:
sudo e2fsck -f /dev/vg_data/lv_app
После
pvmove убедитесь, что на старом диске не осталось данных:
Bash:
sudo pvs -o+pv_used
Поле
pv_used для освобождённого диска должно быть 0.Ограничения, о которых стоит помнить
- LVM не обеспечивает отказоустойчивость. Это не RAID. При выходе диска из строя данные теряются, если нет зеркала или бэкапа.
- Для зеркалирования внутри LVM существует
lvcreate --type mirrorили--type raid1, но это отдельная тема с собственными ограничениями по производительности.
- Тонкие тома (thin provisioning) позволяют создавать LV больше физического пространства VG, но при переполнении пула том становится недоступным. Мониторинг заполнения пула обязателен.
- При использовании LVM поверх LUKS порядок операций важен: сначала открывается LUKS-контейнер, затем работают с LVM внутри него.
