Блог Расширяем диск на виртуальной машине под управлением CentOS

15 мая 2021

Увеличение дискового пространства на виртуальном сервере оказалось достаточно нетривиальной задачей, поэтому я написал инструкцию для тех, кто сталкивается с этим впервые. В моём случае применяется родительский сервер под управлением Proxmox, на гостевой машине установлен CentOS 7, используется формат образа qcow2. Всё, что описано далее, относится именно к такой конфигурации.

Подготовка

Первым делом необходимо выключить виртуальную машину и определить, где располагается её образ. В моём случае это файл /var/lib/vz/103/vm-103-disk-0.qcow2. Обязательно делаем его резервную копию.

Расширяем образ

Переходим в каталог к нему и с помощью утилиты qemu-img считываем информацию образа.

# qemu-img info vm-103-disk-0.qcow2
Образ объёмом в 251 Гб физически занимает 189 Гб
Образ объёмом в 251 Гб физически занимает 189 Гб

Мы добавим к нему ещё 50 Гб. В этом нам поможет всё та же утилита – выполняем теперь команду resize.

# qemu-img resize vm-103-disk-0.qcow2 +50G

Мы расширили сам образ, но воспользоваться новым местом пока не получится: сама ОС на гостевой машине о произошедшем ещё почти ничего не знает.

Что происходит на виртуальной машине

Теперь мы включаем нашу «виртуалку» и подключаемся к ней по SSH или VNC. Выполняем команду lsblk и видим, что изменения хотя и не применены так, как нам надо, но не прошли незамеченными.

Диск /dev/sda теперь имеет объём 301 Гб. Но файлы мы храним в логическом томе centos-root, который в свою очередь размещён в разделе sda2. Соответственно, нам необходимо сначала расширить раздел sda2, а затем и LVM-раздел centos-root.

Увеличиваем раздел sda2

Время прибегнуть к утилите fdisk и сначала удалить раздел sda2, а затем его пересоздать, но уже в новом объёме. Не беспокойтесь: ваши данные при этом не потеряются.

# fdisk /dev/sda

Утилита сразу предупреждает о том, что все изменения будут применяться условно, а на практике же запишутся только после того, как мы дадим соответствующую команду. Теоретически это должно снизить число ошибок, но вспоминая аксиому Коула, я бы не был в этом так уверен.

Начнём с того, что удалим раздел 2 командой d.

Создаём его заново командой n, используя значения, предлагаемые по умолчанию:

Сохраняем изменения командой w.

Как видно, fdisk сообщил о невозможности перезагрузить таблицу разделов – это нормально. Перезагрузим весь сервер и снова поглядим на вывод lsblk.

Раздел sda2 теперь размером в 300 Гб, как мы рассчитывали Select an Image

Увеличиваем LVM-раздел

На своих серверах я не использую раздел для домашнего каталога, хотя инсталлятор CentOS и предлагает его по умолчанию. Вся информация у меня хранится, как видно, в centos-root. Если у вас разбивка отличается, не забывайте делать на это поправку.

Воспользуемся утилитой lvextend. Если мы хотим, чтобы centos-root занял 100% свободного места, команда должна выглядеть так:

# lvextend -l +100%FREE /dev/mapper/centos-root

И финальный аккорд:

# xfs_growfs /dev/mapper/centos-root

После этого снова запускаем lsblk и видим, что centos-root занял всё доступное место. Диск объёмом в 301 Гб распределён следующим образом: за нашим основным томом 292,1 Гб, ещё 7,9 Гб за разделом centos-swap, ещё 1 Гб «крадёт» системный /boot.