vDPA:支持 Linux 和 QEMU 中的块设备及内核VDPA块仿真设备vdpa-sim-blk源码分析
本文链接: https://cloud.tencent.com/developer/article/2436531
使用 libblkio、QEMU 存储守护进程和 VDUSE
vDPA 设备是一种遵循virtio 数据路径规范但具有特定于供应商的控制路径的设备。
vDPA 设备既可以物理位于硬件上,也可以通过软件模拟。
主机内核中只需要一个小型 vDPA 父驱动程序来处理控制路径。主要优点是所有 vDPA 设备都具有统一的软件堆栈:
- 用于用户空间或客户 virtio 驱动程序的vhost 接口(vhost-vdpa),例如在 QEMU 中运行的虚拟机
- virtio 接口(virtio-vdpa),用于在主机中运行的裸机或容器化应用程序
- 用于实例化设备和配置 virtio 参数的管理接口(vdpa netlink)
有用的资源
近年来,已经发表了许多博客文章和演讲,可以帮助您更好地了解 vDPA 和用例。我们在vdpa-dev.gitlab.io上 收集了其中一些;我建议您至少探索以下内容:
- vDPA内核框架介绍
- 介绍 VDUSE:virtio 的软件定义数据路径
块设备
vDPA 中的大部分工作是由网络设备驱动的,但近年来,我们也开发了对块设备的支持。
主要用例肯定是利用硬件直接模拟 virtio-blk 设备并支持不同的网络后端,例如 Ceph RBD 或 iSCSI。这是某些 SmartNIC 或 DPU 的目标,它们当然能够模拟 virtio-net 设备,但也能模拟用于网络存储的 virtio-blk。
vDPA 提供的抽象还使软件加速器成为可能,类似于现有的 vhost 或 vhost-user 设备。我们在 2021 年 KVM 论坛上讨论过这个问题。
我们在那次演讲中讨论了快速路径和慢速路径。当 QEMU 需要处理请求(例如支持实时迁移或执行 I/O 限制)时,它会使用慢速路径。在慢速路径期间,暴露给客户机的设备在 QEMU 中模拟。QEMU 利用 libblkio 中实现的驱动程序拦截请求并将其转发到 vDPA 设备。另一方面,当 QEMU 不需要干预时,快速路径就会发挥作用。在这种情况下,vDPA 设备可以直接暴露给客户机,绕过 QEMU 的模拟。
libblkio公开了用于在用户空间中访问块设备的通用 API。它支持多个驱动程序。我们将重点介绍QEMU 中块设备virtio-blk-vhost-vdpa使用的驱动程序virtio-blk-vhost-vdpa 。它目前仅支持慢速路径,但将来应该能够自动切换到快速路径。自 QEMU 7.2 以来,它支持 libblkio 驱动程序,因此您可以使用以下选项将 vDPA 块设备连接到虚拟机:
|
|
无论如何,为了充分利用 vDPA 硬件设备的性能,我们始终可以使用QEMU 提供的通用设备vhost-vdpa-device-pci,该设备支持任何 vDPA 设备并将其直接公开给客户机。当然,QEMU 无法在这种情况下拦截请求,因此其块层提供的一些功能(例如实时迁移、磁盘格式等)不受支持。从 QEMU 8.0 开始,您可以使用以下选项将通用 vDPA 设备连接到 VM:
|
|
在 2022 年 KVM 论坛上,Alberto Faria 和 Stefan Hajnoczi 介绍了 libblkio,而Kevin Wolf 和我讨论了它在 QEMU 存储守护进程 (QSD) 中的用法。
软件设备
vDPA 的一大优势是其强大的抽象性,支持在硬件和软件中实现 virtio 设备(无论是在内核还是用户空间中)。这种统一在单一框架下,设备对于 QEMU 而言是相同的,有助于无缝集成硬件和软件组件。
内核设备
关于内核设备,从 Linux v5.13 开始,存在一个专为开发和调试目的而设计的简单模拟器。它可通过vdpa-sim-blk内核模块使用,该模块模拟 128 MB 的 ramdisk。正如 KVM Forum 2021 上的演讲中所强调的那样,内核中的未来设备(类似于反复提出但从未合并的vhost-blk)可能会提供出色的性能。当硬件不可用时,这种设备可以用作替代方案,例如,促进任何系统中的实时迁移,无论目标系统是否具有 SmartNIC/DPU。
用户空间设备
相反,关于用户空间,我们可以使用 VDUSE。QSD 支持它,因此允许我们以这种方式导出 QEMU 支持的任何磁盘映像,例如导出vDPA 设备vduse0:
|
|
容器、虚拟机或裸机
如介绍中所述,vDPA 支持不同的总线,例如 vhost-vdpa和virtio-vdpa。驱动:vhost-vdpa, 这种灵活性使得可以通过总线将 vDPA 设备与虚拟机或用户空间驱动程序(例如 libblkio)一起使用。此外,virtio-vdpa驱动还允许通过总线与直接在主机上或容器内运行的应用程序进行交互。
iproute2中的工具vdpa可以通过netlink方便的管理vdpa设备,可以分配和释放这些设备。
从 Linux 5.17 开始,vDPA 驱动程序支持driver_ovveride。此增强功能允许在运行时进行动态重新配置,从而允许设备以这种方式从一条总线迁移到另一条总线:
|
|
例子
以下是关于如何将VDUSE和QEMU 存储守护进程 与虚拟机 ( QEMU) 或容器 ( podman) 结合使用的几个示例。这些步骤可轻松适应通过 vDPA 支持 virtio-blk 设备的任何硬件。
qcow2 镜像可用于主机应用程序和容器
|
|
使用 vDPA 设备启动 VM
|
|
virtio vdpa vduse linux qemu 会议 演讲
也可以看看
- SOCAT 现在支持 AF_VSOCK
- AF_VSOCK:提供嵌套虚拟机和环回支持
- QEMU 4.2 mmap(2)s 内核和 initrd
- KVM 论坛 2019:QEMU、Firecracker 和 Linux 中的 virtio-vsock
- 如何使用 QEMU/KVM 测量 Linux VM 的启动时间
vhost-vdpa-device-pci与virtio-blk-vhost-vdpa对比
QEMU设备类型 | 快路径 | QEMU拦截请求 |
---|---|---|
vhost-vdpa-device-pci (更通用) | 支持 | 不支持 |
virtio-blk-vhost-vdpa(与libblkio配合) | 不支持 | 支持(实时迁移,磁盘格式,IO流控等) |
Linux vdpa-sim-blk设备源码分析
加载模块
|
|
添加设备及IO处理函数(工作队列)
|
|
实现其vdpa回调函数
|
|
VDPA总线及操作记录
|
|
参考
https://stefano-garzarella.github.io/posts/2024-02-12-vdpa-blk/
kernel: drivers/vdpa/vdpa_sim/vdpa_sim_blk.c
晓兵(ssbandjl)
博客: https://cloud.tencent.com/developer/user/5060293/articles | https://logread.cn | https://blog.csdn.net/ssbandjl | https://www.zhihu.com/people/ssbandjl/posts
https://chattoyou.cn(吐槽/留言)
DPU专栏
https://cloud.tencent.com/developer/column/101987
技术会友: 欢迎对DPU/智能网卡/卸载/网络,存储加速/安全隔离等技术感兴趣的朋友加入DPU技术交流群
weixin: ssbandjl
公众号: 云原生云
- 原文作者:晓兵
- 原文链接:https://logread.cn/post/linux/qemu_vdpa_sim_blk/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。