vhost-user-blk is a high-performance storage protocol that connects virtual machines to software-defined storage like SPDK or qemu-storage-daemon. Until now, tool support for vhost-user-blk has been lacking. Accessing vhost-user-blk devices involved running a virtual machine, which requires more setup than one would like.
QEMU 7.2 adds vhost-user-blk support to the qemu-img tool. This is possible thanks to libblkio, a library that other programs besides QEMU can use too.
Check for vhost-user-blk support in your installed qemu-img version like this (if it says 0 then you need to update qemu-img or compile it from source with libblkio enabled):
$ qemu-img --help | grep virtio-blk-vhost-user | wc -l
1
You can copy a raw disk image file into a vhost-user-blk device like this:
$ qemu-img convert \
--target-image-opts \
-n \
test.img \
driver=virtio-blk-vhost-user,path=/tmp/vhost-user-blk.sock,cache.direct=on
The contents of the vhost-user-blk device can be saved as a qcow2 image file like this:
$ qemu-img convert \
--image-opts \
-O qcow2 \
driver=virtio-blk-vhost-user,path=/tmp/vhost-user-blk.sock,cache.direct=on out.qcow2
The size of the virtual disk can be read:
$ qemu-img info \
--image-opts \
driver=virtio-blk-vhost-user,path=/tmp/vhost-user-blk.sock,cache.direct=on
image: json:{"driver": "virtio-blk-vhost-user"}
file format: virtio-blk-vhost-user
virtual size: 4 GiB (4294967296 bytes)
disk size: unavailable
Other qemu-img sub-commands like bench and dd are also available for quickly accessing the vhost-user-blk device without running a virtual machine:
$ qemu-img bench \
--image-opts \
driver=virtio-blk-vhost-user,path=/tmp/vhost-user-blk.sock,cache.direct=on
Sending 75000 read requests, 4096 bytes each, 64 in parallel (starting at offset 0, step size 4096)
Run completed in 1.443 seconds.
Being able to access vhost-user-blk devices from qemu-img makes vhost-user-blk a little easier to work with.