image

Чаще всего задача расширить файловую систему возникает при работе с облачной инфраструктурой. Виртуализация позволяет экономить на дисковом пространстве и выделять его столько, сколько необходимо в конкретный момент. Но простого расширения ресурсов недостаточно, об изменениях необходимо сообщить операционной системе. Сегодня ведущий архитектор #CloudMTS Дмитрий Фисенко в формате пошагового туториала расскажет, как это сделать.

Материал будет интересен начинающим системным администраторам, а также разработчикам, которые хотят ближе познакомиться с файловыми системами.

Подготовительная работа


Мы рассмотрим сценарии с двумя вариантами разметки диска — с использованием LVM и логических разделов, а также без них. Поскольку мы будем работать в облачной среде, где важны доступность и непрерывность сервисов, сфокусируемся на подходах, позволяющих расширить файловую систему без перезагрузки виртуальной машины (хотя сделать это не всегда возможно).

В рамках руководства нам также потребуется утилита growpart. К сожалению, нельзя просто так взять и расширить смонтированную файловую систему. Стандартные утилиты вроде fdisk или GParted предлагают предварительно размонтировать раздел. Вот команды установки growpart для различных семейств Linux-систем:

apt-get install cloud-utils-growpart
yum install cloud-utils-growpart
dnf install cloud-utils-growpart

Также рекомендуем сформировать на виртуальной машине точку восстановления (snapshot) на случай, если что-то пойдет не по плану.

Когда нет LVM


Рассмотрим задачу, когда на диске присутствует два раздела — загрузочный и корневой. Они смонтированы в произвольную точку. Вот как это выглядит в графическом интерфейсе GParted:

image
Расширять будем корневой раздел. Первым делом необходимо увеличить доступный объем жесткого диска через панель управления облачной инфраструктурой #CloudMTS — с 7 до 8 Гбайт.

image
Увеличение диска займет какое-то время, а мы вернемся на тестовый стенд. Отобразим структуру разделов с помощью команды:

parted /dev/sdb/ print free

Параметры print и free отвечают за отображение структуры разделов и неразмеченного пространства.

image
Мы увеличили объем диска, но все равно не видим в выдаче команды parted свободную память. Можно перезагрузить сервер, но мы решили, что по возможности не будем останавливать виртуальную машину. Вместо этого, выполним команду:

echo 1 > /sys/block/sdb/device/rescan


image
Если мы попытаемся снова отобразить структуру разделов командой parted, то увидим предупреждение. Мы используем таблицу разделов в формате GPT. Информация о ней хранится в начале и в конце диска (для резервирования). Когда мы увеличили объем физического накопителя, сменился конец адресного пространства. Система предлагает автоматически переместить резервные файлы. Соглашаемся и пишем в командной строке fix.

image
Появилось свободное дисковое пространство в размере одного гигабайта:

image
Прежде чем перейти к расширению файловой системы, необходимо разметить новое пространство и расширить сам раздел. Здесь нам пригодится утилита growpart — выполним команду:

growpart /dev/sdb 2


image
Мы расширили раздел, но файловая система осталась нетронутой. Вот как это выглядит в GParted:

image
Давайте расширим ФС командой resize2fs. Если у вас xfs, то нужно указывать точку монтирования. В случае с ext2, ext3 и ext4 достаточно выполнить команду с указанием блочного устройства, которое монтируется в файловую систему. Мы используем ext4, поэтому выполним:

resize2fs /dev/sdb2

Таким образом, мы успешно расширили файловую систему до размера диска.

image
Теперь рассмотрим другую ситуацию, когда ФС находится в логическом диске, созданном в расширенном разделе. Так структура выглядит в древовидном формате:

image
У нас два основных раздела — sdc1 и sdc2. Второй — расширенный, и внутри него можно сформировать неограниченное количество новых разделов. Перейдем в облачную панель управления и увеличим диск на один гигабайт, а затем обновим информацию об устройстве sdc уже известной командой:

echo 1 > /sys/block/sdс/device/rescan

Конкретно этот диск мы разметили в формате MBR, поэтому здесь мы не видим предупреждений о переносе резервной копии таблицы разделов, как в случае с GPT.

image
Вернемся в консоль и отобразим информацию о диске:

parted /dev/sdb/ print free

