Частая задача в моей текущей работе — увеличить объем раздела на виртуальной машине без выключения машины (на горячую). Под рукой постоянно держу небольшой 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
💡 Подписывайтесь на Телеграм-канал, чтобы не пропускать новые статьи
- Телеграм канал 📺
- Чат 🤘🏼