Все привет!

Бывает что место кончилось, а желание писать ещё нет. В том смысле что базы росли росли и выросли - место на диске кончилось, или uploads могли сожрать всё свободное место.

Что можно сделать в этом случае ? Можно расширить раздел или добавить диск, при добавлении диска его надо будет разметить.

О том как это сделать будет эта статья-инструкция. Примеры будут приведены для Ubuntu 24, в качестве виртуальной площадки используем cloud.ru.

Статья состоит из трех частей

  • Как расширить раздел (увеличить диск)

  • Как добавить новый диск

  • Как создать базу данных на новом диске

Как расширить диск

Для начала нам надо понять что текущего объёма хранилища нам недостаточно.

Информация об объёме хранилища.

df -h

Вывод в консоль:

Filesystem      Size  Used Avail Use% Mounted on
tmpfs            97M  1.2M   96M   2% /run
/dev/vda2        15G  2.5G   12G  18% /
tmpfs           481M     0  481M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           481M     0  481M   0% /run/qemu
tmpfs            97M   12K   97M   1% /run/user/1000

На диске /dev/vda2 доступно 12G (на самом деле не на диске, а на дисковом разделе, на самом деле не дисковом разделе, а в файловой системе) , допустим нам этого не хватает, добавим ещё 15.

Поскольку у нас виртуальная машина, то и диски у неё виртуальные, и докинуть ещё 15 гигов можно легко через панель хостинга. Добавляем. После добавления проверяем доступный объём.

df -h

Вывод в консоль:

Filesystem      Size  Used Avail Use% Mounted on
tmpfs            97M  1.2M   95M   2% /run
/dev/vda2        15G  2.5G   12G  18% /
tmpfs           481M     0  481M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           481M     0  481M   0% /run/qemu
tmpfs            97M   12K   97M   1% /run/user/1000

Доступно по прежнему 12G, как ни странно место не увеличилось, потому что был увеличен размер диска, но не был увеличен раздел диска. Увеличим раздел.

Смотрим какие диски зарегистрированы в системе.

ls -la /dev | grep disk

Вывод в консоль:

crw-rw----  1 root disk     10, 234 Jan  1 23:50 btrfs-control
drwxr-xr-x  7 root root         140 Jan  1 23:50 disk
brw-rw----  1 root disk      7,   0 Jan  1 23:50 loop0
brw-rw----  1 root disk      7,   1 Jan  1 23:50 loop1
brw-rw----  1 root disk      7,   2 Jan  1 23:50 loop2
brw-rw----  1 root disk      7,   3 Jan  1 23:50 loop3
brw-rw----  1 root disk      7,   4 Jan  1 23:50 loop4
brw-rw----  1 root disk      7,   5 Jan  1 23:50 loop5
brw-rw----  1 root disk      7,   6 Jan  1 23:50 loop6
brw-rw----  1 root disk      7,   7 Jan  1 23:50 loop7
crw-rw----  1 root disk     10, 237 Jan  1 23:50 loop-control
brw-rw----  1 root disk    253,   0 Jan  2 00:41 vda
brw-rw----  1 root disk    253,   1 Jan  1 23:50 vda1
brw-rw----  1 root disk    253,   2 Jan  1 23:50 vda2

vda2 - это примонтированный раздел, который нам бы хотелось расширить. Соответственно vda это диск, разделы которого мы будем изменять.

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

sfdisk -d /dev/vda > vda_partition_bak.dmp

Пытаемся расширить раздел в тестовом режиме.

growpart -N /dev/vda 2

Вывод в консоль:

CHANGE: partition=2 start=4096 old: size=31453151 end=31457246 new: size=62910431 end=62914526
# === old sfdisk -d ===
label: gpt
label-id: 79E126D7-A1D1-4A98-8824-44C5DEF5EA96
device: /dev/vda
unit: sectors
first-lba: 34
sector-size: 512

/dev/vda1 : start=        2048, size=        2048, type=21686148-6449-6E6F-744E-656564454649, uuid=A0C01335-547A-462F-9A0B-0BA2EF4B7109
/dev/vda2 : start=        4096, size=    31453151, type=0FC63DAF-8483-4772-8E79-3D69D8477DE4, uuid=0931C894-6056-4ADD-888B-2CEAA0F62438
# === new sfdisk -d ===
label: gpt
label-id: 79E126D7-A1D1-4A98-8824-44C5DEF5EA96
device: /dev/vda
unit: sectors
first-lba: 34
sector-size: 512

