Достаточно часто возникает необходимость посмотреть или подправить что нибудь в образе диска виртуальной машины 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, и т.д.