Перейти к основному содержимому

Увеличение разделов в Linux на горячую

·1141 слово·6 минут
linux гайды
Юрий Семеньков
Автор
Юрий Семеньков
DevOps, tech, geek, mentor
Оглавление

Частая задача в моей текущей работе — увеличить объем раздела на виртуальной машине без выключения машины (на горячую). Под рукой постоянно держу небольшой cheatsheet (шпаргалку) по работе с разделами в Linux.

План действий
#

Перед изменением размеров разделов рекомендуется отмонтировать диск. Если диск системный, то нужно загружаться в recovery. Я делаю это на горячую на свой страх и риск.

  1. Делаем бекап машины! (не могу не написать этого)
  2. Увеличиваем объем диска в гипервизоре (этот пункт не затрагиваем)
  3. Сканируем диски в системе
  4. Меняем размер раздела
  5. Увеличиваем файловую систему

Сканируем диски в системе
#

После увеличения объема диска есть вероятность того, что в системе мы новый объем сразу не увидим. Проверяем. Я использую команду lsblk:

root@hostname.infra.local:/home/user# lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
fd0      2:0    1     4K  0 disk
loop0    7:0    0  99,2M  1 loop /snap/core/10908
loop2    7:2    0  99,2M  1 loop /snap/core/10958
sda      8:0    0    32G  0 disk
├─sda1   8:1    0     1M  0 part
└─sda2   8:2    0    32G  0 part /
sdb      8:16   0     4T  0 disk            <<<--------
└─sdb1   8:17   0     4T  0 part /pgsqldb   <<<--------
sdc      8:32   0 109,8G  0 disk
└─sdc1   8:33   0 109,8G  0 part /temp_dump
sr0     11:0    1   829M  0 rom

Стрелкой я выделил диск, который мы увеличили до 5Т, но увеличенный объем не видим.

Нужно заставить систему просканировать диск.

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

(вместо sdb - нужный диск)

Сразу после этого снова выполняем lsblk:

sdb      8:16   0     5T  0 disk
└─sdb1   8:17   0     4T  0 part /pgsqldb

То что нужно. Перейдем к увеличению раздела.

Меняем размер раздела
#

Вообще, мы можем для любых вариантов использовать программу parted, но я покажу еще способ с программой fdisk. Он подходит для разделов объемом менее 4 терабайт.

Здесь будет несколько вариантов:

  • у нас обычная разметка диска или LVM
  • у нас диск c таблицей разметки GPT более 4 терабайт объемом

Рекомендую на этом этапе сначала выполнить команду parted -l, которая может показать ошибку и предложить опции Fix\\Ignore:

Warning: Not all of the space available to /dev/sdb appears to be used, you can fix the GPT to use all of the space (an extra 41943040 blocks) or continue with the
current setting?
Fix/Ignore? Fix

Пишем Fix .

Обычные разделы или LVM
#

Чаще всего я пользуюсь программой fdisk. Можно посмотреть все наши диски\разделы: fdisk -l.

Так как меняем размер раздела на диске sdb, то и заходим в fdisk /dev/sdb.

Вводим команду p и получаем наш текущий список разделов:

Device     Start        End    Sectors Size Type
/dev/sdb1   2048 8589843750 8589841703   4T Linux filesystem

Удаляем раздел /dev/sdb1: вводим команду d.

Command (m for help): d
Selected partition 1
Partition 1 has been deleted.

Если разделов на диске больше, программа предложит ввести цифру нужного раздела.

Никаких изменений на диск мы еще не сделали! Не боимся.

Создаем новый раздел n:

Command (m for help): n
Partition number (1-128, default 1):
First sector (34-8589934558, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-8589934558, default 8589934558):

Created a new partition 1 of type 'Linux filesystem' and of size 4 TiB.

Обратите внимание, программа сообщает, что при создании раздела она нашла запись ext4 в разделе и предлагает удалить ее. Не удаляем. Нет! Не надо!

Partition #1 contains a ext4 signature.
Do you want to remove the signature? [Y]es/[N]o: N

Опять вводим команду p, чтобы посмотреть новую информацию:

Device     Start         End     Sectors Size Type
/dev/sdb1   2048 10751953125 10751951078   5T Linux filesystem

Ну вроде все хорошо. Теперь вводим команду w (write). После этого ваши изменения запишутся на диск.

Большой диск GPT
#

Если по предыдущему пункту попробовать отресайзить диск большого объема (больше 4 терабайт), то появится ошибка Value out of range. Придется воспользоваться программой parted.

Делаем parted /dev/sdb и смотрим текущие разделы командой print:

