34. Vhost_blk Sample Application

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.

34.1. Testing steps

This section shows the steps how to start a VM with the block device as fast data path for critical application.

34.2. Compiling the 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

34.2.1. Start the vhost_blk example

./vhost_blk -m 1024

34.2.2. Start the VM

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