LinuxRuLinux без лишней теории
Диски и LVM

LVM в Linux: как создать тома и расширить раздел без переустановки

Редакция LinuxRu7 мин чтенияИнструкции

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

LVM в Linux: как создать тома и расширить раздел без переустановки
Фото: Christian Jansky, CC BY-SA 3.0, Wikimedia Commons
Содержание
  1. Как устроен LVM
  2. Что уже есть
  3. Шпаргалка команд
  4. Создание с нуля
  5. Расширить том
  6. Добавить место в группу
  7. Уменьшение и замена диска
  8. Снимки LVM
  9. Ошибки и Live USB
  10. Частые вопросы

Три слоя 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 устроены единообразно: префикс показывает слой, суффикс - действие. Запомнив схему, легко угадать нужную.

ДействиеPVVGLV
Создатьpvcreatevgcreatelvcreate
Кратко показатьpvsvgslvs
Изменить размерpvresizevgextend, vgreducelvextend, lvreduce, lvresize
Переименоватьнетvgrenamelvrename
Удалитьpvremovevgremovelvremove
Перенести данные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.

Документация и источники

Читайте также

Команды проверены на актуальных версиях дистрибутивов на момент обновления. Перед изменением системных настроек сделайте резервную копию.