Не претендуя на полноту, все же считаю, что это может пригодиться системным администраторам.
Увеличение размера диска в виртуальной машине происходило при следующих вводных: формат файла виртуалки qcow2, виртуальная машина использует lvm и ext4, root partition находится в extended partition. Действо обычно происходит ночью, когда нагрузка минимальна и даунтайм не сильно давит на нервы. Хотя при работе с highload-проектами адреналина всё равно выделяется много. Поэтому перед началом лучше отключить систему оповещения по СМС, чтобы не пугать коллег сообщениями типа «Server down».
1. Выключить виртуальную машину
Я сделал это через GUI, нажав на красную кнопку power в virt-manager. Это можно сделать дав команду shutdown в командной строке виртуальной машины.
2. На гипервизоре увеличиваем размер файла (в моем случае на 200 гигабай)
qemu-img resize /path/to/vm-disk.qcow2 +200G
3. Цепляем диск к другой (сервисной) виртуальной машине через управляющую машину с virt-manager, альтернативный вариант — загрузиться с CD с поддержкой lvm.
Cooтветственно, 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-database-2-vg/root -l +100%FREE
lvextend /dev/vm-database-2-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-database-2-vg/root
В выводе resize2fs должно быть такое:
The filesystem on /dev/vm-database-2-vg/root is now 231278592 blocks long.
теперь проверим и исправим файловую систему:
fsck -f /dev/mapper/vm--database--2--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-database-2:/etc# lvextend /dev/vm-database-2-vg/root -l +100%FREE
lvextend /dev/vm-database-2-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-database-2:/etc# resize2fs /dev/vm-database-2-vg/root
проверять и исправлять файловую систему нельзя, fsck -f /dev/mapper/vm--database--2--vg-root убьёт файловую систему
Проверить, что получилось:
df -h