Частая задача в моей текущей работе — увеличить объем раздела на виртуальной машине без выключения машины (на горячую). Под рукой постоянно держу небольшой cheatsheet (шпаргалку) по работе с разделами в Linux.
План действий #
Перед изменением размеров разделов рекомендуется отмонтировать диск. Если диск системный, то нужно загружаться в recovery. Я делаю это на горячую на свой страх и риск.
- Делаем бекап машины! (не могу не написать этого)
- Увеличиваем объем диска в гипервизоре (этот пункт не затрагиваем)
- Сканируем диски в системе
- Меняем размер раздела
- Увеличиваем файловую систему
Сканируем диски в системе #
После увеличения объема диска есть вероятность того, что в системе мы новый объем сразу не увидим. Проверяем. Я использую команду 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 -l → Fix
💡 Подписывайтесь на Телеграм-канал, чтобы не пропускать новые статьи
- Телеграм канал 📺
- Чат 🤘🏼