(parted) print
Model: VMware Virtual disk (scsi)
Disk /dev/sdb: 4398GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name     Flags
 1      1049kB  3299GB  3299GB  ext4         primary

Меняем размер раздела командой resizepart 1:

(parted) resizepart 1
Warning: Partition /dev/sdb1 is being used. Are you sure you want to continue?
Yes/No? Yes
End?  [3299GB]? 4398GB

На вопрос End? пишем новый объем раздела. Если хотим расширить его до максимума, то цифры можно подсмотреть выше в выводе команды print: Disk /dev/sdb: 4398GB

Здесь изменения происходят сразу, поэтому при отсутствии вывода после предыдущей команды можно делать quit.

Увеличение файловой системы
#

Тут должно быть все просто. Разница только между разметками: обычная или LVM.

Обычная разметка
#

Просто выполняем команду resize2fs /dev/sdb1:

root@hostname.infra.local:/home/user# resize2fs /dev/sdb1
resize2fs 1.44.1 (24-Mar-2018)
Filesystem at /dev/sdb1 is mounted on /pgsqldb; on-line resizing required
old_desc_blocks = 384, new_desc_blocks = 512
The filesystem on /dev/sdb1 is now 1073730212 (4k) blocks long.

LVM
#

Вообще, LVM позволяет добавлять физические диски (PV - physical volume) в VG - volume group, а в них создавать логические тома (LV - logical volume) примерно по такой схеме:

sda1     sda2     sdb     sdc       <-- PV
 |        |        |       |
 |        |        |       |
 +--------+- VG00 -+-------+        <-- VG
              |
 +-------+-------+---------+
 |       |       |         |
root    usr     home      var       <-- LV
 |       |       |         | 
ext3 reiserfs reiserfs    xfs       <-- Файловые системы

Следовательно, можно не ресайзить диск в гипервизоре, а добавить еще один. Затем добавить новый PV в VG.

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

Для просмотра информации о PV, VG, LV существуют команды pvs, vgs, lvs. И их более подробные варианты pvscan, vgscan, lvscan:

root@hostname:/home/user# pvs
  PV         VG            Fmt  Attr PSize  PFree
  /dev/sda5  t-ubuntu16-vg lvm2 a--  49.52g    0
root@hostname:/home/user# vgs
  VG            #PV #LV #SN Attr   VSize  VFree
  t-ubuntu16-vg   1   2   0 wz--n- 49.52g    0
root@hostname:/home/user# lvs
  LV     VG            Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root   t-ubuntu16-vg -wi-ao---- 48.52g
  swap_1 t-ubuntu16-vg -wi-ao----  1.00g
  • Меняем размер PV pvresize /dev/sda1
  • Увеличиваем размер LV до максимального lvextend -l +100%FREE /dev/mapper/vg1-dsads-lv-root
  • Увеличиваем файловую систему на нужном разделе resize2fs /dev/mapper/vg1-dsads-lv-root

Итог
#

Смотрим, что у нас получилось df -h:

root@hostname.infra.local:/home/user# df -h
Filesystem                                Size  Used Avail Use% Mounted on
udev                                       38G     0   38G   0% /dev
tmpfs                                     7,5G  4,4M  7,5G   1% /run
/dev/sda2                                  32G   24G  6,3G  79% /
/dev/sdb1                                 5,0T  3,3T  1,5T  71% /pgsqldb <<<-----

Видим новый объем. Все счастливы и довольны.

TL;DR
#

Кратко cheatsheet у меня выглядит так:

Смотрим, видит ли система новое место на дисках: lsblk, parted -l, fdisk -l

Если не видит: echo 1 > /sys/block/sda/device/rescan (вместо sda - нужный диск) fdisk /dev/sda (if sda)

p - просмотр разделов

d - удалить раздел который расширяешь

n - создать новый раздел (создастся с тем индексом, который удалишь)

В большинстве случаев везде ответы будут по умолчанию. Когда спросит про затирание метки - НЕ удалять

p - проверить что разделы имеют тот же вид что и в начале

w - записать изменения на диск

resize2fs /dev/sda1 (номер - индекс раздела)

Если LVM:

pvresize /dev/sda1

lvextend -l +100%FREE /dev/mapper/vg1-dsads-lv-root

resize2fs /dev/mapper/vg1-dsads-lv-root

Если ошибка с gpt

parted -lFix


💡 Подписывайтесь на Телеграм-канал, чтобы не пропускать новые статьи

Related

Индивидуальные презентации в IT-отделе
·528 слов·3 минут
шортики работа
Перенос базы Postgresql на другой диск
·508 слов·3 минут
работа
Бекапы индексов в Elasticsearch
·399 слов·2 минут
работа