Расширение (увеличение) xfs корневого раздела / без остановки

Обычно при создании разделов на серверах и виртуальных машинах я использую lvm, но не в этот раз. Мне нужно было увеличить корневой раздел  / с файловой системой xfs и желательно без остановки сервера. Изначально была идея делать маленькие корневые разделы для виртуальных машины, чтобы быстро делать бэкап системы без данных. Но на деле у такого подхода есть свои минусы и неудобства.

Углубленный онлайн-курс по MikroTik

Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.

В итоге, настал момент, когда мне надоело чистить системный раздел и разгружать символьными ссылками. Я решил его увеличить. Если вы используете lvm, то никаких проблем нет. Просто добавляете еще один диск к виртуальной машине или увеличиваете текущий. Потом новый диск или раздел увеличенного диска добавляете к группе томов и расширяете нужный lvm раздел. Примерно вот так:

# vgextend vg00 /dev/sdb
# lvextend -r -l +100%FREE /dev/vg00/root

Работает наживую даже с корневым разделом. Я часто это делал, способ рабочий, но пару раз я ловил проблемы с загрузкой виртуалки после этого. Так что не рекомендую экспериментировать с такими вещами. Если есть возможность, лучше обойтись без изменения разделов. А если не обойтись, то перед этим обязательно сделать бэкап всей информации и продумать варианты быстрого восстановления.

Сегодня я хотел рассказать о другой ситуации. Корневой раздел не на lvm, а на обычном разделе диска с xfs. Изначально диск виртуалки был 10G, через гипервизор я его расширил до 20G. Получилась такая картина:

Расширение раздела xfs

Сам диск 20G, а его разделы занимают только 10. Мне надо расширить раздел sda2, на котором точка монтирования /.

Увеличить xfs

На сайте redhat нашел казалось бы рабочий вариант с xfs_growfs. Попробовал запустить:

# xfs_growfs / -d

Получил в конце сообщение - data size unchanged, skipping. Стал разбираться, почему не работает команда, хотя вроде должна. Потом сообразил, что я не правильно понял ее назначение. Она расширит файловую систему xfs, если на разделе есть свободное место. Но у меня то раздел /dev/sda2 на 9G и он весь занят файловой системой. Расширять нечего. Надо сначала увеличить сам раздел.

Для увеличения раздела нагуглил другую утилиту - growpart. Устанавливаю на Centos 7:

# yum install cloud-utils-growpart

Напомню, что у меня перед расширением раздела с xfs вот такая картинка по разбиению диска - диск sda, далее /boot раздел sda1 на 1G, потом корень / sda2 на 9G и дальше свободное место 10G. Мне надо увеличить второй раздел свободным местом. Делаю это так:

# growpart /dev/sda 2
CHANGED: partition=2 start=2099200 old: size=18872320 end=20971520 new: size=39843807,end=41943007

Теперь уже расширяю файловую систему xfs на все пространство увеличенного раздела:

# xfs_growfs -d /
meta-data=/dev/sda2              isize=512    agcount=4, agsize=589760 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=2359040, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 2359040 to 4980475

Корневой раздел root / с xfs расширил на лету, без остановки и перезагрузки системы. Изначально в рунете нашел информацию по увеличению раздела только через размонтирование, а если системный раздел, то через загрузку с livecd с последующим удалением текущего раздела и созданием нового, расширенного.

Покопался в буржунете и собрал вот такой рабочий вариант, который опробовал сам на практике на продуктовом сервере с предварительным бэкапом всей виртуалки. Откатываться не пришлось, все получилось не сложнее, чем с lvm. Изначально не питал больших надежд на такой исход, готовился к переустановке. Но обошелся малой кровью.

Онлайн-курс по устройству компьютерных сетей.

На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Не понравилась статья и хочешь научить меня администрировать? Пожалуйста, я люблю учиться. Комментарии в твоем распоряжении. Расскажи, как сделать правильно!

Помогла статья? Подписывайся на telegram канал автора

Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.

Автор Zerox

Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству. Если вам интересно узнать обо мне побольше, то можете послушать интервью. Запись на моем канале - https://t.me/srv_admin/425 или на сайте в контактах.

