В инфраструктуре есть вещи вечные:

  • разработчики, которые «ничего не меняли»;
  • мониторинг, начинающий орать в пятницу вечером;
  • и расширение дисков в виртуалках.

На первый взгляд операция простая. На практике - кто-то забывает про pvresize, кто-то расширяет не тот раздел, а кто-то внезапно обнаруживает, что внутри виртуальной машины XFS, а не ext4. И вот уже вместо «5 минут работы» начинается археология Linux-разделов.

Оставлю нормальную современную шпаргалку по увеличению дисков в Proxmox, с пояснениями, примерами и подводными камнями.

Как вообще устроено расширение диска

Когда вы увеличиваете диск виртуальной машины в Proxmox - это только первый этап.

На самом деле процесс состоит из нескольких уровней:

Proxmox disk
    ↓
Partition (/dev/sda1)
    ↓
LVM Physical Volume (PV)
    ↓
Volume Group (VG)
    ↓
Logical Volume (LV)
    ↓
Filesystem (ext4/xfs)

И увеличить нужно все уровни последовательно.

Потому что Linux не умеет читать мысли администратора.
Пока не скажешь pvresize - LVM будет делать вид, что нового места не существует.

Вариант 1. Увеличение существующего LVM-диска

Шаг 1. Увеличиваем диск в Proxmox

Можно через веб-интерфейс:

VM -> Hardware -> Hard Disk -> Disk Action -> Resize

Либо через консоль гипервизора:

qm resize <vmid> <disk> <size>

Пример:

qm resize 100 virtio0 +5G

Что происходит:

  • VM ID = 100
  • диск = virtio0
  • добавляем +5G

После этого гипервизор увеличит виртуальный диск.

Но внутри Linux пока ничего не изменится.

Шаг 2. Проверяем, что ОС увидела новый размер

Заходим в виртуальную машину:

lsblk

или:

fdisk -l

Пример:

fdisk -l /dev/sda

Вы должны увидеть:

  • новый размер диска;
  • старые разделы;
  • свободное место после раздела.

Например:

Disk /dev/sda: 100 GiB

/dev/sda1  95G

Хотя диск уже 100G - раздел всё ещё 95G.

Типичная ситуация.

Шаг 3. Расширяем раздел

Самый удобный способ - cfdisk.

cfdisk /dev/sda

Дальше:

Выбираем partition

-> Resize
-> Enter
-> Write
-> yes
-> Quit

Важно

Если это системный диск:

  • внимательно смотрим номер раздела;
  • не удаляем EFI;
  • не трогаем boot-разделы.

Иначе Linux внезапно превращается в тыкву.

Проверяем результат

lsblk

Теперь раздел должен стать больше.

Например:

sda      100G
└─sda3   100G

Шаг 4. Расширяем Physical Volume (PV)

Теперь нужно сообщить LVM, что раздел стал больше.

pvresize /dev/sda3

Проверяем:

pvdisplay

Или:

pvs

Теперь PV должен показывать новый размер.

Шаг 5. Проверяем свободное место в Volume Group

vgdisplay

или:

vgs

Ищем:

Free  PE / Size

Если свободное место появилось - всё хорошо.

Шаг 6. Расширяем Logical Volume

Проверяем LV:

lvs

Пример:

/rootvg/rootlv

Расширяем на всё свободное место:

lvextend -r -l +100%FREE /dev/VolumeGroup/lv

Например:

lvextend -r -l +100%FREE /dev/vg0/root

Что делает ключ

-r

Очень полезная штука. Он автоматически вызывает resize filesystem. То есть: LV увеличился + Filesystem увеличилась. Одной командой.

Современные админы любят автоматизацию. Старые админы любят сначала сделать snapshot. Оба подхода правильные.

Шаг 7. Расширяем файловую систему вручную (если нужно)

Для ext4:

resize2fs /dev/VolumeGroup/lv

Для XFS:

xfs_growfs /

Или:

xfs_growfs /mountpoint

Важно про XFS

XFS:

  • умеет только расширение;
  • не умеет уменьшение.

Вообще. Никак. Поэтому перед экспериментами с XFS лучше думать заранее, а не после.

Финальная проверка

df -h

И:

lsblk

Пример:

Filesystem                 Size  Used Avail Use%
/dev/mapper/vg0-root        95G   20G   70G

Теперь место появилось. Мониторинг временно перестал вас ненавидеть.