/dev/vda1 : start=        2048, size=        2048, type=21686148-6449-6E6F-744E-656564454649, uuid=A0C01335-547A-462F-9A0B-0BA2EF4B7109
/dev/vda2 : start=        4096, size=    62910431, type=0FC63DAF-8483-4772-8E79-3D69D8477DE4, uuid=0931C894-6056-4ADD-888B-2CEAA0F62438

Изменения которые нам предлагает программа:

CHANGE: partition=2 start=4096 old: size=31453151 end=31457246 new: size=62910431 end=62914526

Выполняем расширение раздела.

growpart /dev/vda 2

Вывод в консоль:

CHANGED: partition=2 start=4096 old: size=31453151 end=31457246 new: size=62910431 end=62914526

Расширяем разметку файловой системы на весь раздел.

resize2fs /dev/vda2

Вывод в консоль:

resize2fs 1.47.0 (5-Feb-2023)
Filesystem at /dev/vda2 is mounted on /; on-line resizing required
old_desc_blocks = 2, new_desc_blocks = 4
The filesystem on /dev/vda2 is now 7863803 (4k) blocks long

Проверяем объём хранилища.

df -h

Вывод в консоль:

Filesystem      Size  Used Avail Use% Mounted on
tmpfs            97M  1.2M   95M   2% /run
/dev/vda2        30G  2.6G   26G  10% /
tmpfs           481M     0  481M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           481M     0  481M   0% /run/qemu
tmpfs            97M   12K   97M   1% /run/user/1000

Видим /dev/vda2 => Avail: 26G , объём хранилища увеличился, мы увеличивали на 15, и с 12 должен был увеличиться на 15 до 27, почему только до 26 вопросы к https://cloud.ru/, или это так работает округление при выводе.

Написано на основе https://unix.stackexchange.com/a/636803

Как добавить новый диск

Как добавить новый диск рассказать не долго, только нам надо не просто новый диск добавить в виртуалку, нам надо этот новый диск добавить в хранилище, что бы операционная система могла предоставить нам объём этого диска для записи файлов.

Новый диск добавим через панель хостинга.

Вообще зачем добавлять диск если можно расширить имеющийся? Допустим нам на сервере надо произвести единоразово обработку данных, которые будут не нужны после обработки и получения результата. Тогда мы можем просто удалить этот диск из системы. Поскольку у нас виртуалка и платим мы за использование, нам не надо будет платить за объём который мы не используем.

Посмотрим на диски операционной системы послед добавления диска в виртуалку.

lsblk

Вывод в консоль:

vda    253:0    0  30G  0 disk
��vda1 253:1    0   1M  0 part
��vda2 253:2    0  30G  0 part /
vdb    253:16   0   1G  0 disk
  • vda - это диск который мы расширяли

  • vdb - новый диск который мы добавили в панели хостинга

(Во время написания статьи моя винда решила перезагрузиться и текст записаный в notepad++ чуть чуть поломался поэтому здесь вы видите символы �, раньше после внезапных перезагрузок текст был в порядке, но не в этот раз: или сборка notepad++ неудачная, или раньше мне сказочно везло.)

После добавления диска, проверяем объём хранилища.

df -h

Вывод в консоль:

Filesystem      Size  Used Avail Use% Mounted on
tmpfs            97M  1.2M   95M   2% /run
/dev/vda2        30G  2.6G   26G  10% /
tmpfs           481M     0  481M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           481M     0  481M   0% /run/qemu
tmpfs            97M   12K   97M   1% /run/user/1000

Как видим ни чего не поменялось, доступно по прежнему 26G и не видно нового диска на vdb на 1G.

Раздел на диске не создан, файловой системы на диске не размещено. Исправим этот недочёт.

Создадим таблицу разделов для диска vdb.

parted /dev/vdb mklabel gpt

Вывод в консоль:

Information: You may need to update /etc/fstab.

Создадим раздел на диске vdb.

parted -a opt /dev/vdb mkpart primary ext4 0% 100%

Вывод в консоль:

Information: You may need to update /etc/fstab.

Проверим что раздел действительно создался.

lsblk

Вывод в консоль:

NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
vda    253:0    0   30G  0 disk
��vda1 253:1    0    1M  0 part
��vda2 253:2    0   30G  0 part /
vdb    253:16   0    1G  0 disk
��vdb1 253:17   0 1022M  0 part

На диске vdb появился раздел vdb1.

Создадим файловую систему для раздела.

mkfs.ext4 -L experimental-data /dev/vdb1

Вывод в консоль:

Warning: label too long; will be truncated to 'experimental-dat'

mke2fs 1.47.0 (5-Feb-2023)
Discarding device blocks: done
Creating filesystem with 261632 4k blocks and 65408 inodes
Filesystem UUID: 313023f0-1ec2-45fb-9cb2-8322637a072f
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376

Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

