QEMU-KVM网络特性协商与虚拟机通信

这篇具有很好参考价值的文章主要介绍了QEMU-KVM网络特性协商与虚拟机通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在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-KVM网络协商,DPDK vhost-user,virtio-net驱动,虚拟机通信

如果qemu要完成一个中介的角色,那么qemu一定要实现两个代理。一个代理和dpdk进行沟通,另一个用来和guest沟通。如下图:

QEMU-KVM网络协商,DPDK vhost-user,virtio-net驱动,虚拟机通信

和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中,网络特性协商通常涉及以下步骤:

  1. 初始化Virtio设备:

    • 在QEMU中,首先需要初始化virtio设备,这通常涉及到创建一个新的virtio-net设备实例。

  2. 设置特性位:

    • 特性位是用来指示virtio设备支持哪些特性。这些位需要在QEMU和guest之间协商。

  3. 内存映射:

    • QEMU需要将guest的内存映射到它自己的地址空间,以便它可以访问virtio环形缓冲区。

  4. 启动vhost线程:

    • 如果使用vhost后端,QEMU将启动一个或多个vhost工作线程来处理数据包的传输。

  5. 特性协商完成:

    • 一旦特性协商完成,QEMU将通知guest,guest可以开始通过virtio-net设备发送和接收数据包。

  6. 运行虚拟机:

    • 最后,QEMU将运行虚拟机,虚拟机的网络驱动将开始使用协商的特性与物理网络交互。文章来源地址https://www.toymoban.com/news/detail-427160.html

到了这里,关于QEMU-KVM网络特性协商与虚拟机通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python可视化管理kvm虚拟机(使用libvirt、qemu连接虚拟机)

    对于云计算的实践,在虚拟机上面布置kvm虚拟机后使用python调用libvirt库进行远程可视化管理,实现输出虚拟机信息、新建虚拟机、删除虚拟机等功能,并在虚拟机集群上面运行mpi代码。 用pycharm专业版连接kvm的步骤见本文章。 mpi代码见本文章。

    2024年02月16日
    浏览(39)
  • qemu+kvm安装银河麒麟V10SP1 arm64 虚拟机

    系统镜像 Kylin-Desktop-V10-SP1-Release-2107-arm64.iso QEMU_EFI.fd(下载地址 http://releases.linaro.org/components/kernel/uefi-linaro/16.02/release/qemu64/QEMU_EFI.fd) 注:麒麟系统要求磁盘大小在50G以上. 参数说明: -m 4096 指定内存大小,单位MB -cpu cortex-a72 CPU 型号 -smp 8,cores=8,threads=1,sockets=1 1颗CPU,8核8线

    2024年01月21日
    浏览(103)
  • KVM 虚拟化技术高级特性详解

    KVM高级功能包括半虚拟化驱动、VT-d、SR-IOV、热插拔、动态迁移、KSM、AVX、cgroups、从物理机或虚拟机中迁移到KVM,以及QEMU监控器和qemu-kvm命令行的各种选项的使用。 1、半虚拟化驱动 1. virtio概述 KVM是必须使用硬件虚拟化辅助技术(如Intel VT-x、AMD-V)的Hypervisor,在CPU运行效率方

    2024年01月23日
    浏览(39)
  • 【KVM虚拟化】· KVM中的网络

      目录 🍎虚拟机的网络模式 🍒网络配置文件 🍒virsh查看命令 🍎基于NAT的虚拟网络 🍎基于网桥的虚拟网络 🍎基于隔离的虚拟网络     🦐博客主页:大虾好吃吗的博客     🦐专栏地址:KVM虚拟化专栏 基于NAT(Network Address Translation)的虚拟网络 基于网桥(Bridge)的虚拟

    2024年02月06日
    浏览(66)
  • qemu虚拟机配置网络

    qemu虚机的网络介绍及原理可参考前人文章:Linux 内核调试 七:qemu网络配置_lqonlylove的博客-CSDN博客 这里只简单梳理下操作流程,以便快速实现网络互通。 1.宿主机创建 tap0 [root@localhost ~]# ifconfig [root@localhost ~]# ip tuntap add dev tap0 mode tap [root@localhost ~]# ip link set dev tap0 up [root@lo

    2024年02月14日
    浏览(41)
  • kvm网络虚拟化介绍

    在QEMU中,主要给出了客户机提供了4种不同的网络配置方案: 1、基于网桥(Bridge)的虚拟化网卡模式 2、基于NAT的虚拟网络模式 3、QEMU内置的用户网络模式 4、直接分配网络设置模式 网桥和NAT是基于linux-bridge实现的软件虚拟网络模式,QEMU是QEMU软件虚拟的网络模式,第四种网络模

    2024年02月14日
    浏览(52)
  • kvm介绍、kvm存储池、kvm快照和克隆、kvm虚拟机基本管理和网络管理

    目录 什么是kvm 云计算的定义 云计算的服务类型 虚拟化技术定义 虚拟化的两种方式 kvm虚拟化的原理 kvm虚拟化网络解析 kvm存储池 1、图形的方式去创建使用存储池​编辑 ​编辑 2、命令的方式去创建使用存储池  存储池相关管理命令 kvm快照和克隆 1、用图形方式做快照   恢

    2024年02月08日
    浏览(34)
  • kvm介绍、kvm存储池、kvm快照和克隆、kvm虚拟机基本管理和网络管理 kvm存储池

    目录 什么是kvm 云计算的定义 云计算的服务类型 虚拟化技术定义 虚拟化的两种方式 kvm虚拟化的原理 kvm虚拟化网络解析 kvm存储池 1、图形的方式去创建使用存储池​编辑 ​编辑 2、命令的方式去创建使用存储池  存储池相关管理命令 kvm快照和克隆 1、用图形方式做快照   恢

    2023年04月18日
    浏览(33)
  • kvm介绍、kvm存储池、kvm快照和克隆、kvm虚拟机基本管理和网络管理 kvm存储池

    目录 什么是kvm 云计算的定义 云计算的服务类型 虚拟化技术定义 虚拟化的两种方式 kvm虚拟化的原理 kvm虚拟化网络解析 kvm存储池 1、图形的方式去创建使用存储池​编辑 ​编辑 2、命令的方式去创建使用存储池  存储池相关管理命令 kvm快照和克隆 1、用图形方式做快照   恢

    2023年04月18日
    浏览(30)
  • 基于x86架构的CentOS7虚拟机通过qemu安装ARM架构CentOS7虚拟机_centos7 arm 网络配置

    【原文连接】基于x86架构的CentOS7虚拟机通过qemu安装ARM架构CentOS7虚拟机_centos7 arm_redrose2100的博客-CSDN博客 试过很多版本的在win10系统直接qemu安装arm版linux都失败了,也看到了别人也说这个方式不行得用虚拟机套虚拟机才行的方式,因为我没有ubunto所以搜到大佬的centos虚拟机套

    2024年02月09日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包