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.