Быстрый сценарий для ext4 + LVM

Если всё стандартно:

qm resize 100 virtio0 +10G
cfdisk /dev/sda
pvresize /dev/sda3
lvextend -r -l +100%FREE /dev/vg0/root

Практически «боевой набор» любого DevOps/SRE.

Увеличение диска БЕЗ LVM

Иногда встречаются древние системы без LVM. Да, такие ещё живы.

Расширяем обычный раздел

fdisk /dev/sda

Дальше:

p
d
n
enter
enter
enter
w

Что здесь происходит

Фактически:

  1. удаляем раздел;
  2. создаём заново;
  3. с тем же началом;
  4. но с новым размером.

Данные не пропадают, если:

  • стартовый сектор совпадает;
  • руки не дрожат.

После этого

Для ext4:

resize2fs /dev/sda1

Проверяем:

df -h

Расширение LVM новым диском

Это уже более «правильный» серверный подход.

Особенно:

  • базы данных;
  • файловые хранилища;
  • системы с высокими IO;
  • когда не хочется трогать основной диск.

Шаг 1. Добавляем новый диск в VM

Через Proxmox:

VM -> Hardware -> Add -> Hard Disk

Например появился:

/dev/sdf

Проверяем:

fdisk -l

Шаг 2. Создаём раздел

fdisk /dev/sdf

Дальше:

n
enter
enter
enter
t
8e
w

Что такое 8e

Это тип раздела Linux LVM. На GPT-дисках через gdisk/parted это уже не так критично, но старая школа всё ещё помнит магическое 8e.

Шаг 3. Создаём Physical Volume

pvcreate /dev/sdf1

Проверяем:

pvs

Шаг 4. Добавляем диск в Volume Group

Смотрим список VG:

vgs

Добавляем:

vgextend VGS_NAME /dev/sdf1

Например:

vgextend vgdata /dev/sdf1

Шаг 5. Расширяем Logical Volume

Смотрим LV:

lvs

Пример:

/dev/mapper/db--vg-pgdata

Расширяем:

lvextend -l +100%FREE /dev/mapper/db--vg-pgdata

Шаг 6. Расширяем файловую систему

ext4:

resize2fs /dev/mapper/db--vg-pgdata

XFS:

xfs_growfs /pgdata

Проверяем

df -h

Полезные команды, которые реально спасают

Смотреть структуру дисков

lsblk

Смотреть UUID и filesystem

blkid

Смотреть LVM

pvs
vgs
lvs

Смотреть filesystem

df -hT

Частые проблемы

pvresize не видит место

Обычно:

  • раздел не расширен;
  • kernel не перечитал partition table.

Помогает:

partprobe

или:

reboot

Да, иногда «выключить и включить» всё ещё работает лучше любой магии.

resize2fs: Bad magic number

Обычно filesystem не ext4.

Проверяем:

df -T

Может оказаться XFS.

XFS не растёт

Нужно расширять mountpoint:

Неправильно:

xfs_growfs /dev/mapper/vg0-root

Правильно:

xfs_growfs /

GPT vs MBR

Если диск больше 2 ТБ:

  • используйте GPT;
  • MBR упрётся в лимиты;
  • fdisk может начать грустить.

Современный вариант:

parted

или:

gdisk

Production-рекомендации

Делайте snapshot

Перед любыми операциями.

Особенно:

  • базы данных;
  • production;
  • legacy;
  • «тот сервер никто не трогал 7 лет».

Не расширяйте всё впритык

Оставляйте запас в VG.

Это очень удобно:

  • для snapshot;
  • rollback;
  • временных операций;
  • emergency resize.

Следите за inode

Иногда место есть.

А файлы создать нельзя.

Потому что inode закончились.

Проверка:

df -i

Для баз данных лучше отдельный диск

Особенно:

  • PostgreSQL;
  • MySQL;
  • ClickHouse;
  • Ceph.

Так проще:

  • мигрировать;
  • расширять;
  • мониторить;
  • делать IO tuning.

Итог

Расширение диска в Linux - это не одна операция, а цепочка действий:

Disk -> Partition -> PV -> VG -> LV -> Filesystem

И если забыть хотя бы один этап - место «как бы есть», но его «как бы нет». А потом начинается любимая игра всех администраторов:

Почему df показывает старый размер?!

И да - lsblk, pvs, vgs, lvs и df -h должны стать вашими лучшими друзьями в такие моменты.