LVM в Linux: как создать тома и расширить раздел без переустановки
LVM в Linux объединяет диски в общий пул, из которого нарезаются логические тома, и позволяет менять их размер на работающей системе. Чтобы расширить LVM раздел, обычно хватает одной команды lvextend -r -l +100%FREE, если в группе есть свободное место. Ниже разобраны все три слоя, команды по сценариям и подводные камни при уменьшении.

Содержание
Три слоя LVM: физические тома, группы и логические тома
LVM (Logical Volume Manager) ставит прослойку между дисками и файловыми системами. Вместо того чтобы жёстко резать диск на разделы, вы собираете из дисков общий пул места и нарезаете из него тома нужного размера. Тома потом можно растить, уменьшать, переносить на другой диск и снимать с них снимки, не переразмечая диск заново.
- PV, physical volume - физический том. Целый диск или раздел, помеченный для LVM командой
pvcreate. - VG, volume group - группа томов. Пул, в который входят один или несколько PV. Место в нём делится на экстенты, по умолчанию по 4 МиБ.
- LV, logical volume - логический том. Кусок группы, на котором уже создаётся ext4, XFS или Btrfs. Для системы он выглядит как обычное блочное устройство
/dev/группа/томили/dev/mapper/группа-том.
LVM по умолчанию используют серверный установщик Ubuntu, Fedora Server, RHEL и его клоны. Ubuntu Desktop и Linux Mint включают его, если выбрать шифрование диска. Пакет везде называется lvm2: sudo apt install lvm2, sudo dnf install lvm2, sudo pacman -S lvm2.
Как посмотреть текущую схему LVM
Перед любыми изменениями соберите картину. Три коротких команды показывают все три слоя, по строке на объект:
sudo pvs # физические тома и сколько на них свободно
sudo vgs # группы: колонка VFree - нераспределённое место
sudo lvs # логические тома и их размер
lsblk -f # дерево дисков, разделов, томов и файловых систем
df -h / # сколько реально свободно в корне Подробный вывод дают pvdisplay, vgdisplay и lvdisplay, но для работы хватает коротких вариантов. Если с чтением вывода lsblk есть сложности, загляните в статью как посмотреть диски и разделы в Linux.
Частая находка на свежем сервере с Ubuntu: корень заполнен, а в vgs в колонке VFree висят десятки гигабайт. Установщик Ubuntu Server создаёт том ubuntu-lv не на весь диск, а оставляет часть группы свободной. Это не ошибка, а запас, который можно отдать тому одной командой (ниже).
Шпаргалка: команды LVM по слоям
Команды LVM устроены единообразно: префикс показывает слой, суффикс - действие. Запомнив схему, легко угадать нужную.
| Действие | PV | VG | LV |
|---|---|---|---|
| Создать | pvcreate | vgcreate | lvcreate |
| Кратко показать | pvs | vgs | lvs |
| Изменить размер | pvresize | vgextend, vgreduce | lvextend, lvreduce, lvresize |
| Переименовать | нет | vgrename | lvrename |
| Удалить | pvremove | vgremove | lvremove |
| Перенести данные | pvmove | нет | нет |
Размеры задаются двумя способами. -L принимает абсолютное значение в единицах (-L 50G) или прибавку со знаком плюс (-L +20G). -l работает в экстентах и понимает проценты: -l +100%FREE означает "всё свободное место группы".
Как создать LVM на новом диске
Пример: в сервер добавили диск /dev/sdb под данные. Проверьте через lsblk, что это действительно пустой диск, все данные на нём будут уничтожены.
sudo pvcreate /dev/sdb
sudo vgcreate data /dev/sdb
sudo lvcreate -n files -L 200G data
sudo mkfs.ext4 /dev/data/files
sudo mkdir -p /srv/files
sudo mount /dev/data/files /srv/files Специально не забирайте всё место сразу. Оставленный в группе запас пригодится, когда понадобится второй том или снимок. Чтобы том монтировался при загрузке, добавьте строку в /etc/fstab по UUID из blkid, синтаксис и типовые опции разобраны в статье про монтирование дисков и fstab.
Как расширить LVM раздел командой lvextend
Если в группе есть свободное место, расширение тома занимает одну команду и делается прямо на работающей системе, даже для корня. Ключ -r (--resizefs) сразу растягивает файловую систему через fsadm, отдельный resize2fs или xfs_growfs не нужен.
# отдать тому всё свободное место группы
sudo lvextend -r -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
# или добавить конкретный объём
sudo lvextend -r -L +20G /dev/ubuntu-vg/ubuntu-lv
df -h / Ext4 и XFS растут онлайн без размонтирования. Если вы уже расширили том без -r, догоните файловую систему вручную: sudo resize2fs /dev/ubuntu-vg/ubuntu-lv для ext4 или sudo xfs_growfs / для XFS (ей передают точку монтирования). Для Btrfs поверх LVM после lvextend выполните sudo btrfs filesystem resize max /.
Когда свободного места в группе нет
Сообщение Insufficient free space значит, что пул пуст и сначала нужно добавить место в группу. Вариантов два: увеличить существующий диск или подключить новый.
Расширение раздела без переустановки: новый или увеличенный диск
Диск виртуальной машины увеличили в гипервизоре
Ядро увидит новый размер диска, но раздел и физический том останутся старыми. Растяните раздел утилитой growpart, затем PV, затем сам том. В примере PV живёт на третьем разделе /dev/sda3:
sudo apt install cloud-guest-utils # Debian, Ubuntu
sudo dnf install cloud-utils-growpart # Fedora
sudo growpart /dev/sda 3 # номер раздела через пробел
sudo pvresize /dev/sda3
sudo lvextend -r -l +100%FREE /dev/ubuntu-vg/ubuntu-lv Если lsblk показывает старый размер диска, попросите ядро перечитать устройство: echo 1 | sudo tee /sys/class/block/sda/device/rescan. Перезагрузка тоже помогает.
Подключили второй диск
Новый диск становится PV и вливается в существующую группу, после чего том растёт как обычно:
sudo pvcreate /dev/sdc
sudo vgextend ubuntu-vg /dev/sdc
sudo lvextend -r -l +100%FREE /dev/ubuntu-vg/ubuntu-lv Помните, что том, растянутый на два диска без RAID, переживёт смерть любого из них хуже, чем один диск: пропадёт файловая система целиком. Для данных, которые жалко, держите резервную копию.
Уменьшить том или вывести диск из группы
Уменьшение рискованнее расширения, и не все файловые системы его умеют. XFS уменьшить нельзя совсем, только пересоздать. Ext4 уменьшается, но только размонтированной, поэтому для корня загрузитесь с Live USB. Всегда используйте ключ -r, чтобы LVM сначала ужал файловую систему и только потом том:
sudo umount /srv/files
sudo lvreduce -r -L 120G /dev/data/files
sudo mount /dev/data/files /srv/files Если перепутать порядок и урезать том под живой файловой системой, вы отрежете часть данных. Сделайте копию до операции.
Перенос данных со старого диска
Чтобы заменить диск без остановки сервисов, добавьте новый PV в группу, перенесите на него экстенты и исключите старый:
sudo pvcreate /dev/sdd
sudo vgextend data /dev/sdd
sudo pvmove /dev/sdb /dev/sdd
sudo vgreduce data /dev/sdb
sudo pvremove /dev/sdb pvmove на больших дисках идёт часами, но работает в фоне при смонтированных томах и продолжится после перезагрузки.
Снимки LVM перед рискованными изменениями
Снимок фиксирует состояние тома на момент создания и хранит только изменённые блоки. Под него нужен запас в группе: размер снимка - это сколько изменений он сможет вместить.
sudo lvcreate -s -L 10G -n root-before-upgrade ubuntu-vg/ubuntu-lv
sudo lvs # колонка Data% показывает заполнение снимка
# откатить том к снимку
sudo lvconvert --merge ubuntu-vg/root-before-upgrade
# или удалить снимок, если всё прошло хорошо
sudo lvremove ubuntu-vg/root-before-upgrade Слияние с используемым томом, например с корнем, выполнится при следующей активации, то есть после перезагрузки. Если снимок заполнится на 100%, он станет недействительным, поэтому не держите классические снимки неделями, они ещё и замедляют запись. Для регулярных снимков системы удобнее Btrfs, это описано в статье про снимки Btrfs и Snapper.
Перед обновлением дистрибутива на сервере с LVM сделайте снимок корня на 10-20 ГБ. Если после перезагрузки что-то сломалось, lvconvert --merge и ещё одна перезагрузка вернут систему за пару минут, без восстановления из бэкапа.
Если LVM не видно или том не активируется
С Live USB тома LVM не всегда активируются сами. Найдите и включите их вручную, затем монтируйте как обычно:
sudo vgscan
sudo vgchange -ay
sudo lvs
sudo mount /dev/ubuntu-vg/ubuntu-lv /mnt Если группа лежит внутри зашифрованного раздела, сначала откройте контейнер командой sudo cryptsetup open /dev/nvme0n1p3 cryptroot, и только потом LVM увидит физический том. Подробнее о шифровании и заголовках LUKS в статье шифрование LUKS.
Предупреждение Couldn't find device with uuid появляется, когда из группы пропал один из дисков. Не запускайте vgreduce --removemissing сразу: сначала проверьте кабель, порт и вывод dmesg. Удаление отсутствующего PV необратимо выбрасывает тома, которые на нём лежали. Справочник по всем командам есть в статье LVM на ArchWiki и в man-страницах lvm(8).
Частые вопросы
Можно ли расширить корневой LVM том без перезагрузки?
Да. Ext4 и XFS увеличиваются онлайн: lvextend -r растянет и том, и файловую систему прямо на работающей системе.
Почему lvextend пишет Insufficient free space?
В группе томов нет свободных экстентов. Проверьте vgs: если VFree равно нулю, сначала увеличьте раздел и выполните pvresize или добавьте новый диск через vgextend.
Можно ли уменьшить XFS на LVM?
Нет, XFS не поддерживает уменьшение. Придётся скопировать данные, пересоздать том меньшего размера и вернуть данные обратно.
Нужен ли LVM на домашнем компьютере?
Не обязателен. Он полезен, если вы шифруете диск, часто меняете разметку или собираете место с нескольких дисков. Для одного SSD и снимков системы многим удобнее Btrfs.
Чем -L отличается от -l в lvextend?
-L задаёт размер в байтовых единицах, например -L +20G, а -l в экстентах или процентах, например -l +100%FREE.
Документация и источники
Читайте также
- Посмотреть диски и разделы в Linux: lsblk, fdisk -l и проверка SMART
- Монтирование дисков в Linux: от mount до автомонтирования в fstab
- Шифрование диска LUKS в Linux без риска потерять данные
- Разметка диска в Linux: какие разделы нужны и какую ФС выбрать
- Снимки Btrfs со Snapper: настройка и восстановление системы
Команды проверены на актуальных версиях дистрибутивов на момент обновления. Перед изменением системных настроек сделайте резервную копию.