Как я размер раздела увеличивал

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

В моем случае диск содержал MBR таблицу разделов.

Чтобы виртуалка увидела на диске свободное место без перезагрузки, я выполнил команду "partprobe".

Итак, дано (данные о головках и секторах удалены для уменьшения размера статьи):

fdisk -l

Диск /dev/sda: 42.9 Гб, 42949672960 байт
...
Устр-во Загр     Начало       Конец       Блоки   Id  Система
/dev/sda1   *        2048      499711      248832   83  Linux
/dev/sda2          501758    62912511    31205377    5  Расширенный
/dev/sda5          501760    62912511    31205376   8e  Linux LVM

Диск /dev/mapper/srv--vg-swap_1: 1073 МБ, 1073741824 байт
...
Диск /dev/mapper/srv--vg-root: 15.0 Гб, 14998831104 байт
...
Диск /dev/mapper/srv--vg-var: 15.9 Гб, 15879634944 байт
...

Т.е. на диске есть единственный первичный загрузочный раздел размером 255MB и на расширенном разделе есть 3 lvm-раздела, суммарным объемом 32 Гб (почему такая странная разметка - сказать точно не могу, т.к. создавалось это все давно), размер диска был увеличен на 10Гб и стал составлять 42.9 Гб.

Задача: увеличить размер раздела /dev/srv-vg/var так, чтобы он увеличился до 25Гб. При этом нужно сделать это без перезагрузки сервера и без потери данных.

Решение. Все админы делятся на тех кто уже делает бэкапы и тех, кто пока их не делает. По-этому сначала на всякий случай делаем бэкап всего нужного. После этого вооружаемся fdisk-ом:

fdisk /dev/sda

Команда (m для справки): p

Диск /dev/sda: 42.9 Гб, 42949672960 байт
64 головок, 32 секторов/треков, 40960 цилиндров, всего 83886080 секторов
Units = секторы of 1 * 512 = 512 bytes
Размер сектора (логического/физического): 512 байт / 512 байт
I/O size (minimum/optimal): 512 bytes / 512 bytes
Идентификатор диска: 0x000da1e3

Устр-во Загр     Начало       Конец       Блоки   Id  Система
/dev/sda1   *        2048      499711      248832   83  Linux
/dev/sda2          501758    62912511    31205377    5  Расширенный
/dev/sda5          501760    62912511    31205376   8e  Linux LVM

Команда (m для справки): d
Номер раздела (1-5): 5

Команда (m для справки): d
Номер раздела (1-5): 2

Команда (m для справки): n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   расширенный
Select (default p): e
Номер раздела (1-4, по умолчанию 2):
Используется значение по умолчанию 2
Первый сектор (499712-83886079, по умолчанию 499712): 501758
Last сектор, +секторы or +size{K,M,G} (501758-83886079, по умолчанию 83886079):
Используется значение по умолчанию 83886079

Команда (m для справки): n
Partition type:
   p   primary (1 primary, 1 extended, 2 free)
   l   логический (нумерация с 5)
Select (default p): l
Добавление логического раздела 5
Первый сектор (503806-83886079, по умолчанию 503806):
Используется значение по умолчанию 503806
Last сектор, +секторы or +size{K,M,G} (503806-83886079, по умолчанию 83886079):
Используется значение по умолчанию 83886079

Команда (m для справки): p

Диск /dev/sda: 42.9 Гб, 42949672960 байт
64 головок, 32 секторов/треков, 40960 цилиндров, всего 83886080 секторов
Units = секторы of 1 * 512 = 512 bytes
Размер сектора (логического/физического): 512 байт / 512 байт
I/O size (minimum/optimal): 512 bytes / 512 bytes
Идентификатор диска: 0x000da1e3

Устр-во Загр     Начало       Конец       Блоки   Id  Система
/dev/sda1   *        2048      499711      248832   83  Linux
/dev/sda2          499712    83886079    41693184    5  Расширенный
/dev/sda5          501760    83886079    41692160   83  Linux

Команда (m для справки): w
Таблица разделов была изменена!

Вызывается ioctl() для перечитывания таблицы разделов.

