Если когда-нибудь приходилось кропотливо передвигать границы разделов на диске, сжимая один и стараясь не повредить соседний, то вы уже знаете, где рождается страх администратора. LVM создан как противоядие от этого ужаса: он прячет грубую механику разделов за аккуратным уровнем абстракции и даёт гибкий «пул» пространства, из которого можно спокойно вырезать логические тома, менять их размер и монтировать куда удобно. В этом материале мы не только разберём концепции, но и развернём маленькую лабораторию, где без риска потренируемся на реальных командах.
Что такое LVM и зачем он нужен
Идея, которая экономит нервы
LVM — это Logical Volume Manager, подсистема управления хранилищем, которая предлагает альтернативу классическим разделам. Вместо того чтобы жёстко делить диск на куски и потом сожалеть о выбранных размерах, вы объединяете носители в общий объём, а затем создаёте логические тома нужной ёмкости прямо поверх этого пула. Когда одна из файловых систем внезапно «выросла», том можно расширить без акробатики с разметкой.
Главная ценность LVM — гибкость. Вы можете добавлять новые устройства, расширять группу томов, быстро перераспределять доступное место и поддерживать аккуратную структуру точек монтирования. Абстракции снимают боль там, где у классических разделов заканчивается комфорт, а риск ошибок только начинается.
Есть нюанс с загрузкой системы: /boot традиционно держат вне логического тома, потому что загрузчики не всегда читают LVM. Самый распространённый GRUB умеет жить рядом с LVM, однако надёжнее оставить /boot на отдельном простом разделе с форматом vfat или ext2/ext4. systemd-boot читает только vfat и тоже не станет вытаскивать ядро из логического тома — это стоит иметь в виду при планировании.
Архитектура: PV, VG и LV без заумных слов
В LVM всё крутится вокруг трёх сущностей. Physical Volume (PV) — это «строительный кирпич», то есть реальное устройство или раздел, который мы инициализировали для LVM. Volume Group (VG) — общий бассейн, куда складываются такие кирпичи; объём группы равен сумме доступных физических томов. Logical Volume (LV) — тот самый «раздел нового времени», который создаётся внутри группы и затем форматируется в ext4, XFS или что угодно, после чего монтируется как обычно.
Если провести аналогию с классической разметкой, LV напоминает раздел, а VG — это условный «диск», только гибкий и расширяемый. PV прямого аналога не имеет: это подготовленная для LVM поверхность, которой может быть целый диск или его часть. Вся магия масштабирования происходит именно между PV и VG, а конечный пользователь работает с LV как с привычным блочным устройством.
Подготовка лаборатории: Vagrant + VirtualBox
Лучше всего учиться на практике, но без риска для рабочих данных. Поэтому соберём мини-стенд в виртуальной машине. В качестве базы подойдёт Vagrant с провайдером VirtualBox: он быстро поднимает окружение и так же быстро его уничтожает после экспериментов. Мы создадим ВМ с несколькими дополнительными дисками по 5 ГБ, чтобы имитировать независимые носители.
Создайте каталог и положите туда файл Vagrantfile со следующим содержимым. Он разворачивает Ubuntu 20.04 и добавляет три диска:
Vagrant.configure "2" do |config| config.vm.box = "ubuntu/focal64" config.vm.hostname = "lvm" 3.times {|i| config.vm.disk :disk, size: "5GB", name: "drive-#{i}"} config.vm.provider :virtualbox do |machine| machine.memory = 1024 machine.cpus = 1 machine.customize ["modifyvm", :id, "--cpuexecutioncap", "50"] end end # vi: set ft=ruby
Перед запуском установите Vagrant и VirtualBox, затем включите экспериментальную поддержку дисков и поднимите машину из каталога с Vagrantfile:
export VAGRANT_EXPERIMENTAL=disks vagrant up vagrant ssh
Внутри гостя убедитесь, что дополнительные устройства видны системе. Команда lsblk -o name,size,fstype
покажет список; в нашем примере мы увидим базовый диск sda
с корневым разделом и три «чистых» диска sdc
, sdd
, sde
, на которых и будем тренироваться. Закончив, вернитесь в каталог проекта и аккуратно уничтожьте ВМ командой vagrant destroy
, чтобы не оставлять хвостов.
Физические тома (PV): инициализация, инвентаризация, очистка
Первый шаг в LVM — подготовить носители. PV — это поверхность, с которой менеджер будет работать дальше. Инициализация выполняется командой pvcreate
и занимает секунды. На этом этапе мы ничего не форматируем «под файловую систему», мы лишь помечаем устройство как пригодное для объединения в группу томов.
Для демонстрации возьмём чистый диск /dev/sdc
и превратим его в PV одной командой: sudo pvcreate /dev/sdc
. Утилита запишет служебную метку и вернёт подтверждение. После этого можно заняться /dev/sdd
: разделим его пополам любым удобным инструментом — fdisk
, cfdisk
или parted
— и инициализируем обе половины одним вызовом: sudo pvcreate /dev/sdd1 /dev/sdd2
.
Инвентаризация проводится утилитами pvscan
, pvs
и pvdisplay
. Первая быстро подсчитывает суммарную ёмкость и показывает, какие устройства ещё никуда не включены. Вторая выводит компактную таблицу с размерами и свободным пространством. Третья раскрывает полную карточку каждого PV с UUID, количеством физических экстентов и статусом выделения. Этого достаточно, чтобы понять, чем уже можно оперировать.
Иногда требуется «обнулить» подготовку и вернуть устройство к исходному состоянию. Для этого служит pvremove
, который стирает LVM-метки на выбранном носителе. Команда уместна, когда вы передумали включать раздел в группу или собираетесь заново разметить диск по другой схеме.
Важное предупреждение: все действия с PV потенциально разрушительны для находящихся там данных. В лаборатории ошибки простительны, в продакшене — нет. Если устройство уже находится в группе и поддерживает активные логические тома, очистка через pvremove
не пройдёт: сначала придётся корректно переместить данные и исключить носитель из пула.
Группы томов (VG): пулы, расширение, сокращение, удаление
Группа томов — это суммарный бассейн, куда складываются подготовленные PV. Создание происходит командой vgcreate
: сначала имя будущего пула, затем список физических томов. Например, sudo vgcreate lvm_tutorial /dev/sdc /dev/sdd1
соберёт два устройства в единое пространство. С этого момента свободная ёмкость VG равна сумме доступных блоков на входящих PV, с учётом служебных экстентов.
Проверять состояние удобно через три знакомых имени: vgs
, vgscan
и vgdisplay
. Короткий отчёт vgs
покажет число физических и логических томов, общий размер и остаток незанятого места. vgscan
подтверждает наличие пула в системе, а подробный vgdisplay
раскрывает параметры экстентов и текущую последовательность метаданных. Этого набора достаточно для быстрой диагностики.
Хорошая новость: группы масштабируются на лету. Добавить носители в пул поможет vgextend
. Если вы ранее удалили LVM-метку с раздела, расширение само переинициализирует устройство и включит его в состав. Команда вида sudo vgextend lvm_tutorial /dev/sdd2
увеличит общий объём VG и подготовит почву для роста логических томов.
Иногда требуется, наоборот, уменьшить пул, вытащив из него одно или несколько устройств. Это задача для vgreduce
. Однако тут есть важное условие: на исключаемом PV не должно оставаться выделенных экстентов, принадлежащих каким-то LV. Если они есть, сперва выполняют миграцию данных командой pvmove
, и только затем сокращают группу. Такой порядок сохраняет целостность и избавляет от простоев.
Список устройств, входящих в конкретную VG, удобно извлечь через фильтры: sudo pvdisplay -S vgname=lvm_tutorial -C -o pv_name
перечислит задействованные носители. Аналогично можно быстро получить их количество или объём свободного места. Эти короткие команды помогают автоматизировать процедуры обслуживания и контролировать состояние пула в скриптах.
Полное удаление группы выполняется vgremove
, но применять её стоит только после того, как все логические тома деактивированы и стерты. Иначе утилита просто откажется работать. В лаборатории можно смело экспериментировать, в рабочей среде — следовать чёткому чек-листу: размонтировать, отключить сервисы, деактивировать LV, удалить LV, сократить VG, очистить PV.
Логические тома (LV): создание, файловые системы, монтирование, изменение размера, удаление
Логический том — главный объект ежедневной работы. На уровне операционной системы он выглядит как обычное блочное устройство по пути /dev/<VG>/<LV>
, которое можно форматировать, проверять и монтировать как привычный раздел. Создание происходит командой lvcreate
, где указывается размер и имя, а также базовая группа, из которой берутся экстенты.
Простой пример: sudo lvcreate -L 5G -n lv1 lvm_tutorial
выделит пятигигабайтный том внутри пула lvm_tutorial
. Дальше — обычная рутина: форматируем в ext4 через sudo mkfs.ext4 /dev/lvm_tutorial/lv1
и монтируем в систему, например, командой sudo mount -t ext4 /dev/lvm_tutorial/lv1 /mnt
. С этого момента каталог /mnt
получает собственную файловую систему, а любые операции внутри идут поверх LV.
Состояние логических томов удобно смотреть утилитами lvs
и lvdisplay
. Первая выдаёт компактную таблицу с размерами, атрибутами и объёмом свободных экстентов. Вторая показывает развёрнутую метаинформацию, включая путь к устройству и статус. Для массовых проверок подойдут селекторы и вывод отдельных колонок; так проще склеивать командные цепочки.
Сильная сторона LVM — динамическое изменение размеров. Увеличить том можно через lvextend
или универсальную lvresize
. Подход с «плюсом» указывает добавочный объём, а не итоговый размер. Например, sudo lvresize -L +2G lvm_tutorial/lv1
расширит существующий том на 2 ГБ. Далее необходимо подогнать файловую систему: для ext4 это sudo resize2fs /dev/lvm_tutorial/lv1
. На современных системах ext4 и XFS умеют расширяться «на горячую», то есть без размонтирования.
Уменьшение требует аккуратности. Здесь порядок обратный: вначале сокращаем файловую систему специализированным инструментом (для ext4 — resize2fs
с указанием меньшего размера и предварительным снятием точки монтирования), затем уменьшаем сам LV через lvreduce
или lvresize
с «минусом». Нарушение последовательности чревато потерей данных, поэтому на боевых системах обязательно делают резервные копии и проверяют наличие свободного места для переносов.
Удаление логического тома предельно прямолинейно: размонтировать, убедиться в отсутствии открытых файлов, затем выполнить sudo lvremove lvm_tutorial/lv1
и подтвердить действие. LVM очистит метаданные и вернёт экстенты в пул группы, откуда их можно будет выдать другим томам. Такой цикл позволяет держать систему в порядке, не накапливая «мертвых» объёмов.
Частый вопрос — какие файловые системы выбирать. Для большинства сценариев достаточно ext4: она надёжна, знакома и дружит с горячим расширением. XFS отлично чувствует себя на крупных объёмах и под интенсивной нагрузкой, но уменьшать её сложно. btrfs умеет собственные снапшоты и RAID-режимы, однако в связке с LVM требует продуманной схемы, чтобы фичи не конфликтовали. В учебной среде лучше остановиться на ext4 и сосредоточиться на логике LVM.
Ещё один практический момент: следите за свободным местом не только в группе, но и в самих файловых системах. Комбинируйте vgs
для оценки пула и df -h
для монтированного каталога, чтобы не упустить ситуацию, когда LV уже расширен, а файловая система ещё не подросла или наоборот.
В завершение хочется оставить одну простую мысль: LVM — это не «магия ради магии», а способ вернуть контроль над дисковым пространством без стрессовых операций с разметкой. Мы разобрали базовые сущности, собрали лабораторию, подготовили физические тома, сформировали группу и поработали с логическим объёмом — от создания до изменения размеров и удаления. Дальше у вас останется сыграть собственную «партию»: добавить ещё один диск, расширить пул, потренироваться с переносом экстентов и отточить рутину до автоматизма. Когда в следующий раз одна из служб потребует пару гигабайт «прямо сейчас», вы просто добавите их командой и спокойно вернётесь к делам.