понедельник, 5 июня 2017 г.

Изменение размера и подключение диска виртуальной машины KVM

Достаточно часто возникает необходимость изменить размер диска виртуальной машины – ну не рассчитали при создании образа диска. Тут есть два способа:
  • создать новый образ диска, отформатировать его и подключить к виртуальной машине с помощью команд virsh attach-disk или qemu attach-disk
  • изменить размер диска непосредственно в образе виртуальной машины.
Второй способ более естественный и безболезненный в смысле производительности. При изменении размера диска виртуальной машины KVM она должна быть выключена!!!
Изменение производится одной командой

sudo qemu-img resize /path/to/disk +disk_sizeG
 
где /path/to/disk – путь до образа диска;
disk_size – числа, на который увеличивается или уменьшается (тогда – вместо +) размер диска;
G – единица измерения – гигабайт. Можно изменить размер диска на disk_size мегабайт – тогда M.
В результате работы этой команды в конце диска образа виртуальной машины KVM появляется disk_size гигабайт (или мегабайт) свободного, нараспределенного дискового пространства. Можно загрузить виртуальную машину и создать дополнительный раздел при помощи fdisk или parted, можно увеличить размер разделов при помощи parted.
В принципе все это можно сделать и на хосте, подключив диск при помощи NBD, с помощью тех-же fdisk или parted.

parted /dev/nbd0
 
Таким образом можно изменять размер дисков в формате qcow2 и raw (можно еще и в qcow, но этот формат практически не используется).

Достаточно часто возникает необходимость посмотреть или подправить что нибудь в образе диска виртуальной машины KVM, не запуская саму виртуальную машину. Существует несколько способов подмонтировать диск образа виртуальной машины.
Самый простейший – использовать механизм NBD (Network Block Device) –  протокол работы с блочным устройством по сети. В состав пакета виртуализации KVM уже входит qemu-nbd (или, как еще называют kvm-nbd), который позволяет используя протокол NBD расшаривать образ диска по сети. В Debian-подобных системах qemu-nbd входит в состав qemu-utils.
В Ubuntu (да и в большинстве других Linux-подобных системах) драйвер Network Block Device должен быть загружен вручную:
$ sudo modprobe nbd
qemu-nbd будет использовать драйвер nbd для создания блочных устройств и осуществления ввода/вывода при работе с ними. Теперь можно приконнектить образ диска:

sudo qemu-nbd -c /dev/nbd0 path/to/image/file
 
Здесь вместо nbd0 может быть и nbd1, nbd2, то-есть любое свободное блочное устройство. Если устройство уже занято, то выдается ошибка, что-то типа:

/build/qemu-Ee59aw/qemu-2.0.0+dfsg/nbd.c:nbd_init():L504: Failed to set NBD socket
/build/qemu-Ee59aw/qemu-2.0.0+dfsg/nbd.c:nbd_receive_request():L638: read failed
 
При успешном подключении qemu-nbd завершается и осталяет работать демон, который позволяет осуществлять с /dev/nbd0 стандартный набор функций присущих любому блочному устройству: mount, fdisk, fsck и так далее.
Перед монтированием нужно посмотреть разделы на блочном устройстве nsd0:

$ sudo fdisk -l /dev/nbd0
Диск /dev/nbd0: 8589 МБ, 8589934592 байт
255 головок, 63 секторов/треков, 1044 цилиндров, всего 16777216 секторов
Units = секторы of 1 * 512 = 512 bytes
Размер сектора (логического/физического): 512 байт / 512 байт
I/O size (minimum/optimal): 512 bytes / 512 bytes
Идентификатор диска: 0x0004c910
Устр-во Загр Начало Конец Блоки Id Система
/dev/nbd0p1 * 2048 15960063 7979008 83 Linux
/dev/nbd0p2 15962110 16775167 406529 5 Расширенный
/dev/nbd0p5 15962112 16775167 406528 82 Linux своп / Solaris
 
Теперь можно монтировать и работать с nbd0p1 как с обычным примонтированным диском:

$ sudo mount /dev/nbd0p1 /mnt/qemu-img
 
Проверяем:

$ dir /mnt/qemu-img
bin dev home initrd.img.old lib64 media opt root sbin sys usr vmlinuz
boot etc initrd.img lib lost+found mnt proc run srv tmp var vmlinuz.old
 
После завершения работы с образом диска KVM отмонтируем  его:

sudo umount /dev/nbd0p1
 
и отконнектимся:

sudo qemu-nbd -d /dev/nbd0
 
Если при попытке коннекта выдается невразумительная ошибка:

Failed to open /dev/nbd0: No such file or directory/build/qemu-Ee59aw/qemu-2.0.0+dfsg/nbd.c:nbd_receive_request():L638: read failed

значит не загружен драйвер nbd. После всех манипуляций можно выгрузить nbd:

$ sudo modprobe -r nbd

ВАЖНО!!! Нельзя проводить все эти действия при запущенной виртуальной машине!!! Данные на ней будут безвозвратно потеряны!!!

Файл образа виртуальной машины может быть любого формата, поддерживаемого QEMU: raw, qcow2, qed, vdi, vmdk, vpc, и т.д.

Комментариев нет:

Отправить комментарий