Добавляем диск в lvm без перезагрузки виртуальной машины

Edit...
OS
Illustrated by Igan Pol

Привет, %username%! Есть такая непередаваемая боль, как “заканчивается место на разделе”. Давайте рассмотрим как это провернуть на боевом сервере без остановки/перезагрузки и вообще сделаем красиво. Сразу скажу, что тут ничего сложного и с этим сможет справиться любой.

🔄 Обновлено 2026-08-09. Пост писался под CentOS 7, который EOL с 30 июня 2024. Вся последовательность работает на Rocky Linux и AlmaLinux без изменений, а вот последняя команда зависит от файловой системы: resize2fs подходит только для ext4, для XFS нужен xfs_growfs — а XFS как раз стоит по умолчанию в EL7 и новее. Разбор в разделе «Расширяем файловую систему». Плюс добавил заметку про то, что раздел на диске можно вообще не создавать.

Что имеем#

Немного вводной информации для понимания. Есть виртуальная машина на базе CentOS с дисковым пространством на 6.5ТБ (несколько дисков которые лежат на СХД). ОС установлена на LVM. Есть группа дисков огромным объёмом для хранения загружаемых пользователями файлов. Задача стоит такая: расширить раздел для пользовательских загрузок.

Заставляем систему увидеть новый диск#

Приступим к самому простому варианту. Добавим диск и расширим volume group. Для начала надо подключиться к vCentre/vSphere Client и добавить новый диск (не буду показывать как это делается, потому что это просто). Далее после добавления диска в виртуальную машину нам надо заставить увидеть её этот новый диск. Провреяем сколько у нас сейчас свободного места на разделах:

df -h

После посмотрим какие диски присутствуют в системе:

fdisk -l

Заставим виртуалку просканировать устройства:

ls -la /sys/class/scsi_host/
echo - - - > /sys/class/scsi_host/host0/scan
echo - - - > /sys/class/scsi_host/host1/scan
echo - - - > /sys/class/scsi_host/host2/scan
echo - - - > /sys/class/scsi_host/host3/scan

Количество host# у вас может отличаться - у меня их четыре как видно из примера выше. Далее проверяем как называется наш новый диск и появился ли он вообще:

fdisk -l

Вместо перебора всех host# руками из пакета sg3_utils есть готовый скрипт, который делает то же самое одной командой:

rescan-scsi-bus.sh -a

А смотреть на диски удобнее через lsblk — он сразу показывает дерево с разделами, LVM и точками монтирования:

lsblk

Создаём раздел и physical volume#

Далее мы добавляем на наш новый диск раздел (у меня это пусть будет sdd):

# fdisk /dev/sdd

Теперь перед нами консольная утилита для работы с дисками. Помощь вызывается по команде m. Мы же набираем команду p для просмотра текущих настроек диска. Потом добавляем новый раздел на диск командой n, после чего соглашаемся со всеми дефолтными значениями. Так же мы можем выбрать тип диска Linux LVM используя команду t или оставить по дефолту всё как есть. И закончив все настройки запишем их на диск командой w.

Теперь можно и расширять дисковое пространство, вот таким образом:

pvdisplay
pvcreate /dev/sdd1
pvdisplay

Тут есть нюанс, о котором я тогда не написал: раздел на диске можно вообще не создавать. LVM спокойно принимает под physical volume целое блочное устройство:

pvcreate /dev/sdd
vgextend scan_volume /dev/sdd

Для дисков, которые целиком отдаются под LVM, так даже лучше: не надо возиться с fdisk, а при последующем расширении самого диска на стороне СХД не придётся ещё и двигать границу раздела. Единственное, ради чего стоит оставить раздел, — чтобы человек, посмотревший на диск через fdisk -l, сразу видел метку Linux LVM и не решил, что диск пустой.

Расширяем volume group и логический том#

Посмотрели на диски и увидели какой куда подключен. Далее посмотрим список volume group:

vgs

Посмотрели список volume group и выбрали тот который нам нужен. Теперь добавляем туда наш диск и расширяем объём на размер этого диска:

vgextend scan_volume /dev/sdd1
lvextend -l+100%FREE /dev/scan_volume/lv
resize2fs /dev/scan_volume/lv
df -h

Расширяем файловую систему#

Последняя команда в блоке выше — та самая, где легко получить Bad magic number in super-block. resize2fs умеет только семейство ext2/ext3/ext4. Если файловая система XFS, а это дефолт в RHEL 7 и всех потомках, включая CentOS 7, Rocky и Alma, нужна другая утилита:

# сначала смотрим, что у нас вообще за ФС
lsblk -f
# или
findmnt -no FSTYPE /mount/point
# ext4
resize2fs /dev/scan_volume/lv

# xfs — обрати внимание: аргумент это точка монтирования, а не устройство
xfs_growfs /mount/point

Две вещи про XFS, которые стоит знать заранее. Расширять её можно только на смонтированной файловой системе — в этом плане она удобнее ext4. А вот уменьшить XFS нельзя вообще никак, только пересоздать и залить из бэкапа, так что с lvextend лучше не промахиваться в большую сторону, если место потом понадобится вернуть.

Всё это, кстати, можно сделать одной командой: lvextend умеет сам растянуть файловую систему нужной утилитой:

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

Флаг -r (--resizefs) вызывает resize2fs или xfs_growfs в зависимости от того, что там на самом деле. Это и короче, и безопаснее, чем помнить правильную утилиту.

Посмотрев на результаты скромного труда можем довольные налить чаю и отдохнуть. На этом всё!

По соседним темам: если место нужно не под данные, а под подкачку — добавление SWAP в систему; а если раздел живёт на Btrfs, диски туда добавляются своими командами.