Skip to content

Virtio 设备实现全景

概述

virtio-devices 是 Hypervisor 的核心数据面模块。它把 guest 发起的 I/O 请求,通过 virtqueue、eventfd、后端 worker 串起来,最终完成一次设备访问。

如果你想快速建立全局认知,可以记住这条主线:

请求入队 -> 事件触发 -> 后端执行 -> 完成回填 -> 中断通知

目录与模块职责

文件主要职责
virtio-devices/src/lib.rsVirtioDevice trait 与通用设备框架
virtio-devices/src/net.rsvirtio-net 收发包路径
virtio-devices/src/block.rsvirtio-blk 读写与 flush 语义
virtio-devices/src/fs.rsvirtio-fs 与共享目录访问
virtio-devices/src/vsock.rsguest-host 套接字通道
virtio-devices/src/balloon.rs内存回收与回报机制
virtio-devices/src/pmem.rs持久内存映射设备

通用设备模型

每个设备都遵循统一生命周期:

  1. 配置阶段:暴露 feature bits 与队列布局
  2. 激活阶段:绑定内存、队列、事件通知
  3. 运行阶段:消费 descriptor chain
  4. 重置/快照阶段:导出或恢复内部状态

关键 trait(概念)

  • device_type():设备类型标识
  • activate(...):将设备切到可运行状态
  • reset():回到未激活状态
  • snapshot()/restore():支持快照恢复

请求生命周期(以 virtio-blk 为例)

关键关注点:

  • 描述符是否完整(header/data/status)
  • 方向是否合法(读写 buffer 权限)
  • 完成状态是否回填正确

网络路径(virtio-net)要点

virtio-net 通常有 RX/TX 队列。常见设计是:

  • TX:guest 发包 -> host 收包并注入 TAP/后端
  • RX:host 收包 -> 放入 guest 可用缓冲区

性能相关的三个旋钮:

  1. batch size(批处理大小)
  2. 中断合并/通知频率
  3. 限速器(rate limiter)配置

virtio-fs 与 vsock 在 Cube 场景中的意义

设备在 CubeSandbox 的典型用途
virtio-fs映射 guest 所需文件视图(模板/工作目录)
vsockguest agent 与 host 组件通信通道

对于“代码执行沙箱”场景,vsock 通常是控制消息主通道,virtio-fs 则承担文件访问主通道。

中断与事件通知模型

设备请求不是轮询处理,而是事件驱动:

  • guest kick -> host 通过 ioeventfd 感知
  • host 完成 -> 通过 irqfd 或中断控制器通知 guest

这也是定位“请求已处理但 guest 无响应”问题的关键排查面。

快照一致性要求

支持快照的设备必须满足:

  1. 可序列化内部状态(队列游标、配置、后端偏移)
  2. 可在 restore 时恢复到一致状态
  3. 能处理 in-flight 请求(清空、回滚或标记)

否则会出现“恢复后设备可见但不可用”的隐蔽故障。

常见故障排查清单

1) 请求没被消费

  • 检查 guest 是否正确 kick
  • 检查 eventfd 注册是否成功
  • 检查 worker 线程是否存活

2) 请求消费了但 guest 卡住

  • 检查 used ring 是否写回
  • 检查中断注入是否成功
  • 检查 status byte 是否按协议回填

3) 吞吐不稳定

  • 看 queue depth 是否过小
  • 看 batch 与中断频率是否失衡
  • 看后端 IO(磁盘/网络)是否成为瓶颈

推荐阅读路径

  1. virtio-devices/src/lib.rs(统一模型)
  2. virtio-devices/src/net.rs(实时 I/O)
  3. virtio-devices/src/block.rs(协议清晰、便于入门)
  4. virtio-devices/src/vsock.rs(Cube 控制链路关键)
  5. virtio-devices/src/fs.rs(文件通道与一致性)

小结

理解 virtio 的关键不是“设备种类多”,而是先吃透统一模型:队列、事件、后端、完成、中断。掌握这五个点,任何 virtio 设备都能快速定位和调优。