15 March 2015

Правильное увеличение размера диска в виртуальной машине

Virtualization
Sandbox
Не претендуя на полноту, все же считаю, что это может пригодиться системным администраторам.

Увеличение размера диска в виртуальной машине происходило при следующих вводных: формат файла виртуалки qcow2, виртуальная машина использует lvm и ext4, root partition находится в extended partition. Действо обычно происходит ночью, когда нагрузка минимальна и даунтайм не сильно давит на нервы. Хотя при работе с highload-проектами адреналина всё равно выделяется достаточно, чтобы 10 раз подумать, перед тем, как что-либо делать. Поэтому перед началом процесса, лучше отключить систему оповещения по СМС, чтобы не пугать коллег сообщениями типа «Server down» среди ночи.

1. Выключить виртуальную машину
Я сделал это через GUI, нажав на красную кнопку power в virt-manager. Если нет virt-manager, это можно сделать дав команду shutdown в командной строке виртуальной машины.
2. На гипервизоре увеличиваем размер файла (в моем случае на 200 гигабайт)
qemu-img resize /path/to/vm-disk.qcow2 +200G

3. Цепляем диск к другой (сервисной) виртуальной машине через управляющую машину с virt-manager, альтернативный вариант — загрузиться с CD с поддержкой lvm.
Cooтветственно, при загрузке с LiveCD, vdb поменяется на vda
4. Запускаем сервисную машину (на ней тоже должен быть lvm) через virt-manager.
5. Далее на сервисной (или LVM liveCD) машине:
parted /dev/vdb

получим размер диска:

(parted) print
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 1288GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type      File system  Flags
 1      1049kB  256MB   255MB   primary   ext2         boot
 2      257MB   1000GB  1000GB  extended
 5      257MB   1000GB  1000GB  logical                lvm

увеличим extended partition, если этого не сделать получим Error: Can't have overlapping partitions. ubuntu parted -gparted

(parted) resizepart 2
End?  [1000GB]? 1288Gb

увеличим logical root partition

(parted) resizepart 5
End?  [1000GB]? 1288Gb
(parted) q

теперь нужно увеличить размер физического диска в lvm

pvresize /dev/vdb5

увеличиваем размер логического диска в lvm

root@vm-service:/etc# lvextend  /dev/vm-db-0-vg/root -l +100%FREE
 lvextend  /dev/vm-db-0-vg/root -l +100%FREE
File descriptor 7 (pipe:[7918]) leaked on lvextend invocation. Parent PID 1378: bash (на это можно не обращать внимания)
  Extending logical volume root to 1.12 TiB
  Logical volume root successfully resized
root@vm-service:/etc# resize2fs /dev/vm-db-0-vg/root

В выводе resize2fs должно быть такое:
The filesystem on /dev/vm-db-0-vg/root is now 231278592 blocks long.

теперь проверим и исправим файловую систему:

fsck -f /dev/mapper/vm--db--0--vg-root

диск готов
6. выключаем сервисную машину, отключаем от нее диск в virt-manager
из командной строки, не используя GUI для управления виртуальными машинам можно сделать это при помощи virsh, использование которого хорошо описано здесь: управление виртуальными машинами из командной строки
7. Запускаем сервер
Увеличение с минимальным даунтаймом, почти на лету, проверено на lvm2/ext4 можно сделать так:
1. Увеличение размера файла на 200 гигабайт выполняется на гипервизоре
qemu-img resize /path/to/vm-disk.qcow2 +200G

2. Перезагрузка виртуальной машины
3. На виртуальной машине
parted /dev/vda

Посмотрим размер физического диска и всех логических разделов
(parted) print
Model: Virtio Block Device (virtblk)
Disk /dev/vda: 1288GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type      File system  Flags
 1      1049kB  256MB   255MB   primary   ext2         boot
 2      257MB   1000GB  1000GB  extended
 5      257MB   1000GB  1000GB  logical                lvm

увеличим extended partition

 (parted) resizepart 2
End?  [1000GB]? 1288Gb

увеличим logical root partition

(parted) resizepart 5
End?  [1000GB]? 1288Gb
(parted) q

теперь нужно увеличить размер физического диска в lvm

pvresize /dev/vda5

увеличиваем размер логического диска в lvm

root@vm-db-0:/etc# lvextend  /dev/vm-db-0-vg/root -l +100%FREE
 lvextend  /dev/vm-db-0-vg/root -l +100%FREE
File descriptor 7 (pipe:[7918]) leaked on lvextend invocation. Parent PID 1378: bash 
  Extending logical volume root to 1.12 TiB
  Logical volume root successfully resized
root@vm-db-0:/etc# resize2fs /dev/vm-db-0-vg/root

В этом случае проверять и исправлять файловую систему нельзя, fsck -f /dev/mapper/vm--db--0--vg-root убьёт файловую систему
Проверить, что получилось:

df -h

Продолжение темы
Tags:серверlvmqcow2ext4extended partition
Hubs: Virtualization
+10
97.5k 227
Comments 57