38 комментариев

  1. Подскажите, если нужно не увеличить, а уменьшить раздел с xfs_growfs на всё доступное пространство.
    Вот с resize2fs -p -M /dev/ваш раздел диска получается, ключ М помогает. А как также сделать с xfs_growfs ?

    Простая ситуция - виртуалка дебиан с LVM, на одном из разделов база постгрес разжирела, вакуум не возвращает свободное место операционной системе. Приходится делать вакум фулл - который возвращает, однако при этом нужно место на текущем разделе, соизмеримым с самой базой (либо с самой жирной таблицей . Один из выходов - подкинуть физ диск (в данном случае заАттачить в KVM), добавить его в PV и в группу , увеличив затем пространство. И вот наконец-то вакуум фулл прошёл, база стала меньше занимать намного и свободного места стало больше, чем тот диск, который заАттачили. Хочется его "вытащить" из LVM и из виртуалки в целом, он нам уже (какое-то время) не нужен. Вот тут парень пишет https:// adminway.ru/kak-otklyuchit-zhestkii-disk-ot-lvm-v-linux, однако там фс ext4, а у меня xfs. Подскажите как решить такой кейс, чёт вообще с этими экстентами немогу разобраться. Должен быть выход.

    • XFS не поддерживает уменьшение. Это архитектурное ограничение и с этим ничего не поделать. EXT4 можно уменьшить, XFS - нет.

      • Подскажите тогда можно ли так сделать: просто все файлы раздела в tar и перенести на временное место. Удалить этот xfs раздел и расформировать его лвм структуру. Далее создать снова такой же раздел, но без объёма диска, который приАттачил, сделать фс. Ну и вернуть данные из тар архива. Или это костыль? Если dd делать, то он потом на меньшем объеме не развернётся, ведь так?

        • Вариантов решения вопроса много. Подключите новый диск нужного объёма в виртуалку. Остановите postgresql, перенесите базу на новый диск. Отмонтируйте старый диск, примонтируйте новый, куда перенесли базу, в ту же точку монтирования. Вот и всё. Это при условии, что на сервере есть возможность добавить диск нужного размера.

  2. Имею виртуалку Zabbix Appliance 6.0.6 со следующими разделами

    [root@appliance ~]# df -h
    Filesystem Size Used Avail Use% Mounted on
    devtmpfs 1.9G 0 1.9G 0% /dev
    tmpfs 2.0G 0 2.0G 0% /dev/shm
    tmpfs 2.0G 25M 1.9G 2% /run
    tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
    /dev/sda2 4.0G 1.4G 2.7G 34% /
    /dev/sda3 1014M 40M 975M 4% /tmp
    /dev/sda1 488M 50M 403M 11% /boot
    tmpfs 393M 0 393M 0% /run/user/0
    /dev/sda5 4.5G 1.6G 2.9G 36% /var/lib/mysql

    Необходимо увеличить свободное место в партиции для БД до максимума, место есть

    [root@appliance ~]# lsblk
    NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
    sda 8:0 0 256G 0 disk
    ├─sda1 8:1 0 512M 0 part /boot
    ├─sda2 8:2 0 4G 0 part /
    ├─sda3 8:3 0 1G 0 part /tmp
    ├─sda4 8:4 0 1K 0 part
    └─sda5 8:5 0 4.5G 0 part /var/lib/mysql

    Сначала делаю как предложено в статье

    [root@appliance ~]# growpart /dev/sda 5
    CHANGED: partition=5 start=11538432 old: size=9433088 end=20971520 new: size=525332447 end=536870879

    Расширяю дисковое пространство

    [root@appliance ~]# xfs_growfs -d /dev/sda5
    meta-data=/dev/sda5 isize=512 agcount=4, agsize=294784 blks
    = sectsz=512 attr=2, projid32bit=1
    = crc=1 finobt=1, sparse=1, rmapbt=0
    = reflink=1 bigtime=0 inobtcount=0
    data = bsize=4096 blocks=1179136, imaxpct=25
    = sunit=0 swidth=0 blks
    naming =version 2 bsize=4096 ascii-ci=0, ftype=1
    log =internal log bsize=4096 blocks=2560, version=2
    = sectsz=512 sunit=0 blks, lazy-count=1
    realtime =none extsz=4096 blocks=0, rtextents=0
    data size unchanged, skipping

    Не получилось, пробую по другому

    [root@appliance ~]# xfs_growfs -d /var/lib/mysql
    meta-data=/dev/sda5 isize=512 agcount=4, agsize=294784 blks
    = sectsz=512 attr=2, projid32bit=1
    = crc=1 finobt=1, sparse=1, rmapbt=0
    = reflink=1 bigtime=0 inobtcount=0
    data = bsize=4096 blocks=1179136, imaxpct=25
    = sunit=0 swidth=0 blks
    naming =version 2 bsize=4096 ascii-ci=0, ftype=1
    log =internal log bsize=4096 blocks=2560, version=2
    = sectsz=512 sunit=0 blks, lazy-count=1
    realtime =none extsz=4096 blocks=0, rtextents=0
    data size unchanged, skipping

    Тот же результат.

    Ну и закономерный вопрос - ЧЯДНТ ? Судя по комментам людям удавалось увеличить дисковый раздел для Zabbix предложенным способом, но в готовом решении Zabbix он почему то не работает.

    • Проверьте, после команды growpart /dev/sda 5 размер раздела реально увеличился или нет? Этот способ 100% рабочий, я много раз им пользовался.

      • Судя по выводу lsblk все осталось без изменений.

        • lsblk не показывает размер разделов, он показывает размер файловой системы на разделах. А сами разделы надо смотреть с помощью gparted или fdisk.

    • Судя по всему /dev/sda5 логический раздел на /dev/sda4.
      Тебе нужно сначала увеличить /dev/sda4
      sudo growpart /dev/sda 4
      Затем действовать по инструкции в статье для /dev/sda5

      • Art, это можно увидеть командой
        sudo parted -l

        • ART, ну или в выводе fdisk -l, их области будут совпадать. То есть start для sda5 будет чуть больше, чем start для sda4, end будет одинаковым.

  3. Filesystem Type Size Used Avail Use% Mounted on
    devtmpfs devtmpfs 16G 0 16G 0% /dev
    tmpfs tmpfs 16G 20K 16G 1% /dev/shm
    tmpfs tmpfs 16G 89M 16G 1% /run
    tmpfs tmpfs 16G 0 16G 0% /sys/fs/cgroup
    /dev/sda2 xfs 4.0G 3.2G 859M 79% /
    /dev/sda3 xfs 1014M 40M 975M 4% /tmp
    /dev/sda1 ext4 488M 132M 321M 30% /boot
    /dev/sda5 xfs 55G 4.1G 51G 8% /var/lib/mysql

    с таким колхозом, как я понимаю, можно только майскуль увеличить ?

    • Если разделы идут один за другим, то да, только последний раздел можно увеличить. Как вариант, можно еще удалить /tmp, за счет его размера расширить корень /, а для /tmp создать новый раздел или другой диск подключить.

  4. Просидел пол-дня, думал как раздел для zabbix увеличить. А потом наткнулся на твою статью и сделал за 5 минут! :)
    Спасибо за помощь!

  5. все четко коротко и ясно, аккурат для таких как я))) до этой статьи 2 часа искал решение проблемы (не увеличивался раздел без размонтирования - вылезала ошибка суперблока - хз че эт такое даже разбираться не стал, голову забивать) а тут без воды и по делу

    • Потому что самому надо было сделать подобное. Сделал и сразу записал. Со временем, к сожалению, все равно что-то меняется и статья теряет актуальность. Но тут тема почти вечная. Файловые системы редко меняются.

  6. Спасибо.

    Выручил

    Расширил место в zabbix /var/lib/mysql

  7. Способ рабочий. Только что на лету расширил системный раздел еще на одном сервере.

  8. Андрей

    в твоем примере диск был изначально 20G? или с начало 10G и ты его увеличил в виртуальной машине

    • Был 10, увеличил в свойствах диска на гипервизоре до 20.

      • Андрей

        и без перезагрузки он увиделся 20? и для этого не чего не делал?

        • Все, что я сделал - описал в статье. Вопрос не понял.

          • Андрей

            просто не всегда даже для lv раздела получается увеличить его при увеличении диска в vm без перезагрузки этой vm, просто не видит диск увеличенного размера

            • В kvm сразу видит. В hyper-v, по-моему, тоже. Вот в Xen перезагрузка нужна была, чтобы виртуалка увидела диск с новым размером. То же самое в vmware, возможно от версии зависело. Точно не помню, где встречался с этим, но был удивлен, когда узнал, что надо виртуалку перезагрузить, чтобы увидеть новый размер диска.

          • По поводу growpart утилиты не понял, она ток для виртуалок или на железе тоже можно использовать? По идее разницы быть не должно но инфы по утилите не нашёл

            • На железе тоже можно. С уровня файловой системы нет разницы, железо или виртуальная машина.

        • Эльдар

          поиск новый дисковых устройств на scsi-шине X:
          echo "- - -" > /sys/class/scsi_host/hostX/scan

          поиск дополнительного места на диске X:
          echo 1 > /sys/block/sdX/device/rescan

          удаление диска Х из системы:
          echo 1 >/sys/block/sdX/device/delete

  9. а как на счет etx4?

    • С ext4 ровно то же самое. Это файловая система и она стоит поверх раздела. Если раздел не изменён, то и расшиться некуда.

  10. Вообще в линухе можно расширить раздел и штатными средствами - с помощью fdisk. Самый волнительный момент - сначала удаляется существующий раздел! Главное новый раздел начать с того же блока что и старый. Как пример - https://devops.ionos.com/tutorials/increase-the-size-of-a-linux-root-partition-without-rebooting/
    Пару недель назад именно по этой статье делал - всё успешно!

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

      • Пяткой в грудь бить не буду - у меня задача была расширить несистемный раздел, но делал я это без размонтирования. Надо будет ради интереса попробовать с системным.

      • Попробовал с корневым разделом - успешно!
        Как в приведённой ссылке удалил партицию и создал заново большего размера. Потом дал команду "partprobe" чтобы данные перечитались налету.
        Поскольку делал на Centos с LVM, о потребовалось дополнительно расширить PV командой "pvresize /dev/sda2". VG у меня расширилась автоматом, а вот LV так же пришлось пнуть "lvextend -l +100%FREE /dev/centos/root". Ну и вишенка на тортике - "xfs_growfs /".
        В итоге корневой раздел увеличен без размонтирований и перезагрузок.

        • Разве с lvm надо делать xfs_growfs / ? Команда расширения lv сама файловую систему расширяет. Ну и в целом для lvm операции расширения раздела не имеет смысла. Можно создать новый раздел, добавить к pv, потом расширить lv.

          • По xfs_growfs / не скажу - я как то сходу команду ввёл и не посмотрел расширил lvextend файловую систему или нет.
            По lvm - у меня под рукой такая машина была, поэтому с ним и делал опыт.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.
Используешь Telegram? Подпишись на канал автора →
This is default text for notification bar