Когда дисковое пространство заканчивается на работающем сервере, администратор сталкивается с выбором: остановить сервисы для переразметки или использовать инструменты, позволяющие расширить файловую систему на лету. Logical Volume Manager решает эту задачу из коробки. В отличие от классических разделов, логические тома не привязаны к физическим границам диска. Они состоят из экстентов - блоков фиксированного размера, по умолчанию 4 мегабайта. Эта архитектура даёт свободу: новый физический диск добавляется в группу томов, экстенты перераспределяются, а логический том растёт без перезагрузки и без размонтирования. Администратор получает гибкость, которой не существует в схеме с primary и extended разделами MBR или даже GPT без LVM.

Архитектура LVM и подготовка диска

Понимание иерархии - ключ к уверенной работе. Физический том - это блочное устройство (диск, раздел, RAID-массив), инициализированное pvcreate. На нём записывается метка LVM и область метаданных. Группа томов объединяет один или несколько физических томов в единый пул хранилища. Логический том вырезается из этого пула и представляет собой блочное устройство для файловой системы. Экстент - атом распределения. Физические экстенты на PV соответствуют логическим экстентам в LV. Размер экстента задаётся при создании VG ключом -s vgcreate, по умолчанию 4 МБ. Меньший экстент даёт большую гранулярность, но больше метаданных. Для томов под 10 ТБ 4 МБ оптимальны. Для сотен терабайт берут 16 МБ или 32 МБ. Максимальное количество экстентов на LV - 65534 для линейных томов. При 4 МБ это 256 ГБ на сегмент, но линейный том может состоять из нескольких сегментов на разных PV.

Прежде чем расширять группу томов, новый накопитель нужно инициализировать. Команда pvcreate записывает на устройство метку LVM и создаёт область метаданных. По умолчанию первый физический экстент начинается с отступом 1 мегабайт от начала диска - это параметр default_data_alignment в lvm.conf. Если диск уже содержал разделы, pvcreate завершится с ошибкой, если не указать ключ -ff для принудительной перезаписи. Ключ --dataalignment позволяет задать выравнивание под RAID-страйп или SSD erase block. Ключ --metadatasize резервирует место под метаданные VG - актуально для больших групп с множеством томов. pvcreate --metadatasize 16M --dataalignment 1M /dev/sdb создаст PV с расширенной областью метаданных и выравниванием 1 МБ.

Код готов к копированию:

pvcreate /dev/sdb

После инициализации устройство становится физическим томом. Проверить результат можно командой pvs - она покажет имя PV, группу томов (пока пустую), размер, свободное место и атрибуты. Вывод pvs -o +pe_start /dev/sdb подтвердит смещение первого экстента. pvs -o +mda_size покажет размер области метаданных. Если планируется VG с сотнями логических томов, лучше задать --metadatasize 16M при pvcreate. pvscan обновит кэш устройств в /etc/lvm/cache/.lvmcache - полезно после горячего подключения диска.

Добавление физического тома в группу томов

Инициализированный диск не даёт пространства сам по себе - его нужно включить в существующую группу томов. Для этого служит vgextend. Команда принимает имя VG и одно или несколько имён PV. Метаданные группы обновляются, а свободные экстенты нового диска становятся доступными для распределения. vgextend не перемещает существующие данные. Старые логические тома остаются на старых экстентах, новые выделения пойдут на свободные участки нового диска. Это нормальное поведение: данные не мигрируют автоматически при расширении VG. Если нужна балансировка нагрузки - используйте pvmove позже. vgextend vg00 /dev/sdb /dev/sdc добавит два диска за одну операцию.

Код готов к копированию:

vgextend vg00 /dev/sdb

Проверка: vgs vg00 покажет увеличенный размер VG и количество свободных физических экстентов. vgs -o +vg_free_count,vg_extent_count vg00 даст точные цифры. Важно: после vgextend свободные экстенты фрагментированы по двум физическим томам. lvextend по умолчанию использует политику allocation normal - заполняет экстенты последовательно. Ключ --alloc cling пытается продолжать существующие сегменты LV на том же PV. vgdisplay -v vg00 покажет детальную карту: какие PE на каком PV свободны, какие заняты каждым LV. Политика allocation anywhere позволяет размещать экстенты на любом PV без ограничений contiguous.

