contrib 中的 vhost-user 守护进程

QEMU 的 contrib 提供若干 vhost-user 后端 守护进程,许多在此功能最初 加入时编写。应考虑 rust-vmm 的 vhost-device repository 等其他实现 是否更适合生产。

vhost-user-block:块设备

此后端将普通文件或块设备作为简单块设备暴露给客户机。通常更应选择 QEMU 存储守护进程,它支持多种存储模式及包括 vhost-user 的多个接口。

vhost-user-gpu:GPU 设备

提供半虚拟化 GPU 和显示控制器。若需要最新功能,通常应选内部 VirtIO GPU,也可使用 rust-vmm 的 vhost_device_gpu。

vhost-user-input:输入模拟

Virtio input 是用于输入事件的半虚拟化设备。

说明

该实现与轮询输入设备的守护进程配合,将事件传给客户机。

QEMU 后端位于 contrib/vhost-user-input。

Linux 内核支持

客户机内核需要启用 CONFIG_VIRTIO_INPUT。

示例

先启动后端:

host# vhost-user-input --socket-path=input.sock       \
    --evdev-path=/dev/input/event17

QEMU 需要 chardev 套接字通信,并通过 共享内存 访问 VirtIO 队列。

host# qemu-system                                                             \
    -chardev socket,path=/tmp/input.sock,id=mouse0                            \
    -device vhost-user-input-pci,chardev=mouse0                               \
    -m 4096                                                                   \
    -object memory-backend-file,id=mem,size=4G,mem-path=/dev/shm,share=on     \
    -numa node,memdev=mem                                                     \
    ...

vhost-user-scsi:SCSI 控制器

将 iSCSI 设备代理到虚拟 SCSI 控制器。

vhost-user-bridge:网络桥

提供 vhost-user 网络后端,即服务器,用作测试真实互联网流量的开发工具。

示例

单个 QEMU 同时运行 slirp 用户网络栈和 vhost-user 客户端时:

先启动桥:

$ vhost-user-bridge -u /tmp/vubr.sock \
                    -l 127.0.0.1:4444 \
                    -r 127.0.0.1:5555

再启动 QEMU:

$ qemu-system-x86_64 \
      -m 4G \
      -object memory-backend-memfd,id=mem0,size=4G,share=on,prealloc=on \
      -numa node,memdev=mem0 \
      -chardev socket,id=char0,path=/tmp/vubr.sock \
      -netdev vhost-user,id=vhost0,chardev=char0,vhostforce=on \
      -device virtio-net-pci,netdev=vhost0 \
      -netdev socket,id=udp0,udp=localhost:4444,localaddr=localhost:5555 \
      -netdev user,id=user0 \
      -netdev hubport,id=hub0,hubid=0,netdev=udp0 \
      -netdev hubport,id=hub1,hubid=0,netdev=user0 \
      ...