LVM и управление томами
Знакомимся с LVM — слоем управления томами, который снимает жёсткость классических разделов: позволяет расширять диски на лету, объединять несколько накопителей и делать снапшоты.
LVM (Logical Volume Manager) — прослойка между физическими дисками и файловыми системами. Она собирает диски в общий пул (VG) и нарезает из него гибкие логические тома (LV), размер которых меняется без переразбивки.
Зачем это знать на практике
Сервер проработал год, и раздел /var под базой данных кончился. С обычными разделами это боль: подвинуть соседний раздел сложно и рискованно. С LVM — две команды на работающей системе, без перезагрузки и простоя. А ещё LVM умеет снапшоты: «заморозить» состояние тома перед опасным обновлением и откатиться, если что-то пошло не так. Для любого, кто администрирует серверы или БД, LVM — стандарт де-факто.
Три уровня LVM
| Уровень | Аббревиатура | Что это |
| Physical Volume | PV | физический «кирпич»: диск или раздел, отданный под LVM |
| Volume Group | VG | пул, объединяющий несколько PV в общее пространство |
| Logical Volume | LV | логический том, нарезанный из VG; на нём создаётся файловая система |
Логика такая: берём диски (PV) → ссыпаем их в один пул (VG) → нарезаем из пула тома нужного размера (LV) → на томах делаем ext4 и монтируем. Размер VG = сумма PV; LV можно растить, пока в VG есть свободное место.
Создание тома с нуля
# 1. Помечаем физические диски как PV
sudo pvcreate /dev/sdb /dev/sdc
# 2. Собираем из них группу томов vg_data
sudo vgcreate vg_data /dev/sdb /dev/sdc
# 3. Нарезаем логический том на 50 ГБ
sudo lvcreate -L 50G -n lv_db vg_data
# 4. Создаём файловую систему и монтируем
sudo mkfs.ext4 /dev/vg_data/lv_db
sudo mkdir -p /var/lib/db
sudo mount /dev/vg_data/lv_db /var/lib/db
Обзорные команды для каждого уровня — pvs, vgs, lvs (кратко) и pvdisplay/vgdisplay/lvdisplay (подробно):
sudo vgs
# VG #PV #LV #SN Attr VSize VFree
# vg_data 2 1 0 wz--n- <1.95t <1.90t
Расширение тома на лету
Главная суперсила LVM. Допустим, lv_db заполнился, а в группе vg_data есть свободное место. Увеличиваем том и — обязательно! — следом растягиваем файловую систему:
# увеличить логический том ещё на 20 ГБ
sudo lvextend -L +20G /dev/vg_data/lv_db
# растянуть ext4 ПОД новый размер тома (онлайн, без размонтирования)
sudo resize2fs /dev/vg_data/lv_db
Удобный приём: lvextend -r делает оба шага сразу (растит том и ФС). Если свободного места в VG нет — сначала добавляем в группу новый диск, и пул мгновенно вырастает:
sudo pvcreate /dev/sdd
sudo vgextend vg_data /dev/sdd # VG стал больше — теперь есть куда расти LV
Это и есть ответ на «диск кончился»: добавить накопитель в пул и расширить нужный том, не трогая данные и не перезагружаясь.
Снапшоты
Снапшот — «фотография» тома на момент времени. LVM создаёт его мгновенно и почти без затрат места: снапшот хранит лишь те блоки, которые ИЗМЕНИЛИСЬ в оригинале после его создания (механизм copy-on-write).
# снять снапшот перед рискованным обновлением БД
sudo lvcreate -L 5G -s -n db_snap /dev/vg_data/lv_db
# ... выполняем миграцию; если всё сломалось — откатываемся:
sudo umount /var/lib/db
sudo lvconvert --merge /dev/vg_data/db_snap # вернуть том к состоянию снапшота
Размер снапшота (-L 5G) — это запас под изменившиеся блоки, а не копия всего тома. Если изменений окажется больше запаса, снапшот переполнится и станет недействительным, поэтому его не держат месяцами — это инструмент на время операции или бэкапа.
Как это работает под капотом
LVM разбивает всё пространство VG на одинаковые кусочки — extents (физические PE на дисках, логические LE на томах). Логический том — это просто упорядоченный список физических extents, возможно, с РАЗНЫХ дисков. Поэтому том может быть больше любого отдельного диска и расти, пока в пуле есть свободные extents: lvextend лишь добавляет тому новые куски из общего котла, не двигая данные. Снапшот же создаёт отдельный том под «изменённые» блоки: при первой записи в исходный том старая версия блока сначала копируется в снапшот (copy-on-write), и так снапшот всегда отражает исходное состояние. Все эти отображения LVM хранит в метаданных на самих PV, поэтому конфигурация переживает перенос дисков на другую машину.
Частые ошибки
- Расширить LV и забыть про
resize2fs. Том стал больше, а файловая система — нет; место «не появилось». Растите ФС следом (или используйтеlvextend -r). - Уменьшать том «горячим». Сжатие (
lvreduce) опаснее роста: ФС нужно ужать ПЕРЕД томом и обычно при размонтировании, иначе данные за новой границей будут потеряны. Всегда делайте бэкап. - Забытый снапшот. Переполнившийся снапшот «ломается», а активный снапшот замедляет запись в исходный том (каждая запись = copy-on-write). Удаляйте после использования:
lvremove. - Думать, что LVM заменяет бэкап. Снапшот живёт на том же физическом диске; гибель диска уносит и том, и снапшот. Это инструмент отката, а не резервная копия.
LVM против обычных разделов
| Аспект | Обычные разделы | LVM |
| Изменение размера | сложно, рискованно, часто требует размонтирования | расширение на лету одной командой |
| Несколько дисков как один том | нет (без RAID) | да, том охватывает много PV |
| Снапшоты | нет | да, мгновенные copy-on-write |
| Простота | проще, меньше слоёв | чуть сложнее, нужен LVM-инструментарий |
Итоги
- LVM — слой между дисками и ФС: PV (диск/раздел) → VG (пул) → LV (гибкий том под файловую систему).
- Том расширяется на работающей системе:
lvextend+resize2fs(илиlvextend -r); кончился пул — добавьте PV черезvgextend. - Снапшоты (
lvcreate -s) — мгновенные copy-on-write «фотографии» для безопасных обновлений и согласованных бэкапов, но не замена резервной копии. - В сравнении с обычными разделами LVM даёт гибкость размеров, объединение дисков и снапшоты ценой небольшого усложнения.