Проверяем объём хранилища.

df -h

Вывод в консоль:

Filesystem      Size  Used Avail Use% Mounted on
tmpfs            97M  1.2M   95M   2% /run
/dev/vda2        30G  2.6G   26G  10% /
tmpfs           481M     0  481M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           481M     0  481M   0% /run/qemu
tmpfs            97M   12K   97M   1% /run/user/1000

Ни чего не изменилось, новый диск не доступен в файловой системе.

Посмотрим какие файловые системы зарегистрированы в операционной системе.

lsblk --fs

Вывод в консоль:

NAME   FSTYPE FSVER LABEL            UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
vda
��vda1
��vda2 ext4   1.0                    e0013385-5b8e-4adf-9cdd-870f98db5b60   25.5G     9% /
vdb
��vdb1 ext4   1.0   experimental-dat 313023f0-1ec2-45fb-9cb2-8322637a072f

Видим что файловая система vdb1 не используется, для неё нет точки монтирования.

Создадим такую точку и примонтируем файловую систему.

mkdir -p /mnt/experimental
mount -o defaults /dev/vdb1 /mnt/experimental

Проверяем объём хранилища.

df -h

Вывод в консоль:

Filesystem      Size  Used Avail Use% Mounted on
tmpfs            97M  1.2M   95M   2% /run
/dev/vda2        30G  2.6G   26G  10% /
tmpfs           481M     0  481M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           481M     0  481M   0% /run/qemu
tmpfs            97M   12K   97M   1% /run/user/1000
/dev/vdb1       988M   24K  921M   1% /mnt/experimental

Видим что появилась новая файловая система /dev/vdb1, доступный размер 921M, точка монтирования /mnt/experimental, все что будет записано по пути /mnt/experimental будет храниться на разделе vdb1 нового диска vdb.

Объём доступного хранилища увеличен, казалось бы мы всё сделали, но не совсем. При загрузке операционной системы автоматически монтируются только заданные разделы, наш раздел надо задать для автоматического примонтирования.

Для этого отредактируем файл /etc/fstab, перед редактированием сделаем резервную копию.

cp /etc/fstab /etc/fstab.bak

Вместе с Ubuntu идёт текстовый редактор nano, отредактируем файл с помощью этой программы.

nano /etc/fstab

Добавляем новую строку, в конец файла конечно.

LABEL=experimental-data /mnt/experimental ext4 defaults 0 2
  • Ctrl+X (закрыть программу)

  • Y (согласиться с сохранением изменений)

  • Enter (согласиться на запись в предложенный файл)

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

reboot
# после загрузки проверяем что раздел примонтирован автоматически
df -h

Как создать базу данных на новом диске

Если вы не хотите размещать файлы базы данных на системном разделе, то можно создать табличное пространство на произвольном диске (в директории которая размещена на другом дисковом разделе), в нашем случае это /mnt/experimental.

Для СУБД PostgreSQL, команды будет такими:

Создаём директорию для размещения файлов базы данных.

mkdir -p /mnt/experimental/data

Подключаемся к СУБД, создаём табличное пространство fias_data.

CREATE TABLESPACE fias_data OWNER postgres LOCATION '/mnt/experimental/data';

Создаём базу данных fias в созданном табличном пространстве fias_data на отдельном диске.

CREATE DATABASE fias WITH OWNER postgres TABLESPACE fias_data;