Расширение логического тома и файловых систем

Теперь у группы томов есть свободные экстенты. Логический том расширяется командой lvextend. Два основных подхода - задать целевой размер явно или забрать всё свободное место. Ключ -L принимает абсолютный размер с суффиксом (G, M, T) или приращение со знаком плюс. Ключ -l работает в экстентах или процентах. Выражение +100%FREE означает "взять все свободные экстенты в VG". Ключ -r или --resizefs - критически важный флаг. Он указывает lvextend автоматически вызвать утилиту расширения файловой системы после увеличения блока. Без -r нужно запускать resize2fs или xfs_growfs отдельно. С флагом -r операция становится атомарной: том расширяется, файловая система растёт за ним, пользователь не замечает паузы.

Код готов к копированию:

lvextend -l +100%FREE /dev/vg00/lv_data

Пример с явным размером и расширением ФС:

lvextend -L +50G -r /dev/vg00/lv_root

После выполнения lvs покажет новый размер LV. Если использовался ключ -r, файловая система уже расширена. df -h подтвердит доступное пространство в точке монтирования. lvs -o +lv_size,seg_size,seg_start,devices покажет карту сегментов - полезно, если LV состоит из нескольких фрагментов на разных PV. lvextend -l +50%FREE -r /dev/vg00/lv_data заберёт половину свободного места. lvextend -L 200G -r /dev/vg00/lv_data установит точный размер 200 ГБ. lvresize работает аналогично lvextend, но также умеет уменьшать - ключ -L -10G сократит том.

Работа с разными файловыми системами: ext4 - самый распространённый выбор для корневых и данных томов. resize2fs работает на смонтированной ФС без простоев. Операция безопасна, но на очень больших томах (десятки терабайт) может занять заметное время - метаданные ext4 обновляются последовательно. ext4 поддерживает онлайн-увеличение и офлайн-уменьшение (после e2fsck). XFS - стандарт в RHEL-подобных дистрибутивах. xfs_growfs требует точку монтирования, а не блочное устройство. Команда xfs_growfs /mnt/data расширит ФС до границ блока. Важно: XFS не поддерживает shrink. Планируя схему, закладывайте запас или используйте thin provisioning. Btrfs и ZFS имеют свои механизмы управления пространством и не требуют LVM для базовых операций. Но в смешанных средах LVM остаётся универсальным слоем под любыми ФС. Для ext4 lvextend -r вызывает resize2fs /dev/vg00/lv_data. Для XFS - xfs_growfs /mountpoint. lvextend определяет тип ФС по суперблоку (blkid). Если ФС не определяется, lvextend -r выдаст предупреждение и расширит только блок. Тогда нужно запустить утилиту вручную. resize2fs -p /dev/vg00/lv_data покажет прогресс-бар. xfs_growfs -d /mnt/data расширит только данные, оставив лог как есть.

Контроль, диагностика и типичные ошибки

Три команды - pvs, vgs, lvs - дают полную картину. Ключ -o позволяет выбрать колонки. Полезные наборы для повседневной работы:

pvs -o +pv_used,pv_pe_count,pv_pe_alloc_count
vgs -o +vg_free_count,vg_extent_count,vg_extent_size
lvs -o +lv_segtype,lv_seg_start,seg_size,devices

vgdisplay -v vg00 покажет карту экстентов: какие PV участвуют в каждом логическом томе. Это помогает понять, на каком физическом диске лежат данные, и планировать миграцию pvmove при замене оборудования. lvs --segments покажет сегменты LV - каждый непрерывный кусок экстентов на конкретном PV. Если сегментов много, производительность может падать из-за поиска головок (на HDD) или лишних операций ядра. pvs --reportformat json удобен для скриптов мониторинга. vgs --units g покажет размеры в гигабайтах вместо человекочитаемого формата. lvs -a покажет скрытые тома - снапшоты, пулы thin, кэш-пулы. pvs -S 'pv_free > 10G' отфильтрует PV с более 10 ГБ свободного места. lvs -S 'lv_attr =~ ^s' покажет только снапшоты.

