Convert directory to QEMU/KVM virtual disk image
I have a directory filled with data at /var/backups/disk1
that I want to convert into a virtual disk image which I'll then be able to boot using QEMU or KVM (the directory contains the file system for a virtual machine, copied out via rsync).
While there are plenty of instructions out there for converting a complete physical disk to a virtual disk, packaging up only the contents of a single directory into a virtual disk image is turning out to be much more difficult than I expected. Any ideas?
By the way, I know I can use qemu-img
to convert a block device into a virtual disk (e.g., qemu-img convert -f /dev/sdc -O qcow2 disk.qcow2
), so if only I could get the directory /var/backups/disk1
to appear to be a block device, then theoretically I should be able to accomplish my goal using qemu-img
. I've thought about creative ways to expose the directory as a block device using NBD or a loopback device, however, and have not had success.
First, create a raw image of the required size. I'll assume 10G is enough. Using seek creates a sparse file, which saves space.
dd if=/dev/null of=example.img bs=1M seek=10240
Next, create a filesystem on it.
mkfs.ext4 -F example.img
(Note that you need the -F
option for mkfs.ext4
to operate on a file as opposed to a disk partition)
Then, mount it.
mkdir /mnt/example
mount -t ext4 -o loop example.img /mnt/example
Now you can copy your files to /mnt/example. Once this is done, unmount it and you can use example.img as a drive in a virtual machine. If you want you can convert it from a raw image to another format like qcow2e using qemu-img, but this isn't required.
Seems like libguestfs can do it, see virt-make-fs(1) and maybe virt-copy-in(1).