Спасибо за внимание.

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


  1. litos
    02.01.2025 02:48

    У вас лейбл experimental-data затранкейтило при создании fs и вы дальше в командах монтирования продолжаете использовать это имя ...


    1. SbWereWolf Автор
      02.01.2025 02:48

      при маунте метка бы точно так же обрезалась бы, думаю всё равно бы маунт прицепился.


  1. GennPen
    02.01.2025 02:48

    А как расширить основной раздел, если после основного идет еще один? На сколько помнится, Debian так любит делать устанавливая своп-раздел после основного.


    1. vasiliev-s
      02.01.2025 02:48

      Можно временно отключить swap. Или временно использовать для swap файл. Или присоединить новый диск и перенести swap на него. Потом сделать нужные манипуляции.


      1. GennPen
        02.01.2025 02:48

        Это слишком просто. =)


    1. Wolfen113
      02.01.2025 02:48

      Я как то убила ссд диск пытаясь расширить корень смещая в бок рядом стоящий Хом. Диск был всего 60г, и я не рассчитав для корня слишком мало места дала. Поэтому через гпартед пыталась его расширить через год поотзованмя, контроллер диска это не перенес. С тех пор я Хом раздел и своп никогда не создаю, все равно ни то ни другое ни разу не пригодились. Только корень и буд разделы для ефи загрузчика.


      1. ABATAPA
        02.01.2025 02:48

        Контроллер не перенёс изменения разделов? "Буд"?

        Смешались люди, кони...


        1. Wolfen113
          02.01.2025 02:48

          Мне так сказали что какой то контроллер в диске е перенес операцию. Тех детали я не знаю, а это было предположение сообщества на мой вопрос. И в целом что в 90% случаях ссд диски накрываются не от выработки циклов перезаписи циклов, а что плохой контроллер ломается. А то был первый пробный ссд купленный за копейки на али. Но с тех пор я больше не пытаюсь ни в каких дисках менять разметку с сдвигом данных.
          Вот что я имела ввиду. Ну а то что у вас айкью не хвалило русские слова конвертировать в английские это уже не моя проблема.


  1. Ergistael
    02.01.2025 02:48

    gparted вообще не канает, да? Наверное, я не в теме...


    1. Acidter
      02.01.2025 02:48

      Linux чаще серверный, чем десктопный, поэтому чаще не канает.


  1. randomsimplenumber
    02.01.2025 02:48

    текст записаный в notepad++ чуть чуть поломался

    И починить его невозможно? Или и так сойдёт?


    1. vasiliev-s
      02.01.2025 02:48

      Интересный у Вас ник. Если не секрет, чем руководствовались при выборе?)))


  1. dmitrye1
    02.01.2025 02:48

    Дополню частным мнение.
    - Используйте LVM для всего, кроме boot. С простыми партициями не всегда можно вырулить.
    - Команда "mount -a" выполняется при загрузке ОС, для монтирования всех файловых систем, хорошая идея использовать именно ее для итоговой проверки, а не монтировать новую ФС опциями к mount. Сюрпризов при ребуте не будет.


  1. adrozhzhov
    02.01.2025 02:48

    Как в линуксах все сложно :)

    Вот на гипервизорах с Солярисом все намного проще :)

    • Подать LUNы

    • Найти LUNы на первичном и вторичном контроллере

    • Разметить новые LUNы в efi/vtoc в зависимости от размера и версии соляриса в виртуалке

    • Создать виртуальные устройства (для первичного и вторичного контроллеров)

    • Прокинуть созданные виртуальные устройства как диски в виртуалки через добавление в конфигурацию

    • На виртуалке vxdisk scandisks для поиска новых дисков

    • Инициализировать новые диски

    • Добавить диски в дисковую группу

    • Рассчитать на сколько можно увеличить нужный том на новых LUN-ах, учитывая топологию (число дисков в страйпе, размер страйпа)

    • Растянуть том на новые диски на полученные на предыдущем шаге размер

    На aix мучений с прокидыванием и разметкой нет. Только cfgmgr для поиска дисков и дальше инициализация. Да и вообще там smitty есть...


  1. Wolfen113
    02.01.2025 02:48

    Открыть gparted и сделать все в пару коиков? - не.

    Извращаться с консолью? - Да!

    Я хоть и пользуюсь линкусом уже 7 ле, но мне такие извращения не понять. Мне проще либо в системе, либо на флешке gparted запустить.


    1. baldr
      02.01.2025 02:48

      На сервере в облаке? gparted?


      1. randomsimplenumber
        02.01.2025 02:48

        parted?


        1. baldr
          02.01.2025 02:48

          в пару кликов?


    1. JBFW
      02.01.2025 02:48

      Все с чем работается не локально - удобнее и надёжнее делать через консоль.

      Да, можно и удаленно графику запустить, но это будет извращение покруче чем просто запустить несколько команд. Особенно если в процессе оборвется связь...

      А когда научился все делать через консоль - внезапно оказывается что и локально все проще сделать через консоль )


      1. kuzzdra
        02.01.2025 02:48

        resize диска делается не настолько часто, чтобы этому имело смысл специально учиться.


    1. SkylineXXX
      02.01.2025 02:48

      У меня gparted долго скрипел, потом вывалил красную галку, сказав, что не все операции прошли успешно. Фактически пришиб трехгиговый хард. Теперь восстанавливаю помаленьку в testdisk. Очень долго и нудно..


      1. Wolfen113
        02.01.2025 02:48

        У меня когда ссд откинулся от операции расширения корня со сдвигом хома. Я почти сутки с надеждой ждала что таки операция завершиться. Но прога просто висела на месте. В итоге пришлось принудительно все отключить, а потом выяснилось что диск мертв. С тех пор такую операцию как расширение раздела с смещением соседнего я больше не делаю ни в каких прогах. Только по старинке удаление не нужного и из пустого пространства создание новых разделов. Такое пока за десятки лет еще ни разу не подводило.


        1. gaidukav
          02.01.2025 02:48

          LVM! И не придётся никого двигать, просто определяем ещё один LVM раздел, добавляем его в нужную диск-группу, и расширяем на него наш диск. И совершенно не важно где будет физически находится добавленный раздел. Хоть на другом физическом HDD/SSD. И пофиг, что дисковое пространство физически не будет непрерывным. Результатом будет просто увеличенный логический диск. Причём всё это делается без ребута и на системное диске.


          1. Wolfen113
            02.01.2025 02:48

            Ну, в те времена (это было больше 7 лет назад) я о таких вещах не знала, да и сейчас не шибко знаю. Поэтому просто для системы создаю лишь корень, все равно отдельно хом мне ни разу не пригодился. А перед корнем раздел для ефи загрузчика. Правда там тоже стала чувствоваться нехватка памяти. Я всего 512 мб для boot раздела выделила. А у меня какой то файл (как оказалось не оч нужный) основательно разжирел, и файл с драйвером нвидиа. Поэтому я как привыкла не могла сразу два ядра держать. Теперь думаю что в следующие разы если систему буду ставить то для boot буду минимум гиг выделять. Что бы не было ситуации нехватки как тогда с корнем.


  1. CrazyHackGUT
    02.01.2025 02:48

    почему только до 26 вопросы к https://cloud.ru/

    Скорее всего у вас включено резервирование части пространства под "нужды суперпользователя". Можно так почекать к примеру:

    root@k8s-worker-cloudru-1:~# tune2fs -l /dev/vda1 | grep -i reserved
    Reserved block count:     0
    Reserved GDT blocks:      252
    Reserved blocks uid:      0 (user root)
    Reserved blocks gid:      0 (group root)

    У меня голдовый образ Убунты был раскатан, потому vda1. Через так же tune2fs можно выключить резервирование.

    Ещё, часть пространства файловая система резервирует под хранение информации об айнодах. Не знаю, какие цифры будут на 15Гб (емнип, пространство, выделяемые под айноды, не увеличивается в extX при растягивании самой ФС), но у меня на 8Гб диске в резерв уходило ~200 метров.


  1. tlittle
    02.01.2025 02:48

    Видим /dev/vda2 => Avail: 26G , объём хранилища увеличился, мы увеличивали на 15, и с 12 должен был увеличиться на 15 до 27, почему только до 26 вопросы к https://cloud.ru/, или это так работает округление при выводе.

    Вопрос не cloud.ru, вопрос к вам. Почему вы ориентируетесь на колонку avail, а не на size? У вас был раздел 15G, увеличили на 15, стал 30G. Какие претензии?


    1. SbWereWolf Автор
      02.01.2025 02:48

      допустим. смотрим следующий кейс - добавление доска на 1 гиабайт, добавить меньше интерфес панели не позволяет :)

      /dev/vdb1       988M   24K  921M   1% /mnt/experimental

      1 гигабайт это 1024 мегабайта, тут сайз 988, 1024-988=36 мегабайт, я не ошибся ? где они ? Я думаю их линукс захомячил на свои служебные нужды. Но много конечно, помниться когда то весь объём HDD был 20 мегабайт :) году так в 1985-ом.


      1. tlittle
        02.01.2025 02:48

        На давайте начнем с простого. 1 гигабайт - это 1000 мегабайт. Уж так случилось, не обессудьте. 1024 мегабайт - это другая единица измерения, гибибайт или GiB.

        Далее. Вы опять смотрите размер раздела. Смотрите, пожалуйста, размер блочного устройства.

        $ lsblk -b /dev/vda
        NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
        vda 252:0 0 32212254720 0 disk

        Нетрудно посчитать, что провайдер предоставил вам блочное устройство размером ровно 30 GiB

        Но много конечно, помниться когда то весь объём HDD был 20 мегабайт :) году так в 1985-ом.

        Не знаю, что вам там "помниться" и где вы видели в 1985 году 20 мегабайт, я первый 10 Гб винчестер увидел в 92, но вот как раз в 90-х пользователи очень любили предъявлять претензии продавцам потому что на диске указан объем 1Гб, а по факту там объем 9хх Мб.


  1. kolossradosskiy
    02.01.2025 02:48

    Создадим раздел на диске vdb.

    Зачем? В контексте задачи можно и без разделов:
    fdisk /dev/vdb
    mkfs.ext4 /dev/vdb