ВНИМАНИЕ: Попытка перечитать таблицу разделов завершилась ошибкой 16: Устройство или ресурс занято.
Ядро всё ещё использует старую таблицу. Новая будет использована
при следующей перезагрузке, или при запуске partprobe(8) или kpartx(8)
Синхронизируются диски.

Все, теперь размер раздела на диске увеличен! Но пока еще размер lvm остался прежним, равно как и размер файловой системы. Поясню, что за магия была совершена в программе fdisk:
1) p - печать таблицы разделов (чтобы посмотреть исходное состояние разделов)
2) d, 5 - удаление 5-ого раздела, т.е. раздела с LVM
3) d, 2 - удаление 2-ого раздела, т.е. расширенного раздела
4) n, e, 501758 - создание нового расширенного раздела (начало раздела должно совпадать с началом удаленного раздела, в моем случае - 501758)
5) n, l - создание нового логического раздела (начало раздела должно совпадать с началом удаленного раздела, в данном случае совпало с предлагаемым - 503806)
6) p - печать таблицы разделов (чтобы посмотреть новое состояние разделов и сравнить с исходным, переходить к следующему пункту только убедившись, что все ОК)
7) w - запись новой таблицы разделов (до этого пункта все изменения не сохраняются на диск)

Внимание! Для того, чтобы не потерять файловую систему на разделе, который увеличиваем, необходимо, чтобы начало нового создаваемого раздела в точности совпадало с началом старого удаленного раздела, по-этому перед удалением необходимо запомнить/записать номер первого сектора удаляемого раздела. Если вдруг fdisk отображает информацию не в секторах, а в цилиндрах, то можно переключить режим, воспользовавшись параметром "-u" ("u" в интерактивном режиме).

После этого, чтобы изменения применились без перезагрузки, необходимо выполнить команду "partprobe" (работает не во всех версиях Linux, иногда поможет только перезагрузка).

Теперь приступим к настройке lvm (если вы не используете lvm, то можно сразу перейти к resize2fs).

Сначала посмотрим, какой том у нас есть:

pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda5
  VG Name               srv-vg
  PV Size               29,76 GiB / not usable 0   
  Allocatable           yes (but full)
  PE Size               4,00 MiB
  Total PE              7618
  Free PE               0
  Allocated PE          7618
  PV UUID               0K8nBq-6muK-DXT3-1xWr-vQvz-dIx4-2zh8nJ

после этого выполним команду:

pvresize /dev/sda5
  Physical volume "/dev/sda5" changed
  1 physical volume(s) resized / 0 physical volume(s) not resized

и убедимся, что размер тома увеличился:

pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda5
  VG Name               srv-vg
  PV Size               39,76 GiB / not usable 2,00 MiB
  Allocatable           yes
  PE Size               4,00 MiB
  Total PE              10178
  Free PE               2560
  Allocated PE          7618
  PV UUID               0K8nBq-6muK-DXT3-1xWr-vQvz-dIx4-2zh8nJ

У нас сейчас на srv-vg появилось свободное место размером 10Гб:

vgdisplay
  --- Volume group ---
  VG Name               srv-vg
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  19
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                3
  Open LV               3
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               39,76 GiB
  PE Size               4,00 MiB
  Total PE              10178
  Alloc PE / Size       7618 / 29,76 GiB
  Free  PE / Size       2560 / 10,00 GiB
  VG UUID               zf4cMW-0bY1-FVC7-3Utw-mdz3-H1z0-3zY12F

Увеличиваем размер lv:

lvextend /dev/srv-vg/var -l +100%FREE
  Extending logical volume var to 24,79 GiB
  Logical volume var successfully resized

 vgdisplay
  --- Volume group ---
  VG Name               srv-vg
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  20
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                3
  Open LV               3
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               39,76 GiB
  PE Size               4,00 MiB
  Total PE              10178
  Alloc PE / Size       10178 / 39,76 GiB
  Free  PE / Size       0 / 0   
  VG UUID               zf4cMW-0bY1-FVC7-3Utw-mdz3-H1z0-3zY12F

Увеличиваем размер тома:

resize2fs /dev/srv-vg/var
resize2fs 1.42.9 (4-Feb-2014)
Filesystem at /dev/srv-vg/var is mounted on /var; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 2
The filesystem on /dev/srv-vg/var is now 6498304 blocks long.

Все, задача решена. Можно идти пить любимый напиток.