LVM в Linux: физические тома, группы и логические тома на практике
LVM (Logical Volume Manager) в Linux — слой между дисками и файловыми системами: диски превращаются в физические тома (PV), объединяются в группу томов (VG), из которой нарезаются логические тома (LV) любого размера. Главное преимущество — том можно расширить на лету командой lvextend -r, добавить в группу новый диск без остановки сервиса и сделать снапшот перед рискованной операцией.
LVM (Logical Volume Manager) — это менеджер логических томов в Linux, который отделяет файловые системы от физических дисков. Вместо того чтобы жёстко привязывать /var к разделу /dev/sdb1, вы складываете диски в общий пул и нарезаете из него тома нужного размера. Когда места не хватает, том растёт одной командой, без перезагрузки и без остановки сервиса. Ниже разберём, как устроен LVM в Linux, как создать тома с нуля, расширить их, сделать снапшот и не потерять данные на типичных ошибках.
Зачем нужен LVM, если есть обычные разделы
Обычный раздел — это непрерывный кусок одного диска. Его размер задаётся при разметке, и увеличить его можно только если сразу за ним есть свободное место. Если диск закончился, придётся покупать новый, переносить данные и переписывать /etc/fstab, а сервис на это время остановить.
LVM решает три задачи:
- Гибкий размер. Логический том можно увеличить (а для ext4 — и уменьшить) в любой момент.
- Объединение дисков. Несколько физических дисков становятся одним пулом; один том может лежать сразу на двух дисках.
- Снапшоты. Моментальный слепок тома перед обновлением, миграцией базы или другой рискованной операцией.
Поэтому LVM по умолчанию предлагают установщики Ubuntu Server, RHEL, Rocky и AlmaLinux, а на серверах под данные его ставят почти всегда.
Три уровня LVM: PV, VG и LV
Вся логика LVM укладывается в три понятия. Удобная аналогия: диски — это мешки муки, группа — общий склад, логические тома — порции, которые вы со склада отвешиваете.
| Уровень | Что это | Пример имени | Создаётся командой |
|---|---|---|---|
| PV (Physical Volume) | диск или раздел, размеченный для LVM | /dev/sdb, /dev/sdc1 | pvcreate |
| VG (Volume Group) | пул, объединяющий один или несколько PV | data_vg | vgcreate |
| LV (Logical Volume) | том, нарезанный из VG; на нём создают файловую систему | /dev/data_vg/app | lvcreate |
Внутри VG место делится на экстенты (PE, physical extents) — блоки фиксированного размера, по умолчанию 4 МиБ. Логический том — это просто набор экстентов, которые не обязаны идти подряд и могут лежать на разных дисках. Именно поэтому том так легко расширять: LVM дописывает ему свободные экстенты откуда угодно.
Устройство логического тома доступно по двум равнозначным путям: /dev/data_vg/app и /dev/mapper/data_vg-app. Под капотом это устройство device-mapper ядра.
Как посмотреть, что уже есть
Сначала убедитесь, что пакет установлен: в Debian и Ubuntu это lvm2 (sudo apt install lvm2), в RHEL-семействе он стоит по умолчанию. Для обзора есть короткие и подробные команды:
$ sudo pvs
PV VG Fmt Attr PSize PFree
/dev/sdb data_vg lvm2 a-- <20.00g 0
/dev/sdc data_vg lvm2 a-- <20.00g <10.00g
$ sudo vgs
VG #PV #LV #SN Attr VSize VFree
data_vg 2 1 0 wz--n- 39.99g <10.00g
$ sudo lvs
LV VG Attr LSize Pool Origin Data% Meta%
app data_vg -wi-ao---- 30.00g
Подробности показывают pvdisplay, vgdisplay и lvdisplay. Общую картину вместе с обычными разделами даёт lsblk: логические тома видны в нём с типом lvm.
$ lsblk /dev/sdb /dev/sdc
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sdb 8:16 0 20G 0 disk
└─data_vg-app 253:0 0 30G 0 lvm /srv/app
sdc 8:32 0 20G 0 disk
└─data_vg-app 253:0 0 30G 0 lvm /srv/app
Видно, что том app размером 30 ГБ лежит сразу на двух дисках по 20 ГБ — обычным разделом так не сделать.
LVM с нуля: от сырого диска до смонтированного тома
Допустим, на сервер добавили пустой диск /dev/sdb, и под данные приложения нужен том на 15 ГБ. Проверьте имя диска через lsblk дважды: все команды ниже уничтожают данные на указанном устройстве.
Шаг 1. Создать физический том
$ sudo pvcreate /dev/sdb
Physical volume "/dev/sdb" successfully created.
Можно отдать LVM весь диск целиком, а можно сначала создать раздел через fdisk или parted с типом «Linux LVM» и указать его (/dev/sdb1). Раздел нагляднее для других администраторов и защищает от случайной разметки диска поверх LVM, весь диск проще расширять в облаке.
Шаг 2. Создать группу томов
$ sudo vgcreate data_vg /dev/sdb
Volume group "data_vg" successfully created
Шаг 3. Нарезать логический том
$ sudo lvcreate -n app -L 15G data_vg
Logical volume "app" created.
Флаг -L задаёт абсолютный размер, -l — размер в экстентах или процентах: -l 100%FREE займёт всё свободное место группы, -l 50%VG — половину группы. Оставлять в VG свободный запас — хорошая практика: его можно потом добавить любому тому или отдать под снапшот.
Шаг 4. Файловая система и монтирование
$ sudo mkfs.ext4 /dev/data_vg/app
$ sudo mkdir -p /srv/app
$ sudo mount /dev/data_vg/app /srv/app
$ df -h /srv/app
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/data_vg-app 15G 24K 14G 1% /srv/app
Чтобы том монтировался после перезагрузки, добавьте строку в /etc/fstab. Для логических томов путь /dev/mapper/... стабилен, так что можно использовать его или UUID из blkid:
/dev/mapper/data_vg-app /srv/app ext4 defaults 0 2
Проверьте запись командой sudo mount -a до перезагрузки: ошибка в fstab может оставить сервер в аварийном режиме.
Как расширить LVM том без остановки сервиса
Это главная причина любить LVM. Том растёт на смонтированной файловой системе, приложение продолжает писать данные. Сценарий зависит от того, есть ли свободное место в группе.
Если в VG есть свободное место
$ sudo vgs data_vg
VG #PV #LV #SN Attr VSize VFree
data_vg 1 1 0 wz--n- <20.00g <5.00g
$ sudo lvextend -r -L +4G /dev/data_vg/app
Size of logical volume data_vg/app changed from 15.00 GiB to 19.00 GiB.
Logical volume data_vg/app successfully resized.
resize2fs 1.47.0
Filesystem at /dev/mapper/data_vg-app is mounted on /srv/app; on-line resizing required
Ключевой флаг — -r (--resizefs): он сразу после увеличения тома расширяет и файловую систему. Без него том станет больше, а df -h покажет прежний размер, потому что файловая система о новом месте не знает. Это самая частая ошибка: в таком случае достаточно выполнить resize2fs для ext4 или xfs_growfs для XFS вручную.
$ sudo resize2fs /dev/data_vg/app # ext4, указывается устройство
$ sudo xfs_growfs /srv/app # XFS, указывается точка монтирования
Обратите внимание на плюс: -L +4G добавляет 4 ГБ, а -L 4G устанавливает итоговый размер 4 ГБ. Чтобы отдать тому всё оставшееся место, используйте -l +100%FREE.
Если место в VG закончилось: добавить диск
Подключите новый диск (в облаке — присоедините том), найдите его через lsblk и добавьте в группу:
$ sudo pvcreate /dev/sdc
$ sudo vgextend data_vg /dev/sdc
Volume group "data_vg" successfully extended
$ sudo lvextend -r -l +100%FREE /dev/data_vg/app
Три команды, ноль простоя. Файловая система теперь лежит на двух дисках, и приложение этого не замечает.
Если диск увеличили в облаке
В облаке часто проще не добавлять диск, а увеличить существующий. Тогда ядро увидит новый размер устройства, а физический том нужно растянуть командой pvresize:
$ sudo pvresize /dev/sdb
Physical volume "/dev/sdb" changed
$ sudo lvextend -r -l +100%FREE /dev/data_vg/app
Если PV создан на разделе (/dev/sdb1), сначала расширьте раздел, например утилитой growpart /dev/sdb 1 из пакета cloud-guest-utils, и только потом pvresize /dev/sdb1.
Можно ли уменьшить LVM том
Можно, но не для всех файловых систем и не на лету. XFS уменьшать не умеет вообще — только пересоздавать с переносом данных. Ext4 уменьшается, но только в отмонтированном состоянии:
$ sudo umount /srv/app
$ sudo lvreduce -r -L 10G /dev/data_vg/app
С флагом -r LVM сам проверит файловую систему (e2fsck) и сожмёт её до уменьшения тома. Без -r легко отрезать том меньше, чем файловая система, и повредить данные. Перед уменьшением всегда делайте резервную копию.
Снапшоты LVM: слепок тома перед рискованной операцией
Снапшот — это моментальный слепок логического тома. Он создаётся за доли секунды и не копирует данные: LVM работает по принципу copy-on-write и сохраняет в снапшот только те блоки, которые на исходном томе меняются после его создания. Поэтому снапшоту нужно место в VG лишь под изменения, а не под весь объём тома.
$ sudo lvcreate -s -n app_before_upgrade -L 2G /dev/data_vg/app
Logical volume "app_before_upgrade" created.
$ sudo lvs data_vg
LV VG Attr LSize Origin Data%
app data_vg owi-aos--- 19.00g
app_before_upgrade data_vg swi-a-s--- 2.00g app 0.01
Колонка Data% показывает, насколько заполнено хранилище изменений. Если оно дойдёт до 100%, классический снапшот станет недействительным и его останется только удалить. Размер выбирайте с запасом под ожидаемый объём изменений, а за долгими снапшотами следите через lvs или расширяйте их командой lvextend.
Как откатиться на снапшот
Если обновление прошло плохо, верните том к состоянию на момент снапшота:
$ sudo umount /srv/app
$ sudo lvconvert --merge /dev/data_vg/app_before_upgrade
Merging of volume data_vg/app_before_upgrade started.
$ sudo mount /srv/app
После слияния снапшот исчезает. Если том отмонтировать нельзя (например, это корень системы), слияние отложится до следующей активации тома, то есть до перезагрузки.
Если всё прошло хорошо
Снапшот просто удаляют, чтобы он не замедлял запись и не занимал место:
$ sudo lvremove /dev/data_vg/app_before_upgrade
Снапшот удобно монтировать только на чтение, чтобы снять согласованную резервную копию работающей системы: mount -o ro и копирование через rsync или tar. Для XFS добавьте опцию nouuid, иначе монтирование откажет из-за совпадения UUID с оригиналом.
LVM и RAID: не путайте задачи
LVM сам по себе от отказа диска не защищает. Если том растянут на два диска и один из них умер, теряется весь том, а не половина. Для отказоустойчивости под LVM кладут RAID (mdadm) или используют встроенный в LVM режим зеркала (lvcreate --type raid1 -m 1).
И ни RAID, ни снапшоты не заменяют резервную копию. Снапшот лежит на тех же дисках, что и оригинал, а RAID послушно зеркалирует и случайное rm -rf. Нужна отдельная копия на другом носителе.
Шпаргалка команд LVM
| Задача | Команда |
|---|---|
| Обзор PV, VG, LV | pvs, vgs, lvs |
| Создать физический том | pvcreate /dev/sdb |
| Создать группу | vgcreate data_vg /dev/sdb |
| Добавить диск в группу | vgextend data_vg /dev/sdc |
| Создать том | lvcreate -n app -L 15G data_vg |
| Расширить том и ФС | lvextend -r -L +5G /dev/data_vg/app |
| Растянуть PV после увеличения диска | pvresize /dev/sdb |
| Снапшот | lvcreate -s -n snap -L 2G /dev/data_vg/app |
| Откат на снапшот | lvconvert --merge /dev/data_vg/snap |
| Убрать диск из группы | pvmove /dev/sdb, затем vgreduce data_vg /dev/sdb |
| Удалить том | lvremove /dev/data_vg/app |
Типичные ошибки
- Том расширили, а df показывает старый размер. Забыли
-r. Выполнитеresize2fsилиxfs_growfs. - Insufficient free space. В группе нет свободных экстентов: проверьте
vgsи добавьте диск черезvgextendили растяните PV. - Device /dev/sdc excluded by a filter. На диске осталась старая разметка или подпись файловой системы. Если данные на нём точно не нужны, очистите её командой
wipefs -a /dev/sdc. - Снапшот стал Invalid. Хранилище изменений заполнилось на 100%. Восстановить его нельзя — только удалить и в следующий раз выделить больше места.
Итог
LVM в Linux — это три слоя: физические тома (PV) складываются в группу (VG), из которой нарезаются логические тома (LV). Это даёт то, чего нет у обычных разделов: расширение тома на лету через lvextend -r, добавление дисков без простоя и снапшоты перед рискованными изменениями. Помните, что LVM не заменяет ни RAID, ни резервные копии. Разметка дисков, LVM, RAID и квоты разобраны на практике в лекции курса по Linux.
Частые вопросы
Можно ли перевести уже работающий раздел с данными на LVM?
Напрямую нет: pvcreate затирает начало устройства. Нужно создать LVM на другом диске, скопировать данные через rsync, поправить fstab и только потом освободить старый раздел.
Замедляет ли LVM работу диска?
Без снапшотов накладные расходы device-mapper практически незаметны. Активные классические снапшоты замедляют запись в исходный том из-за copy-on-write, поэтому их не стоит держать неделями.
Нужен ли LVM на домашнем компьютере или ноутбуке?
Не обязателен, но полезен при шифровании диска (LUKS с LVM внутри) и если вы хотите менять размеры разделов без переразметки. На серверах с данными LVM практически стандарт.
Что такое thin provisioning в LVM?
Это тонкие тома: создаётся пул (lvcreate --type thin-pool), а тома в нём занимают реальное место только по мере записи данных. Так можно выдать томам больше, чем есть физически, но за заполнением пула нужно следить.
Как удалить диск из группы томов, не потеряв данные?
Перенесите с него экстенты на другие диски группы командой pvmove /dev/sdb (нужно достаточно свободного места), затем выполните vgreduce data_vg /dev/sdb и pvremove /dev/sdb.
Эта тема подробно разобрана с практикой в курсе «Linux: с нуля до уверенного администрирования».
Перейти к курсу