Чаще всего задача расширить файловую систему возникает при работе с облачной инфраструктурой. Виртуализация позволяет экономить на дисковом пространстве и выделять его столько, сколько необходимо в конкретный момент. Но простого расширения ресурсов недостаточно, об изменениях необходимо сообщить операционной системе. Сегодня ведущий архитектор #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:
Расширять будем корневой раздел. Первым делом необходимо увеличить доступный объем жесткого диска через панель управления облачной инфраструктурой #CloudMTS — с 7 до 8 Гбайт.
Увеличение диска займет какое-то время, а мы вернемся на тестовый стенд. Отобразим структуру разделов с помощью команды:
parted /dev/sdb/ print free
Параметры
print
и free
отвечают за отображение структуры разделов и неразмеченного пространства.Мы увеличили объем диска, но все равно не видим в выдаче команды
parted
свободную память. Можно перезагрузить сервер, но мы решили, что по возможности не будем останавливать виртуальную машину. Вместо этого, выполним команду:echo 1 > /sys/block/sdb/device/rescan
Если мы попытаемся снова отобразить структуру разделов командой
parted
, то увидим предупреждение. Мы используем таблицу разделов в формате GPT. Информация о ней хранится в начале и в конце диска (для резервирования). Когда мы увеличили объем физического накопителя, сменился конец адресного пространства. Система предлагает автоматически переместить резервные файлы. Соглашаемся и пишем в командной строке fix.Появилось свободное дисковое пространство в размере одного гигабайта:
Прежде чем перейти к расширению файловой системы, необходимо разметить новое пространство и расширить сам раздел. Здесь нам пригодится утилита growpart — выполним команду:
growpart /dev/sdb 2
Мы расширили раздел, но файловая система осталась нетронутой. Вот как это выглядит в GParted:
Давайте расширим ФС командой
resize2fs
. Если у вас xfs, то нужно указывать точку монтирования. В случае с ext2, ext3 и ext4 достаточно выполнить команду с указанием блочного устройства, которое монтируется в файловую систему. Мы используем ext4, поэтому выполним:resize2fs /dev/sdb2
Таким образом, мы успешно расширили файловую систему до размера диска.
Теперь рассмотрим другую ситуацию, когда ФС находится в логическом диске, созданном в расширенном разделе. Так структура выглядит в древовидном формате:
У нас два основных раздела — sdc1 и sdc2. Второй — расширенный, и внутри него можно сформировать неограниченное количество новых разделов. Перейдем в облачную панель управления и увеличим диск на один гигабайт, а затем обновим информацию об устройстве sdc уже известной командой:
echo 1 > /sys/block/sdс/device/rescan
Конкретно этот диск мы разметили в формате MBR, поэтому здесь мы не видим предупреждений о переносе резервной копии таблицы разделов, как в случае с GPT.
Вернемся в консоль и отобразим информацию о диске:
parted /dev/sdb/ print free
Чтобы не захламлять выдачу, временно уберем отображение свободного пространства на диске:
parted /dev/sdb/ print
У нас есть три раздела: основной под номером один, расширенный и логический под номерами два и пять.
Чтобы понять, какие разделы находятся в extended, необходимо сверить их начало и конец. Здесь мы видим, что конец второго раздела соответствует концу пятого раздела — 5369 Мбайт. И размер последнего на один мегабайт меньше. Так мы можем утверждать, что пятый раздел находится во втором разделе.
Чтобы расширить пятый раздел, необходимо предварительно увеличить второй. Для этого выполним:
growpart /dev/sdc 2
Вот так результат команды будет выглядеть в графическом отображении:
Раздел extended был расширен до конца всего раздела — вокруг неразмеченной области появилась голубая рамка. Теперь расширим пятый раздел, который пока занимает 4,5 Гб из доступных 5,5 Гб. В консоли пишем:
growpart /dev/sdc 5
Теперь и желтая рамка, обозначающая пятый раздел, протянулась до конца физического диска. Но мы видим, что файловая система все еще заканчивается сильно раньше. В нашем примере мы используем файловую систему xfs, которая наиболее распространена на CentOS, хотя иногда её применяют и на Debian с Ubuntu.
Для расширения файловой системы выполним команду:
xfs_growfs /mnt/sdc5
Обратите внимание, что в случае с
xfs
мы указываем не само физическое устройство, а точку монтирования. В нашем случае это /mnt/sdc5
, но в частном случае это будет корень.Вновь обращаемся к GParted и видим, что файловая система расширена до конца.
Если есть доп. разделы
Рассмотрим ситуацию, когда после расширяемого раздела идут другие — SWP, Home, Data и так далее.
В случае SWP облачная инфраструктура предлагает выход из ситуации. Мы можем выделить операционной системе столько памяти, чтобы ей вообще не приходилось применять своп. Затем раздел можно отключить из автозагрузки и удалить, а освободившееся дисковое пространство присоединить к целевому.
Есть и другой вариант, позволяющий сохранить SWP. С точки зрения виртуальной машины диск представляет собой файл в системе хранения данных с разными расширениями — например, VDI или VHDX. Мы можем изменить локацию SWP на файл в файловой системе, которую планируем расширять. Мы не будем говорить о переносе SWP в файл, так как это выходит за рамки нашего материала. Однако в интернете можно найти подробные руководства — вот одна из таких инструкций.
Если вместо SWP за целевым разделом следует раздел с данными, ситуация становится интереснее. К сожалению, в этом случае нельзя расширить файловую систему без простоя. Поэтому на реальной инфраструктуре лучше запланировать технологическое окно в вечернее время.
Для решения задачи мы воспользуемся GParted Live CD — скачать его можно на официальном сайте. Переходим на вкладку Download и загружаем образ.
Подключаем образ к виртуальной машине. Последовательность действий зависит от конкретной системы виртуализации. Загружаемся с диска и видим уже привычный графический интерфейс для расширения файловой системы. Как обычно, начинаем с увеличения доступного объема диска в панели управления облаком.
В этом примере разделом с данными выступает linux-swap. Обновляем информацию по разделам в консоли:
echo 1 > /sys/block/sdd/device/rescan
Затем — информацию в графическом интерфейсе. Видим неразмеченное дисковое пространство объемом в один гигабайт.
Расширим раздел extended до максимального размера. Для этого правой кнопкой мыши вызываем выпадающее меню и выбираем пункт Resize/Move.
Откроется новое всплывающее окно, в котором необходимо подвинуть ползунок в крайнее правое положение. И подтвердить операцию.
Далее открываем меню Resize/Move для раздела с данными — в нашем случае это linux-swap.
Мышкой перемещаем красную рамку в конец жесткого диска, подтверждаем операцию.
Теперь на главном экране раздел linux-swap находится в конце блока extended.
Далее остается произвести расширение целевого раздела и файловой системы.
В верхней части экрана нажимаем кнопку Apply All Operations.
Спустя какое-то время утилита применит все изменения.
У такого подхода есть одна серьезная проблема. Если раздел linux-swap довольно объемный, то его перемещение в конец диска может занять два-три часа. Все это время приложения и сервисы виртуальной машины будут простаивать. Вопрос можно решить, если сформировать в виртуальной инфраструктуре несколько дисков под каждый раздел. Так вы всегда сможете расширить условные /data и /root, поскольку они будут независимы друг от друга.
Другим решением, которое позволит избежать простоев, является разметка диска с помощью LVM.
Если есть LVM
К сожалению, для работы с LVM нет нормальных программ с графическим интерфейсом. Точнее, они есть, но не слишком информативные. Так с логическими томами приходится работать исключительно в командной строке.
В контексте LVM существуют физические тома (physical volume) — это целые неразбитые диски или их разделы. Внутри физических томов также есть разделы, объединённые в volume-groups. Эти группы, в свою очередь, дробятся на логические разделы — еще один уровень абстракции.
Что нам это дает? Рассмотрим два варианта разметки разделов диска. Чисто технически они ничем не отличаются — первый загрузочный, а второй физический том с LVM. В последнем случае он уже разбит на дополнительные разделы.
Может быть и следующая картина. Два раздела лежат в extended partition, а третий стоит отдельно, но добавлен в volume group. На отдельном диске дополнительно выделен раздел и также добавлен в эту группу.
Дополнительный уровень абстракции LVM позволяет нам расширять файловую систему вне зависимости от порядка разделов и предоставляет несколько подходов. Например, можно просто увеличить объём раздела, а можно создать новый и «приписать» его в логическую группу. Главное не переборщить с дроблением, чтобы разметку было проще читать.
Небольшая ремарка — если на диске есть раздел, который монтируется как блочное устройство и не участвует в LVM, то при расширении могут возникнуть проблемы. Здесь нужно или подключать образ Live CD, или перемещать раздел на отдельный виртуальный диск — тогда он не будет мешать увеличивать основной и логические разделы и volume groups.
Перейдем непосредственно к расширению файловой системы с LVM. На нашем тестовом стенде есть диск /dev/sde со следующей структурой:
В панели управления облаком увеличим объем диска на один гигабайт. Отобразим информацию о нем в консоли:
echo 1 > /sys/block/sdd/device/rescan
parted /dev/sde/ print free
Мы видим, что у нас добавилось свободное дисковое пространство.
Разделы, использующие LVM, помечены соответствующим тегом. В этом конкретном примере мы будем увеличивать диск под номером три до необходимого нам объёма. Нам не придется ставить дополнительные утилиты, так как все инструменты по умолчанию присутствуют во всех популярных дистрибутивах Linux.
Мы воспользуемся возможностями
parted
. Но предварительно отобразим размер свободного пространства в мегабайтах для наглядности.parted /dev/sde unit MB print free
Далее смотрим на ключевые столбцы — Start, End и Size. Свободное дисковое пространство заканчивается на точке в 6442 Мбайта.
Чтобы расширить последний раздел, прописываем команду:
parted /dev/sde resizepart 3 6441MB
Обратите внимание, что мы уменьшили цифровое значение в конце на один мегабайт. Проверим внесенные изменения:
parted /dev/sde print free
Свободное дисковое пространство уменьшилось до одного мегабайта, а наш второй раздел имеет объем в 3806 Мбайт.
Вернемся в GParted и обновим информацию по разделам. Сейчас LVM в /dev/sde3 не «растянут» до конца.
Посмотрим на объем текущего физического тома – для этого выполним:
pvdisplay
Как физические тома у нас помечены два устройства — sde2 и sde3. Последний имеет объем в 2,5 Гб, но в GParted эта цифра равна 3,5 Гб. Чтобы исправить ситуацию и синхронизировать значения, нужно выполнить команду:
pvresize /dev/sde3
Повторяем
pvdisplay
и видим, что объем физического раздела увеличился. Визуальное отображение в GParted также изменилось:
Чтобы отобразить существующие логические разделы, обратимся к команде:
lvscan
В нашей группе томов присутствуют два логических раздела — root и data.
Мы можем увеличить любой из этих томов. Для примера расширим /root следующей командой:
lvextend /dev/vg/root -l +100%FREE -r
Ключ -r автоматически расширит и раздел, и файловую систему внутри него (как в случае с xfr, так и с ext). Переходим в GParted и видим, что операция выполнена успешно:
Теперь, если прописать в консоли
df -h
, мы увидим, что устройство dev/mapper/vg-root имеет объем в два гигабайта, хотя изначально его объем был равен одному гигабайту.Как определить разметку
Поговорим о том, как понять, какая разметка у нас используется — с LVM или без? Если после выполнения команды
df -h
вы видите исключительно устройства типа /dev/sda — блочные устройства — то разметка выполнена без LVM. Также можно ввести команду lvscan
. Если LVM не используется, то она ничего не отобразит. В противном случае покажет используемые логические разделы. На изображении ниже их два — root и data. Иногда консоль может отобразить достаточно экзотические варианты, когда используется не dev, а dm0, dm1 и так далее. Чтобы понять, что это за устройства и какие логические разделы следует расширять, можно воспользоваться следующей командой. Она выведет всю информацию об устройствах.
lsblk --output NAME,KNAME,TYPE,SIZE,MOUNTPOINT
Например, мы видим, что dm-0 смонтирован в /mnt/sde-vg-root. Достаточно часто этот путь указывает в корень. И есть еще одна команда:
ls /dev/dm-*
Она отображает все устройства вида dm-*. Как видно на скриншоте ниже, в нашем случае их два.
Пока на этом всё. В следующей части поработаем с реальной виртуальной машиной на операционной системе Linux Mint.
P.S. Продолжается акция при запуске ИТ‑инфраструктуры IaaS c #CloudMTS.
Комментарии (5)
Speccyfan
27.07.2022 11:54Как то привык уже, для дисков с данными, не делать ни разделов, ни LVM, а расширяю диск со стороны виртуализации, затем расширяю ФС, которая находится сразу поверх блочного устройства и никакого геморроя.
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
ss-nopol
27.07.2022 12:06+3Надо немного усложнить условия: LVM раздел, на зашифрованном LUKS разделе, на рейде RAID1
ZillahGiovanni
28.07.2022 10:48+1Ох и зачем такое городить... хватает и fdisk с соответствующим resize2fs, причем даже на root разделе ;o)
it1804
growpart ставить необязательно. В современных версиях parted давно есть команда resizepart. Также если на диске экстремально мало места, могут возникнуть проблемы за запуском growpart (для работы создаёт временные файлы в /tmp). У parted resizepart такой проблемы нет.