image
Чтобы не захламлять выдачу, временно уберем отображение свободного пространства на диске:

parted /dev/sdb/ print 

image
У нас есть три раздела: основной под номером один, расширенный и логический под номерами два и пять.

Чтобы понять, какие разделы находятся в extended, необходимо сверить их начало и конец. Здесь мы видим, что конец второго раздела соответствует концу пятого раздела — 5369 Мбайт. И размер последнего на один мегабайт меньше. Так мы можем утверждать, что пятый раздел находится во втором разделе.

Чтобы расширить пятый раздел, необходимо предварительно увеличить второй. Для этого выполним:

growpart /dev/sdc 2

image
Вот так результат команды будет выглядеть в графическом отображении:

image
Раздел extended был расширен до конца всего раздела — вокруг неразмеченной области появилась голубая рамка. Теперь расширим пятый раздел, который пока занимает 4,5 Гб из доступных 5,5 Гб. В консоли пишем:

growpart /dev/sdc 5

image
Теперь и желтая рамка, обозначающая пятый раздел, протянулась до конца физического диска. Но мы видим, что файловая система все еще заканчивается сильно раньше. В нашем примере мы используем файловую систему xfs, которая наиболее распространена на CentOS, хотя иногда её применяют и на Debian с Ubuntu.

Для расширения файловой системы выполним команду:

xfs_growfs /mnt/sdc5

Обратите внимание, что в случае с xfs мы указываем не само физическое устройство, а точку монтирования. В нашем случае это /mnt/sdc5, но в частном случае это будет корень.

image
Вновь обращаемся к GParted и видим, что файловая система расширена до конца.

image

Если есть доп. разделы


Рассмотрим ситуацию, когда после расширяемого раздела идут другие — SWP, Home, Data и так далее.

image

В случае SWP облачная инфраструктура предлагает выход из ситуации. Мы можем выделить операционной системе столько памяти, чтобы ей вообще не приходилось применять своп. Затем раздел можно отключить из автозагрузки и удалить, а освободившееся дисковое пространство присоединить к целевому.

Есть и другой вариант, позволяющий сохранить SWP. С точки зрения виртуальной машины диск представляет собой файл в системе хранения данных с разными расширениями — например, VDI или VHDX. Мы можем изменить локацию SWP на файл в файловой системе, которую планируем расширять. Мы не будем говорить о переносе SWP в файл, так как это выходит за рамки нашего материала. Однако в интернете можно найти подробные руководства — вот одна из таких инструкций.

Если вместо SWP за целевым разделом следует раздел с данными, ситуация становится интереснее. К сожалению, в этом случае нельзя расширить файловую систему без простоя. Поэтому на реальной инфраструктуре лучше запланировать технологическое окно в вечернее время.

Для решения задачи мы воспользуемся GParted Live CD — скачать его можно на официальном сайте. Переходим на вкладку Download и загружаем образ.

image

Подключаем образ к виртуальной машине. Последовательность действий зависит от конкретной системы виртуализации. Загружаемся с диска и видим уже привычный графический интерфейс для расширения файловой системы. Как обычно, начинаем с увеличения доступного объема диска в панели управления облаком.

image
В этом примере разделом с данными выступает linux-swap. Обновляем информацию по разделам в консоли:

echo 1 > /sys/block/sdd/device/rescan

Затем — информацию в графическом интерфейсе. Видим неразмеченное дисковое пространство объемом в один гигабайт.

image
Расширим раздел extended до максимального размера. Для этого правой кнопкой мыши вызываем выпадающее меню и выбираем пункт Resize/Move.

image
Откроется новое всплывающее окно, в котором необходимо подвинуть ползунок в крайнее правое положение. И подтвердить операцию.

image
Далее открываем меню Resize/Move для раздела с данными — в нашем случае это linux-swap.

image

Мышкой перемещаем красную рамку в конец жесткого диска, подтверждаем операцию.

image
image
Теперь на главном экране раздел linux-swap находится в конце блока extended.

image
Далее остается произвести расширение целевого раздела и файловой системы.

image
В верхней части экрана нажимаем кнопку Apply All Operations.

image
Спустя какое-то время утилита применит все изменения.

