The vhost_blk sample application implemented a simple block device, which used as the backend of Qemu vhost-user-blk device. Users can extend the exist example to use other type of block device(e.g. AIO) besides memory based block device. Similar with vhost-user-net device, the sample application used domain socket to communicate with Qemu, and the virtio ring (split or packed format) was processed by vhost_blk sample application.
The sample application reuse lots codes from SPDK(Storage Performance Development Kit, https://github.com/spdk/spdk) vhost-user-blk target, for DPDK vhost library used in storage area, user can take SPDK as reference as well.
This section shows the steps how to start a VM with the block device as fast data path for critical application.
To compile the sample application see Compiling the Sample Applications.
The application is located in the examples sub-directory.
You will also need to build DPDK both on the host and inside the guest
./vhost_blk -m 1024
qemu-system-x86_64 -machine accel=kvm \
-m $mem -object memory-backend-file,id=mem,size=$mem,\
mem-path=/dev/hugepages,share=on -numa node,memdev=mem \
-drive file=os.img,if=none,id=disk \
-device ide-hd,drive=disk,bootindex=0 \
-chardev socket,id=char0,reconnect=1,path=/tmp/vhost.socket \
-device vhost-user-blk-pci,ring_packed=1,chardev=char0,num-queues=1 \
...
Note
You must check whether your Qemu can support “vhost-user-blk” or not, Qemu v4.0 or newer version is required. reconnect=1 means live recovery support that qemu can reconnect vhost_blk after we restart vhost_blk example. ring_packed=1 means the device support packed ring but need the guest kernel version >= 5.0