LVM в Linux: тома, группы, снапшоты и тонкое выделение
LVM (Logical Volume Manager) превращает физические диски в гибкий пул, из которого можно нарезать логические тома любого размера. Расширить раздел на лету, сделать снапшот перед обновлением, объединить несколько дисков в одну группу — всё это LVM. Разбираем архитектуру (PV → VG → LV), базовые операции, снапшоты и thin provisioning на Ubuntu.
Зачем нужен LVM
LVM (Logical Volume Manager) — слой абстракции между физическими дисками и файловыми системами в Linux. Вместо того чтобы создавать ФС прямо на разделе диска, LVM позволяет:
- Объединить несколько дисков в один большой пул.
- Нарезать пул на логические тома любого размера.
- Менять размер тома на лету без размонтирования.
- Делать снапшоты — мгновенные копии-on-write для бэкапа или отката.
- Использовать thin provisioning — выделять виртуальный размер больше реально доступного.
Цена — небольшое усложнение архитектуры (ещё один слой между ФС и диском) и накладные расходы 1–3% производительности на современном оборудовании.
На Ubuntu LVM ставится из коробки: при установке Ubuntu Server по умолчанию предлагается «Use LVM with the new system», и большинство серверных установок идут именно так.
Архитектура: PV → VG → LV
Три уровня абстракции:
┌─────────────────────────────────────────────┐
│ Logical Volume (LV) /root, /home, /data │ ← здесь живут ФС
├─────────────────────────────────────────────┤
│ Volume Group (VG) vg0 │ ← общий пул
├─────────────────────────────────────────────┤
│ Physical Volume (PV) /dev/sda3, /dev/sdb1│ ← физические диски/разделы
└─────────────────────────────────────────────┘
- PV (Physical Volume) — физический том. Раздел диска или целый диск, инициализированный для LVM.
- VG (Volume Group) — группа томов. Объединяет несколько PV в один пул.
- LV (Logical Volume) — логический том. Нарезается из VG, на нём создаётся файловая система.
Аналогия: PV — это запасы муки на складе, VG — это общая бочка муки на кухне, LV — конкретные хлебы, которые ты из неё печёшь.
Базовые команды
# Установка инструментов (на свежем Ubuntu Server они есть)
sudo apt install lvm2
# Просмотр текущего состояния
sudo pvs # коротко: физические тома
sudo vgs # группы
sudo lvs # логические тома
# Подробнее
sudo pvdisplay
sudo vgdisplay
sudo lvdisplay
Типичный вывод lvs:
LV VG Attr LSize Pool Origin
root vg0 -wi-ao---- 40.00g
home vg0 -wi-ao---- 100.00g
swap vg0 -wi-ao---- 4.00g
-wi-ao---- — флаги тома. Главные: a = active, o = open (смонтирован).
Создать LVM с нуля
Допустим, к серверу подключили новый диск /dev/sdb.
# 1. Создать PV
sudo pvcreate /dev/sdb
# Опционально: на разделе, не на целом диске
# (если диск понадобится для других задач)
sudo parted /dev/sdb mklabel gpt
sudo parted -a opt /dev/sdb mkpart primary 0% 100%
sudo pvcreate /dev/sdb1
# 2. Создать VG (или расширить существующую)
sudo vgcreate data_vg /dev/sdb
# Если VG уже есть и нужно добавить диск:
sudo vgextend vg0 /dev/sdb
# 3. Создать LV
sudo lvcreate -n backups -L 50G data_vg
# -n имя_тома -L размер имя_группы
# 4. Создать ФС и смонтировать
sudo mkfs.ext4 /dev/data_vg/backups
sudo mkdir /backups
sudo mount /dev/data_vg/backups /backups
# 5. Постоянное монтирование
echo "/dev/data_vg/backups /backups ext4 defaults 0 2" | sudo tee -a /etc/fstab
После этого df -h /backups показывает новый том на 50 ГБ.
Расширить логический том
Самая частая операция в продакшне.
# Сначала проверить, что в VG есть свободное место
sudo vgs
# vg0 vsize=200g vfree=50g ← есть 50 ГБ запаса
# Добавить 20 ГБ к /home
sudo lvextend -L +20G /dev/vg0/home
# Расширить ФС
# Для ext4:
sudo resize2fs /dev/vg0/home
# Для xfs (только онлайн-расширение):
sudo xfs_growfs /home
# Или одной командой через -r (для ext4)
sudo lvextend -L +20G -r /dev/vg0/home
Расширение онлайн, размонтировать ничего не нужно. Файловая система продолжает работать.
Если в VG не хватает места — сначала добавить новый диск:
sudo pvcreate /dev/sdc
sudo vgextend vg0 /dev/sdc
sudo lvextend -L +200G -r /dev/vg0/home
Сжать логический том
Сжатие сложнее и опаснее:
# 1. Размонтировать
sudo umount /home
# 2. Проверить ФС
sudo e2fsck -f /dev/vg0/home
# 3. Уменьшить ФС
sudo resize2fs /dev/vg0/home 50G
# 4. Уменьшить LV
sudo lvreduce -L 50G /dev/vg0/home
# 5. Смонтировать обратно
sudo mount /home
Важно: сначала ФС, потом LV — иначе данные за пределами нового размера будут утеряны. И только ext-семейство поддерживает уменьшение; xfs нельзя уменьшить.
Для xfs — единственный способ: создать новый меньший LV, скопировать данные, удалить старый.
Снапшоты LVM
Снапшот — мгновенная копия-on-write логического тома. При создании снапшота он почти ничего не занимает; только изменённые после создания блоки занимают место.
# Создать снапшот /dev/vg0/home размером 5 ГБ
sudo lvcreate --snapshot -L 5G -n home_snap /dev/vg0/home
# Снапшот доступен как обычный LV
sudo mkdir /mnt/home_snap
sudo mount /dev/vg0/home_snap /mnt/home_snap -o ro
# Сделать бэкап с консистентного состояния
sudo rsync -a /mnt/home_snap/ /backup/home/
# Размонтировать и удалить снапшот
sudo umount /mnt/home_snap
sudo lvremove /dev/vg0/home_snap
Размер снапшота — это место для накопления изменений с момента создания. Если изменения превысят размер — снапшот «лопнет» (станет invalid) и его придётся пересоздать. Правило: размер_снапшота >= ожидаемые_изменения_за_время_жизни_снапшота.
Откат через снапшот
Снапшот можно использовать для отката LV в исходное состояние:
# Создать снапшот перед опасной операцией
sudo lvcreate --snapshot -L 5G -n root_before_upgrade /dev/vg0/root
# Запустить обновление
sudo apt full-upgrade -y
# Если что-то сломалось — откат
sudo lvconvert --merge /dev/vg0/root_before_upgrade
# (потребуется перезагрузка для корневого тома)
После --merge снапшот «втягивает» изменения обратно в исходный том. Снапшот при этом удаляется.
Thin provisioning (тонкие тома)
Обычный LV занимает свой размер сразу. Thin LV — занимает место только по мере записи.
# 1. Создать тонкий пул
sudo lvcreate --type thin-pool -L 200G -n pool0 vg0
# 2. Создать тонкие тома (можно overcommit)
sudo lvcreate --thin --virtualsize 100G -n app1 vg0/pool0
sudo lvcreate --thin --virtualsize 100G -n app2 vg0/pool0
sudo lvcreate --thin --virtualsize 100G -n app3 vg0/pool0
# Суммарно 300 ГБ "виртуально" из 200 ГБ реальных
# 3. Создать ФС и использовать
sudo mkfs.ext4 /dev/vg0/app1
Удобно для контейнеров, VM, тестовых сред — каждый аппликации видит «свой большой диск», а физически место расходуется по факту записи.
Опасность: если суммарный реальный расход превысит размер пула — все тонкие тома начнут получать ошибки записи. Нужно мониторить:
sudo lvs -a -o lv_name,data_percent,metadata_percent vg0
data_percent — процент заполнения пула. Алерт при 80%+.
LVM на установленном Ubuntu
Ubuntu Server installer по умолчанию создаёт LVM-структуру:
/boot — отдельный раздел (не LVM)
/boot/efi — UEFI раздел (не LVM)
/ — LV ubuntu-vg/ubuntu-lv (LVM!)
swap — обычно тоже LV
Если установка идёт «Use entire disk with LVM», VG создаётся размером на половину диска — это легендарный артефакт инсталлятора Ubuntu для запаса под снапшоты. Расширить до полного размера:
# Проверить размеры
sudo vgs
# ubuntu-vg #PV 1 #LV 1 VFree 240.00g ← незанятое место в VG
# Расширить корневой LV на всё свободное
sudo lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
sudo resize2fs /dev/ubuntu-vg/ubuntu-lv
Это самая частая операция после установки Ubuntu Server.
Удаление и миграция
# Удалить LV (предварительно размонтировать)
sudo umount /backups
sudo lvremove /dev/data_vg/backups
# Удалить VG (предварительно удалить все LV)
sudo vgremove data_vg
# Удалить PV (предварительно удалить из VG)
sudo pvremove /dev/sdb1
# Перенести данные с одного PV на другие (для замены диска)
sudo pvmove /dev/sdb /dev/sdc
# После pvmove диск sdb можно безопасно убрать из VG
sudo vgreduce vg0 /dev/sdb
sudo pvremove /dev/sdb
pvmove работает онлайн — без размонтирования, без простоя. Это главная фишка LVM в продакшне: можно сменить диск без остановки сервиса.
Подводные камни
Boot и LVM
/boot обычно не на LVM — потому что загрузчик (GRUB) должен уметь читать ядро ещё до того, как LVM-модуль ядра загружен. GRUB-2 поддерживает чтение LVM, но это нестандартная конфигурация.
Снапшоты и производительность
Активный снапшот замедляет запись в исходный том (каждая запись копирует старый блок в снапшот — CoW). Не держите снапшоты долго. Снимок для бэкапа — на 30 минут максимум.
Thin pool — мониторинг обязателен
Без алертов на заполнение пула риск получить ошибки записи во всех тонких томах одновременно. Используйте lvmpolld (демон мониторинга LVM) + Prometheus/Nagios.
Backup VG metadata
Метаданные VG (структура томов) хранятся в самом VG и в /etc/lvm/backup/. Если LVM «забыл» о томах после reboot — восстановить можно:
sudo vgcfgrestore vg0
Регулярные бэкапы /etc/lvm/backup/ спасают при катастрофе.
Частые вопросы
Стоит ли использовать LVM на новом сервере?
Да, в большинстве случаев. LVM даёт гибкость размеров, снапшоты для бэкапа и возможность безопасной миграции данных при замене диска. Накладные расходы 1–3% производительности на современном оборудовании пренебрежимы. Не нужен LVM только на очень простых системах (1 диск, 1 раздел навсегда) или где требуется максимальная производительность (NVMe + ext4 без слоёв).
Как расширить LVM раздел в Ubuntu?
Сначала добавить место в VG (vgextend после pvcreate на новом диске), потом расширить LV (lvextend -L +<size> -r /dev/vg/lv). Флаг -r автоматически расширит файловую систему. Всё происходит онлайн, без размонтирования.
Что такое LVM-снапшот и сколько он занимает места?
Снапшот — мгновенная копия логического тома с copy-on-write. Изначально не занимает места; растёт по мере изменения исходного тома. Размер снапшота при создании — это лимит на накопление изменений. Если измений будет больше — снапшот станет недействителен. Для бэкапа обычно достаточно 5–10% от размера тома.
В чём разница между thin provisioning и обычным LV?
Обычный LV занимает свой полный размер на диске сразу при создании. Thin LV занимает только реально записанное место, при этом виртуально может быть больше доступного. Удобно для контейнеров, VM, тестовых сред. Цена — обязательный мониторинг пула, чтобы не получить ошибки записи при заполнении.
Можно ли уменьшить LVM-раздел?
Да, но только для ФС, поддерживающих уменьшение (ext2/3/4). XFS уменьшить нельзя — придётся пересоздавать. Порядок: размонтировать → e2fsck -f → resize2fs <new_size> → lvreduce -L <new_size> → смонтировать. Порядок важен: сначала ФС, потом LV.
Что запомнить
- LVM = PV (физический том) → VG (группа) → LV (логический том).
- На Ubuntu Server по умолчанию устанавливается с LVM.
- Расширение онлайн:
lvextend -L +<size> -r /dev/vg/lv. - Уменьшение оффлайн: сначала ФС, потом LV (только для ext-семейства).
- Снапшоты CoW, размер ограничивает накопление изменений; держать недолго.
- Thin provisioning требует мониторинга пула, иначе ошибки записи.
pvmoveпереносит данные на другой диск без простоя.- После установки Ubuntu Server — расширить корневой LV до полного диска:
lvextend -l +100%FREE.