image
У такого подхода есть одна серьезная проблема. Если раздел linux-swap довольно объемный, то его перемещение в конец диска может занять два-три часа. Все это время приложения и сервисы виртуальной машины будут простаивать. Вопрос можно решить, если сформировать в виртуальной инфраструктуре несколько дисков под каждый раздел. Так вы всегда сможете расширить условные /data и /root, поскольку они будут независимы друг от друга.

Другим решением, которое позволит избежать простоев, является разметка диска с помощью LVM.

Если есть LVM


К сожалению, для работы с LVM нет нормальных программ с графическим интерфейсом. Точнее, они есть, но не слишком информативные. Так с логическими томами приходится работать исключительно в командной строке.

В контексте LVM существуют физические тома (physical volume) — это целые неразбитые диски или их разделы. Внутри физических томов также есть разделы, объединённые в volume-groups. Эти группы, в свою очередь, дробятся на логические разделы — еще один уровень абстракции.

Что нам это дает? Рассмотрим два варианта разметки разделов диска. Чисто технически они ничем не отличаются — первый загрузочный, а второй физический том с LVM. В последнем случае он уже разбит на дополнительные разделы.

image

Может быть и следующая картина. Два раздела лежат в extended partition, а третий стоит отдельно, но добавлен в volume group. На отдельном диске дополнительно выделен раздел и также добавлен в эту группу.

image

Дополнительный уровень абстракции LVM позволяет нам расширять файловую систему вне зависимости от порядка разделов и предоставляет несколько подходов. Например, можно просто увеличить объём раздела, а можно создать новый и «приписать» его в логическую группу. Главное не переборщить с дроблением, чтобы разметку было проще читать.

Небольшая ремарка — если на диске есть раздел, который монтируется как блочное устройство и не участвует в LVM, то при расширении могут возникнуть проблемы. Здесь нужно или подключать образ Live CD, или перемещать раздел на отдельный виртуальный диск — тогда он не будет мешать увеличивать основной и логические разделы и volume groups.

image

Перейдем непосредственно к расширению файловой системы с LVM. На нашем тестовом стенде есть диск /dev/sde со следующей структурой:

image
В панели управления облаком увеличим объем диска на один гигабайт. Отобразим информацию о нем в консоли:

echo 1 > /sys/block/sdd/device/rescan
parted /dev/sde/ print free

Мы видим, что у нас добавилось свободное дисковое пространство.

image
Разделы, использующие LVM, помечены соответствующим тегом. В этом конкретном примере мы будем увеличивать диск под номером три до необходимого нам объёма. Нам не придется ставить дополнительные утилиты, так как все инструменты по умолчанию присутствуют во всех популярных дистрибутивах Linux.

Мы воспользуемся возможностями parted. Но предварительно отобразим размер свободного пространства в мегабайтах для наглядности.

parted /dev/sde unit MB print free

Далее смотрим на ключевые столбцы — Start, End и Size. Свободное дисковое пространство заканчивается на точке в 6442 Мбайта.

image
Чтобы расширить последний раздел, прописываем команду:

parted /dev/sde resizepart 3 6441MB

Обратите внимание, что мы уменьшили цифровое значение в конце на один мегабайт. Проверим внесенные изменения:

parted /dev/sde print free

Свободное дисковое пространство уменьшилось до одного мегабайта, а наш второй раздел имеет объем в 3806 Мбайт.

image
Вернемся в GParted и обновим информацию по разделам. Сейчас LVM в /dev/sde3 не «растянут» до конца.

image
Посмотрим на объем текущего физического тома – для этого выполним:

pvdisplay

image
Как физические тома у нас помечены два устройства — sde2 и sde3. Последний имеет объем в 2,5 Гб, но в GParted эта цифра равна 3,5 Гб. Чтобы исправить ситуацию и синхронизировать значения, нужно выполнить команду:

pvresize /dev/sde3

Повторяем pvdisplay и видим, что объем физического раздела увеличился.

image
Визуальное отображение в GParted также изменилось:

image
Чтобы отобразить существующие логические разделы, обратимся к команде:

lvscan

В нашей группе томов присутствуют два логических раздела — root и data.

image
Мы можем увеличить любой из этих томов. Для примера расширим /root следующей командой:

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

Ключ -r автоматически расширит и раздел, и файловую систему внутри него (как в случае с xfr, так и с ext). Переходим в GParted и видим, что операция выполнена успешно:

