在QEMU-KVM网络特性协商的过程中,涉及到四个主要模块:dpdk vhost_user, qemu:vhost_user, qemu:virtio-net, 和 guest virtio-net。这些模块协同工作以确保虚拟机的网络功能能够正确地与物理主机的网络环境集成。
dpdk vhost_user 是一个后端服务,它允许虚拟机直接访问物理网络设备,从而提高性能。
qemu:vhost_user 代理是 QEMU 中的一个组件,它与 dpdk 的 vhost_user 后端服务进行通信,协商网络特性。
qemu:virtio-net 代理则是 QEMU 中的另一个组件,它与虚拟机内部的 virtio-net 驱动程序进行通信。
最后,guest virtio-net 是虚拟机内部的网络驱动程序,负责处理虚拟机的网络流量。
在启动虚拟机时,这些组件会进行特性协商,以确定哪些网络功能是可用的。例如,它们可能会协商关于多队列支持、校验和卸载、TCP分段卸载(TSO)等特性。这个协商过程确保了虚拟机能够以最高效的方式使用主机的网络资源。
整体框架介绍
启动虚拟机时,前后端网络会进行feature协商。前端指的是guest内部的驱动,后端指的是dpdk中的vhost-user。但guest驱动不能直接和vhost_user协商,中间需要通过qemu这个中介。如下图:
如果qemu要完成一个中介的角色,那么qemu一定要实现两个代理。一个代理和dpdk进行沟通,另一个用来和guest沟通。如下图:
和dpdk协商,本质上是与dpdk中的vhost_user协商; 和qemu协商本质上是与guest中的virtio-net驱动协商。因此把qemu中用于和dpdk vhost_user协商的代理称为qemu:vhost_user,把qemu中用于和guest virtio-net协商的代理称为qemu:virtio_net。
示例代码
在QEMU-KVM网络特性协商的过程中,涉及到前端的guest驱动和后端的dpdk中的vhost-user之间的交互。这个过程需要通过QEMU作为中介来完成。以下是一个简化的示例代码,展示了如何在QEMU中设置网络特性协商:
// QEMU-KVM网络特性协商示例代码 // 假设我们有一个名为vhost_user的后端网络设备 // 这个设备是通过dpdk的vhost-user实现的 // qemu启动参数中指定vhost-user后端 char *qemu_args[] = { "qemu-system-x86_64", "-enable-kvm", "-name", "guest=vm1", "-cpu", "host", "-smp", "4", "-m", "2048", "-object", "memory-backend-file,id=mem,size=2048M,mem-path=/dev/hugepages,share=on", "-numa", "node,memdev=mem", "-mem-prealloc", "-netdev", "type=vhost-user,id=net1,chardev=char0,vhostforce", "-device", "virtio-net-pci,netdev=net1", NULL }; // qemu中介的代码部分负责启动vhost-user后端 // 并与之进行特性协商 // 这通常涉及到设置内存表、特性位和队列等 // 以下是QEMU中的代理部分的伪代码 void start_vhost_user_backend(char *backend_name) { // 初始化vhost-user后端 VhostUserBackend *vhost_user = init_vhost_user(backend_name); // 设置内存表 set_vhost_user_memory_table(vhost_user); // 获取并设置后端支持的特性 uint64_t features = get_vhost_user_supported_features(vhost_user); set_vhost_user_features(vhost_user, features); // 设置队列数 int queues = get_vhost_user_queues(vhost_user); set_vhost_user_queues(vhost_user, queues); // 启动vhost-user后端 start_vhost_user(vhost_user); } // guest驱动加载时,会写入VIRTIO_PCI_GUEST_FEATURES寄存器 // 这个操作会被QEMU捕获并传递给vhost_user_backend // QEMU会根据guest驱动和vhost_user_backend的协商结果 // 设置最终的网络特性 void set_guest_features(uint64_t guest_features) { // 获取vhost-user后端实例 VhostUserBackend *vhost_user = get_vhost_user_instance(); // 设置guest驱动支持的特性 set_vhost_user_guest_features(vhost_user, guest_features); } // 注意:这只是一个示例代码,实际的QEMU-KVM网络特性协商过程 // 更为复杂,涉及到多个组件和步骤。
常用步骤
在QEMU中,网络特性协商通常涉及以下步骤:
初始化Virtio设备:
在QEMU中,首先需要初始化virtio设备,这通常涉及到创建一个新的virtio-net设备实例。
设置特性位:
特性位是用来指示virtio设备支持哪些特性。这些位需要在QEMU和guest之间协商。
内存映射:
QEMU需要将guest的内存映射到它自己的地址空间,以便它可以访问virtio环形缓冲区。
启动vhost线程:
如果使用vhost后端,QEMU将启动一个或多个vhost工作线程来处理数据包的传输。
特性协商完成:
一旦特性协商完成,QEMU将通知guest,guest可以开始通过virtio-net设备发送和接收数据包。
运行虚拟机:文章来源:https://www.toymoban.com/news/detail-427160.html
最后,QEMU将运行虚拟机,虚拟机的网络驱动将开始使用协商的特性与物理网络交互。文章来源地址https://www.toymoban.com/news/detail-427160.html
到了这里,关于QEMU-KVM网络特性协商与虚拟机通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!