# LVM - Logical Volume Manager _Файловая система · LinuxLab Knowledge Base_ **TL;DR:** LVM - слой между [[block-devices]] и ФС: объединяет диски в pool'ы и нарезает логические тома любого размера, которые можно расширять, снапшотить, мигрировать вживую. ## Зачем Без LVM раздел `/dev/sda1` - фиксированный кусок диска. Чтобы расширить /home - надо двигать физические разделы. С LVM ты добавляешь диск в pool и расширяешь логический том на лету, не размонтируя. Дополнительно: снапшоты, миграция между дисками, RAID, thin provisioning. ## Иерархия ``` PV (Physical Volume) ← обычный раздел или диск целиком ↓ VG (Volume Group) ← пул из одного или нескольких PV ↓ LV (Logical Volume) ← виртуальный том внутри VG, под него делаешь ФС ``` ## Создание с нуля ```bash # 1. Подготовить физические тома (на разделах или целом диске) sudo pvcreate /dev/sdb1 /dev/sdc1 sudo pvs # список PV sudo pvdisplay /dev/sdb1 # подробно # 2. Создать volume group из них sudo vgcreate vg-data /dev/sdb1 /dev/sdc1 sudo vgs # список VG sudo vgdisplay vg-data # 3. Нарезать logical volumes sudo lvcreate -L 50G -n web vg-data # 50 GB том "web" sudo lvcreate -l 100%FREE -n logs vg-data # весь оставшийся объём sudo lvs # список LV sudo lvdisplay /dev/vg-data/web # 4. Создать ФС и смонтировать sudo mkfs.ext4 /dev/vg-data/web sudo mount /dev/vg-data/web /var/www ``` Имена для fstab - `/dev//` или `/dev/mapper/-` (оба указывают на один device). ## Расширение онлайн (главная фича) ```bash # 1. Добавить ещё один диск в VG sudo pvcreate /dev/sdd1 sudo vgextend vg-data /dev/sdd1 # 2. Расширить LV sudo lvextend -L +100G /dev/vg-data/web # +100 GB sudo lvextend -l +100%FREE /dev/vg-data/logs # весь свободный # 3. Расширить ФС поверх (БЕЗ размонтирования) sudo resize2fs /dev/vg-data/web # ext4 sudo xfs_growfs /var/www # xfs (по mount-точке!) # ext4: всё одной командой sudo lvextend -L +100G -r /dev/vg-data/web # -r = автоматом resize2fs ``` ## Уменьшение (опасно!) Поддерживает только ext4 / btrfs (xfs - нельзя). Порядок ОБРАТНЫЙ: сначала ужать ФС, потом LV. ```bash sudo umount /var/www sudo e2fsck -f /dev/vg-data/web sudo resize2fs /dev/vg-data/web 30G sudo lvreduce -L 30G /dev/vg-data/web sudo mount /var/www ``` Если перепутать порядок → потеря данных. Делай бэкап. ## Снапшоты COW-снапшот - мгновенный, занимает место только на изменения: ```bash # Снапшот для бэкапа: 5 GB места под изменения, имя snap-web sudo lvcreate -L 5G -s -n snap-web /dev/vg-data/web # Использовать (например, бэкап через rsync с замороженного состояния): sudo mkdir /mnt/snap sudo mount -o ro /dev/vg-data/snap-web /mnt/snap rsync -av /mnt/snap/ /backup/web/ # Удалить снапшот sudo umount /mnt/snap sudo lvremove /dev/vg-data/snap-web ``` ВАЖНО: снапшот **сломается** если изменений больше выделенного места. Мониторить: `lvs` - колонка `Data%`. ## Thin provisioning Обычные LV занимают своё место сразу. Thin LV - overcommit'ятся: можно создать 5 томов по 100 GB при 200 GB реального места. Потребляют место по мере записи. ```bash sudo lvcreate -L 200G -T vg-data/thin-pool # пул sudo lvcreate -V 100G -T vg-data/thin-pool -n vm1 # тонкий том 100G "виртуально" ``` Опасно если кто-то реально запишет - `dmesg` начнёт ругаться, и тома начнут стопориться. Мониторить usage пула обязательно. ## Миграция между дисками онлайн Заменить старый диск на новый без downtime: ```bash sudo pvcreate /dev/sde1 sudo vgextend vg-data /dev/sde1 sudo pvmove /dev/sdb1 # переехать с sdb1 на свободные PV sudo vgreduce vg-data /dev/sdb1 sudo pvremove /dev/sdb1 # Теперь sdb1 можно вынуть ``` ## Полезный обзор ```bash sudo pvs && echo --- && sudo vgs && echo --- && sudo lvs sudo lsblk # дерево с LV видно sudo lvs -o +devices # на каких PV лежит каждый LV ``` ## Команды ```bash sudo pvs && sudo vgs && sudo lvs ``` Все три уровня LVM в одной команде - обзор pool'а ```bash sudo lvextend -L +50G -r /dev/vg/data ``` Расширить том на 50G и сразу resize ФС (-r) ```bash sudo lvcreate -L 5G -s -n snap /dev/vg/data ``` Снапшот для backup'а - быстрая заморозка состояния ```bash sudo pvmove /dev/sdb1 ``` Перенести данные с диска онлайн перед его извлечением ```bash sudo lvs -o +devices ``` На каких физических устройствах лежит каждый LV ## См. также - [Block devices - диски в Linux](/kb/block-devices.md) - [Файловые системы: ext4, xfs, btrfs, zfs](/kb/filesystems.md) - [ext4 - рабочая лошадь Linux-ФС](/kb/ext4.md) - [XFS - extents и параллельный I/O](/kb/xfs.md) - [lsblk и blkid - block-устройства и UUID](/kb/cmd-lsblk-blkid.md)