image
Теперь, если прописать в консоли df -h, мы увидим, что устройство dev/mapper/vg-root имеет объем в два гигабайта, хотя изначально его объем был равен одному гигабайту.

image

Как определить разметку


Поговорим о том, как понять, какая разметка у нас используется — с LVM или без? Если после выполнения команды df -h вы видите исключительно устройства типа /dev/sda — блочные устройства — то разметка выполнена без LVM. Также можно ввести команду lvscan. Если LVM не используется, то она ничего не отобразит. В противном случае покажет используемые логические разделы. На изображении ниже их два — root и data.

image
Иногда консоль может отобразить достаточно экзотические варианты, когда используется не dev, а dm0, dm1 и так далее. Чтобы понять, что это за устройства и какие логические разделы следует расширять, можно воспользоваться следующей командой. Она выведет всю информацию об устройствах.

lsblk --output NAME,KNAME,TYPE,SIZE,MOUNTPOINT

image
Например, мы видим, что dm-0 смонтирован в /mnt/sde-vg-root. Достаточно часто этот путь указывает в корень. И есть еще одна команда:

ls /dev/dm-*

Она отображает все устройства вида dm-*. Как видно на скриншоте ниже, в нашем случае их два.

image

Пока на этом всё. В следующей части поработаем с реальной виртуальной машиной на операционной системе Linux Mint.

P.S. Продолжается акция при запуске ИТ‑инфраструктуры IaaS c #CloudMTS.

Комментарии (5)


  1. it1804
    27.07.2022 11:54
    +3

    growpart ставить необязательно. В современных версиях parted давно есть команда resizepart. Также если на диске экстремально мало места, могут возникнуть проблемы за запуском growpart (для работы создаёт временные файлы в /tmp). У parted resizepart такой проблемы нет.

    parted /dev/vda resizepart 2 100%


  1. Speccyfan
    27.07.2022 11:54

    Как то привык уже, для дисков с данными, не делать ни разделов, ни LVM, а расширяю диск со стороны виртуализации, затем расширяю ФС, которая находится сразу поверх блочного устройства и никакого геморроя.


  1. DuD
    27.07.2022 11:57
    +2

    Стандартные утилиты вроде fdisk или GParted предлагают предварительно размонтировать раздел.

    Та вроде нет. Для операций на живом разделе только partprobe дернуть нужно чтобы таблицу перечитало ядро.

    # df -h
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/sda1        12G  2.8G  8.4G  25% /
    /dev/sdb1       542G  452G   90G  84% /var
    
    # fdisk /dev/sdb
    Welcome to fdisk (util-linux 2.27.1).
    Changes will remain in memory only, until you decide to write them.
    Be careful before using the write command.
    
    
    Command (m for help): d
    Selected partition 1
    Partition 1 has been deleted.
    
    Command (m for help): n
    Partition type
       p   primary (0 primary, 0 extended, 4 free)
       e   extended (container for logical partitions)
    Select (default p): 
    
    Using default response p.
    Partition number (1-4, default 1): 
    First sector (2048-1174405119, default 2048): 
    Last sector, +sectors or +size{K,M,G,T,P} (2048-1174405119, default 1174405119): 
    
    Created a new partition 1 of type 'Linux' and of size 560 GiB.
    
    Command (m for help): w
    
    The partition table has been altered.
    Calling ioctl() to re-read partition table.
    Re-reading the partition table failed.: Device or resource busy
    
    The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8).
    
    # partprobe
    # resize2fs /dev/sdb1
    resize2fs 1.42.13 (17-May-2015)
    Filesystem at /dev/sdb1 is mounted on /var; on-line resizing required
    old_desc_blocks = 35, new_desc_blocks = 35
    The filesystem on /dev/sdb1 is now 146800384 (4k) blocks long.
    
    # df -h
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/sda1        12G  2.8G  8.4G  25% /
    /dev/sdb1       552G  452G  100G  82% /var



  1. ss-nopol
    27.07.2022 12:06
    +3

    Надо немного усложнить условия: LVM раздел, на зашифрованном LUKS разделе, на рейде RAID1


  1. ZillahGiovanni
    28.07.2022 10:48
    +1

    Ох и зачем такое городить... хватает и fdisk с соответствующим resize2fs, причем даже на root разделе ;o)