ServerAID
Найти гайд, команду, тег… ⌘ K
Файловые системы

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 -fresize2fs <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.

Похожие материалы

Файловые системы

GParted в Linux: визуальная разметка диска на Ubuntu

GParted — графический редактор разделов диска для Linux. Позволяет создавать, удалять, расширять и перемещать разделы мышкой, без запоминания флагов fdisk и parted. Разбираем установку на Ubuntu Desktop, работу с GParted Live USB для офлайн-операций, базовые сценарии (ресайз корневого раздела после увеличения диска в VM) и CLI-альтернативы, когда GUI недоступен.

Редакция
Файловые системы

/etc/fstab на Linux: монтирование дисков, разделов и swap при загрузке

`/etc/fstab` — главный конфиг точек монтирования в Linux. Описывает, какие разделы и где монтируются при загрузке. Разбираем формат файла, выбор между UUID/LABEL/`/dev/sdaX`, опции `noatime`/`nofail`, swap-запись, NFS и проверку без перезагрузки. На Ubuntu 24.04 этот файл управляет всем — от корня системы до сетевых шар.

Редакция
Файловые системы

btrfs снапшоты и subvolume на Ubuntu: откат системы за 5 секунд

btrfs делает снапшот тома за миллисекунды и без расхода места — это copy-on-write слепок, в который можно «вернуться» после неудачного `apt upgrade`. Разбираем разницу с ext4, как готовить разметку под subvolume, снимать снимки, откатываться и чистить старые на Ubuntu 24.04 LTS.

Редакция
Рабочий стол

Драйвер NVIDIA на Ubuntu: установка, версии, Wayland и решение проблем

Драйвер NVIDIA на Ubuntu — традиционно болезненная тема: открытый Nouveau не даёт нужной производительности, а проприетарный иногда конфликтует с Wayland, ядром или secure boot. Разбираем, как выбрать правильную версию, установить через ubuntu-drivers, что делать с Wayland на NVIDIA, как поставить CUDA и решить типичные проблемы — чёрный экран, низкое разрешение, разваленный X-сервер.

Редакция