vhost-user 后端

vhost-user 让 VirtIO 请求在 QEMU 之外处理,需要以下组成部分。

vhost-user 设备

这些简单的桩设备让客户机能看到 VirtIO,代码大多为样板。各设备通过 chardev 选项引用 --chardev 的 ID,由其套接字连接 vhost-user 守护进程。

各设备都有 virtio-mmio 和 virtio-pci 变体,按平台选择总线。

vhost-user 设备

设备

类型

说明

vhost-user-blk

块存储

QEMU 存储守护进程

vhost-user-fs

文件存储驱动

virtiofsd

vhost-user-gpio

将 GPIO 引脚代理到主机

vhost-device-gpio

vhost-user-gpu

GPU 驱动

vhost-device-gpu 或 vhost-user-gpu:GPU 设备

vhost-user-i2c

将 I2C 设备代理到主机

vhost-device-i2c

vhost-user-input

通用输入驱动

vhost-device-input 或 vhost-user-input:输入模拟

vhost-user-rng

熵驱动

vhost-device-rng

vhost-user-scmi

系统控制和管理接口

vhost-device-scmi

vhost-user-snd

音频设备

vhost-device-sound

vhost-user-scsi

SCSI 存储

vhost-user-scsi:SCSI 控制器

vhost-user-vsock

套接字通信

vhost-device-vsock

vhost-user-spi

将 SPI 设备代理到主机

vhost-device-spi

vhost-user-rtc

实时时钟

vhost-device-rtc

列表并不穷尽,任何实现对应设备且符合协议的后端都应可用。

vhost-user-test-device

这是供专家开发新后端的通用设备,用户需指定全部参数,包括:

  • 设备 virtio-id

  • 所需 num_vqs 和 vq_size

  • 如需配置空间,指定 config_size

备注

适合开发,但不推荐生产使用。

vhost-user 守护进程

独立进程通过套接字按 Vhost-user 协议 与 QEMU 连接。项目可按配置 构建若干守护进程,也可使用任何满足对应设备规范的实现。

共享内存对象

守护进程需访问客户机地址空间中的 VirtIO 队列,通过 memory-backend-file、 memory-backend-memfd 或 memory-backend-shm 实现。协议协商时经套接字传入 可访问对象的文件描述符。

目前共享对象大小必须与 -m 定义的主内存一致。

示例

先启动守护进程。

$ virtio-foo --socket-path=/var/run/foo.sock $OTHER_ARGS

再启动 QEMU,指定设备、chardev 和内存对象。

$ qemu-system-x86_64 \
    -m 4096 \
    -chardev socket,id=ba1,path=/var/run/foo.sock \
    -device vhost-user-foo,chardev=ba1,$OTHER_ARGS \
    -object memory-backend-memfd,id=mem,size=4G,share=on \
    -numa node,memdev=mem \
      ...