Случилась необходимость размер логического диска на одной виртуалке увеличить. Ну, т.к. виртуалка, то сначала выдал ей дисковых ресурсов, а именно увеличил размер единственного жесткого диска. А вот о том какие у меня возникли дальше трудности и как я их героически преодолел я и хочу поведать в этой были.
В моем случае диск содержал 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.
Все, задача решена. Можно идти пить любимый напиток.