LVM — слой абстракции между дисками и файловыми системами, который позволяет расширять разделы без перезагрузки, переносить данные на новый диск и делать мгновенные снимки. В отличие от обычных разделов, здесь нет жёсткой привязки к таблице разделов: физические тома объединяются в группу, из которой нарезаются логические тома. Ниже — практические операции, которые чаще всего нужны администратору, и ограничения, о которых узнают слишком поздно.
Термины и базовая проверка
Физический том (PV) — диск или раздел, отданный под LVM. Группа томов (VG) — пул свободного места. Логический том (LV) — виртуальный раздел, на котором создаётся файловая система. Посмотреть текущую картину можно тремя командами; они не меняют ничего и безопасны для продакшена.
sudo apt install lvm2
sudo pvs -a
sudo vgs
sudo lvs -a -o+devices
Если в выводе pvs есть свободные устройства без группы, их можно добавить в пул. Перед любой операцией сохраните вывод vgs и lvs — это поможет восстановить картину, если что-то пойдёт не так.
Создание тома с нуля
Разметка нового диска занимает минуты. Важно выбрать файловую систему осознанно: ext4 проще, XFS лучше работает с большими файлами и поддерживает рост на лету. Обе поддерживают онлайн-расширение, но с уменьшением всё сложнее.
sudo pvcreate /dev/sdb
sudo vgcreate vg_data /dev/sdb
sudo lvcreate -n lv_app -l 100%FREE vg_data
sudo mkfs.ext4 /dev/vg_data/lv_app
sudo mount /dev/vg_data/lv_app /srv/app
Для постоянного монтирования используйте UUID или путь /dev/vg_data/lv_app. Второй вариант читаемее, но требует, чтобы LVM успел активировать том до монтирования; в initramfs это обычно уже настроено. После правки /etc/fstab обязательно выполните mount -a и только потом перезагружайтесь.
Расширение тома и файловой системы
Ключ -r у lvextend автоматически вызывает resize2fs или xfs_growfs, поэтому отдельная команда не нужна. Свободное место берём из группы томов, а не из «соседнего раздела».
sudo lvextend -r -l +100%FREE /dev/vg_data/lv_app
df -h /srv/app
sudo lvs -o lv_name,lv_size,seg_pe_ranges vg_data
Если свободного места в группе нет, сначала расширяем пул новым диском. Уменьшение для XFS недоступно, а для ext4 требует размонтирования. Проще создать новый том и перенести данные.
Добавление диска и перенос данных
Новый диск расширяет группу томов, после чего данные можно перенести на него без остановки приложения. pvmove копирует экстенты в работающем режиме; на время операции диск-источник лучше не трогать.
sudo pvcreate /dev/sdc
sudo vgextend vg_data /dev/sdc
sudo pvmove /dev/sdb /dev/sdc
sudo vgreduce vg_data /dev/sdb
После pvmove старый диск свободен, но ещё помечен как PV. Команда vgreduce убирает его из группы, а pvremove стирает метаданные. Если переносится корневой том, проверьте, что загрузчик и initramfs видят новый диск, и не удаляйте старый до успешной перезагрузки.
Снапшоты: возможности и ловушки
Снапшот LVM — это копия «на момент», которая хранит только изменённые блоки. Создаётся мгновенно и не требует места, равного тому. Но это не резервная копия: при заполнении области COW снимок становится недействительным, а данные на нём — несогласованными.
sudo lvcreate -L 20G -s -n snap_app /dev/vg_data/lv_app
sudo mkdir -p /mnt/snap
sudo mount -o ro /dev/vg_data/snap_app /mnt/snap
sudo lvs -o lv_name,lv_size,data_percent vg_data
Для согласованного снимка базы данных сначала замораживаем файловую систему, затем создаём снимок и размораживаем. Между fsfreeze и lvcreate не должно быть долгих пауз: приложение в это время не пишет.
sudo fsfreeze -f /srv/app
sudo lvcreate -L 10G -s -n snap_db /dev/vg_data/lv_app
sudo fsfreeze -u /srv/app
sudo lvs -o lv_name,lv_size,data_percent vg_data
Откат выполняется слиянием снимка с исходным томом. Том должен быть размонтирован, а после слияния — смонтирован заново. Все изменения, сделанные после снимка, будут потеряны, поэтому операцию выполняют осознанно.
sudo umount /srv/app
sudo lvconvert --merge /dev/vg_data/snap_app
sudo mount /dev/vg_data/lv_app /srv/app
sudo lvs -o lv_name,lv_size,data_percent vg_data
Тонкие тома и контроль заполнения
Thin provisioning позволяет выдать приложению 500 ГБ, реально занимая десятки. Это удобно для виртуальных машин, но требует мониторинга: переполнение тонкого пула приводит к ошибкам записи сразу у всех томов. Следите за data_percent и metadata_percent, а автоматическое расширение настройте в /etc/lvm/lvm.conf.
sudo lvcreate --type thin-pool -L 100G -n pool vg_data
sudo lvcreate --type thin -V 500G -n thin_app --thinpool pool vg_data
sudo lvs -a -o lv_name,lv_size,data_percent,metadata_percent vg_data
sudo dmsetup status | grep vg_data
Пороги автоматического расширения задаются в секции activation файла /etc/lvm/lvm.conf: thin_pool_autoextend_threshold = 80 и thin_pool_autoextend_percent = 20. Мониторинг это не отменяет, но даёт запас времени.
sudo lvs -a -o lv_name,data_percent,metadata_percent vg_data
sudo lvmconfig --type default activation/thin_pool_autoextend_threshold
sudo dmsetup status | grep thin
sudo journalctl -u lvm2-monitor --since today
Диагностика проблем
pvs -aпоказывает диски без метки LVM и подозрительные размеры.journalctl -u lvm2-monitorфиксирует события dmeventd и проблемы с тонкими пулами.lsblk -fпомогает увидеть, какая файловая система смонтирована и по какому пути.- Ошибка «device not found» при загрузке чаще всего означает, что том не попал в initramfs; помогает
update-initramfs -u.
lsblk -f
sudo pvs -a -o+pv_used,pv_free
sudo journalctl -u lvm2-monitor --since "1 hour ago"
sudo update-initramfs -u
| Задача | Команда |
|---|---|
| Расширить | lvextend -r |
| Перенести | pvmove |
| Снять копию | lvcreate -s |
Итог
LVM даёт гибкость, которой не хватает классическим разделам: расширение без простоя, перенос данных между дисками и быстрые снимки для тестов и обновлений. Но гибкость требует дисциплины: следите за свободным местом в группе, не считайте снапшот резервной копией, контролируйте заполнение тонких пулов и проверяйте fstab до перезагрузки. Эти привычки превращают LVM из источника аварий в надёжный инструмент повседневной работы.