Linux: увеличение размера раздела без LVM с сохранением данных на ext4

Автор: | 20/10/2018

Емеется EC2, на котором был увеличен EBS диск с 8 до 16 гиг.

Задача – увеличить размер раздела на диске, при этом сохранив данные.

Проблема в том, что на диске уже создан раздел, и этот раздел – фиксированный, и он не LVM:

[simterm]

admin@monitonrig-dev:~$ lsblk /dev/xvdb
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvdb    202:16   0  16G  0 disk 
└─xvdb1 202:17   0   8G  0 part /data

[/simterm]

Система в примерах ниже – Debian 9, но пример подходит для любой Linux-системы.

Важно: не верьте мне! Дабы потом не писать комментариев в духе “Я всё сделал по вашему мануалу, и потерял все данные!!!” (где-то такой был) – сначала проверяем на виртуальной машинке в Virtualbox раза два-три, потом пять раз всё бекапим с “боевой” машинки, и только после этого – выполняем изменения.

Выполняем следующие шаги:

  1. fdisk: увеличаем размер раздела /dev/xvdb1
  2. перезагружаем машину, что бы проверить, что всё работает
  3. resize2fs – увеличиваем размер файловой системы (тут это ext4)

fdisk – увеличиваем размер раздела

Шаги тут:

  1. удаляем существующий раздел
  2. создаём новый
  3. записываем изменения таблицы разделов

Проверяем разметку диска сейчас:

[simterm]

root@monitonrig-dev:/home/admin# fdisk -l /dev/xvdb
Disk /dev/xvdb: 16 GiB, 17179869184 bytes, 33554432 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x82283426

Device     Boot Start      End  Sectors Size Id Type
/dev/xvdb1       2048 16777215 16775168   8G 83 Linux

[/simterm]

Важно запомнить первый сектор, на котором начинается раздел – 2048.

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

Теперь – удаляем и пересоздаём раздел.

Важно: на вопрос:

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

Отвечаем n – не удаляем.

[simterm]

root@monitonrig-dev:/home/admin# fdisk /dev/xvdb   

Welcome to fdisk (util-linux 2.29.2).                                                                                                                                                                                                         
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): p
Disk /dev/xvdb: 16 GiB, 17179869184 bytes, 33554432 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x82283426

Device     Boot Start      End  Sectors Size Id Type
/dev/xvdb1       2048 16777215 16775168   8G 83 Linux

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

Command (m for help): p       
Disk /dev/xvdb: 16 GiB, 17179869184 bytes, 33554432 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x82283426

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): 

Using default response p.
Partition number (1-4, default 1): 
First sector (2048-33554431, default 2048): 
Last sector, +sectors or +size{K,M,G,T,P} (2048-33554431, default 33554431): 

Created a new partition 1 of type 'Linux' and of size 16 GiB.
Partition #1 contains a ext4 signature.

Do you want to remove the signature? [Y]es/[N]o: n

Command (m for help): p

Disk /dev/xvdb: 16 GiB, 17179869184 bytes, 33554432 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x82283426

Device     Boot Start      End  Sectors Size Id Type
/dev/xvdb1       2048 33554431 33552384  16G 83 Linux

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Re-reading the partition table failed.: Device or resource busy

The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8).

[/simterm]

Пробуем перемонтировать раздел, что бы проверить до ребута:

[simterm]

root@monitonrig-dev:/home/admin# mount /dev/xvdb1 /data/
root@monitonrig-dev:/home/admin# ls -l /data/
total 24
drwxr-xr-x  4 grafana grafana  4096 Oct 18 14:01 grafana
drwxr-xr-x  2 root    root    16384 Jun 22 13:15 lost+found
drwxr-xr-x 12 root    root     4096 Oct 15 14:00 prometheus

[/simterm]

Проверяем /etc/fstab – но у меня тут задано по имени раздела, так что разницы никакой, но в случае использования UUID – его надо будет обновить:

[simterm]

root@monitonrig-dev:/home/admin# blkid /dev/xvdb1
/dev/xvdb1: UUID="b9d96078-2fb2-4bf0-b388-e9cf0499d169" TYPE="ext4"
root@monitonrig-dev:/home/admin# cat /etc/fstab | grep data
/dev/xvdb1 /data ext4 defaults 0 0

[/simterm]

Бутаем машину:

[simterm]

root@monitonrig-dev:/home/admin# reboot

[/simterm]

После ребута ещё раз проверяем данные:

[simterm]

admin@monitonrig-dev:~$ lsblk 
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0   8G  0 disk 
└─xvda1 202:1    0   8G  0 part /
xvdb    202:16   0  16G  0 disk 
└─xvdb1 202:17   0  16G  0 part /data
admin@monitonrig-dev:~$ ls -l /data/
total 24
drwxr-xr-x  4 grafana grafana  4096 Oct 18 14:23 grafana
drwxr-xr-x  2 root    root    16384 Jun 22 13:15 lost+found
drwxr-xr-x 12 root    root     4096 Oct 15 14:00 prometheus

[/simterm]

Всё на месте, идём дальше.

resize2fs – увеличиваем файловую систему

Проверяем размер сейчас – те же 8 ГБ, которые были раньше:

[simterm]

admin@monitonrig-dev:~$ df -h /data/
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvdb1      7.9G  7.2G  231M  97% /data

[/simterm]

Запускаем resize2fs:

[simterm]

root@monitonrig-dev:/home/admin# resize2fs /dev/xvdb1 
resize2fs 1.43.4 (31-Jan-2017)
Filesystem at /dev/xvdb1 is mounted on /data; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 2
The filesystem on /dev/xvdb1 is now 4194048 (4k) blocks long.

[/simterm]

Проверяем:

[simterm]

root@monitonrig-dev:/home/admin# df -h /data/
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvdb1       16G  7.7G  7.3G  52% /data

[/simterm]

Можно ещё раз бутнуть машину, и проверить данные:

[simterm]

admin@monitonrig-dev:~$ ls -l /data/
total 24
drwxr-xr-x  4 grafana grafana  4096 Oct 18 14:28 grafana
drwxr-xr-x  2 root    root    16384 Jun 22 13:15 lost+found
drwxr-xr-x 12 root    root     4096 Oct 15 14:00 prometheus

[/simterm]

Готово.