Распространённые ошибки: забывают про ключ -r и потом не понимают, почему df не показывает новое место. Пытаются уменьшить XFS - операция завершится ошибкой. Запускают lvextend без проверки свободных экстентов в VG - команда сообщит "Insufficient free extents". Используют pvcreate на диске с данными без бэкапа - ключ -ff сотрёт таблицу разделов. lvextend -L +10G на томе с XFS без -r: том вырастет, но ФС останется прежнего размера. xfs_growfs /mountpoint исправит ситуацию, но лучше сразу писать -r. Ошибка новичка: создают VG на одном диске, потом добавляют второй vgextend, но не знают, что данные не перераспределятся сами. pvmove /dev/sda /dev/sdb перенесёт экстенты с первого диска на второй - работает онлайн, но нагружает диски. Запускают pvmove без --atomic - при прерывании часть данных может остаться в процессе. Лучше pvmove --atomic /dev/sda /dev/sdb. Забывают про порядок при уменьшении: сначала ФС (resize2fs), потом LV (lvreduce). При увеличении: сначала LV (lvextend), потом ФС (resize2fs/xfs_growfs). lvextend -r делает это в правильном порядке автоматически.

Планирование, бэкап метаданных и автоматизация

Размер экстента 4 МБ по умолчанию подходит для большинства задач. При создании VG ключ -s позволяет задать другой размер - например, 16 МБ для томов в сотни терабайт, чтобы уменьшить количество метаданных. Но менять размер экстента после создания VG нельзя. Выбор делается один раз на vgcreate. vgcreate -s 16M vg00 /dev/sda создаст VG с экстентом 16 МБ. Максимальный размер LV при 4 МБ экстенте - 16 ТБ (65534 экстента). При 16 МБ - 64 ТБ. При 32 МБ - 128 ТБ. Для современных массивов лучше сразу закладывать 16 МБ.

Thin provisioning - отдельная тема. Тонкие тома позволяют выделять виртуальный размер больше физического. lvcreate -T vg00/thinpool -L 10T -V 100T создаст пул 10 ТБ и тонкий том 100 ТБ. Мониторинг заполнения пула данных критичен: когда физическое место заканчивается, все тонкие тома в пуле замирают с ошибками ввода-вывода. lvs -o +pool_lv,data_percent покажет заполненность. dmeventd с правилами lvm.conf может автоматически расширять пул при достижении порога. lvm.conf: activation/thin_pool_autoextend_threshold = 70, activation/thin_pool_autoextend_percent = 20 - при 70% заполненности пул вырастет на 20%.

LVM автоматически сохраняет копии метаданных в /etc/lvm/archive и /etc/lvm/backup при каждой изменяющей операции. vgcfgbackup vg00 создаст актуальную копию вручную. vgcfgrestore восстановит при потере диска с метаданными. Размер области метаданных задаётся при pvcreate ключом --metadatasize. Для больших VG с множеством томов может понадобиться увеличить этот параметр. vgdisplay vg00 покажет mda_free - свободное место в области метаданных. Если оно близко к нулю, vgextend новых PV может не сработать. Ключ --metadataignore y при pvcreate позволяет исключить диск из хранения копий метаданных - полезно для временных или кэш-устройств. Минимум один PV должен хранить метаданные.

Скрипт на cron, проверяющий df -h и vgs --noheadings -o vg_free, позволяет заранее узнать о нехватке места. Prometheus node_exporter экспортирует метрики lvm_vg_free_bytes, lvm_lv_size_bytes. Правило алерта: vg_free / vg_size < 0.15 - пора заказывать диск. lvextend -l +100%FREE -r можно вызвать из ansible модуля lvol или shell. Важно: ansible модуль lvol поддерживает resizefs: yes - аналог ключа -r.

Пример ansible задачи:

- name: Extend LV and filesystem
  community.general.lvol:
    vg: vg00
    lv: lv_data
    size: 100%FREE
    resizefs: true

Это идемпотентно: повторный запуск не изменит уже расширенный том. systemd-таймер с oneshot-сервисом может запускать расширение по расписанию или при триггере. journalctl -u lvm-extend.service покажет историю операций. Регулярная проверка vgs и df избавляет от ночных сюрпризов.