【virtio-networking 和 vhost-net 简介】

文章目录

  • Virtio 基本构建块
  • Virtio spec 和 vhost 协议
  • Vhost-net/virtio-net architecture
  • Virtio-networking and OVS
  • 总结
  • 参考链接

Virtio 是作为虚拟机 (VM)访问简化device(如块设备和网络适配器)的 标准化开放接口而开发的。Virtio-net是一种虚拟以太网卡,是virtio迄今为止支持的最复杂的device。

在这篇文章中,我们将基于在host内核和 VM guest内核之间建立接口,提供 virtio 网络架构的高级解决方案概述。我们将介绍基本的构建块,包括KVM,qemu和libvirt。我们将介绍virtio规范和vhost协议,以及用于连接不同VM和连接外部世界的Open vSwitch(OVS)。本文中描述的基于vhost-net/virtio-net的架构是许多virtio-networking架构中的第一个,这些架构将在一系列帖子中介绍,这些架构因其性能,应用程序的易用性和实际部署而有所不同。

在阅读完这篇文章后,你应该对所提到的术语有一个清晰的了解,以及在虚拟机中运行的应用程序如何将数据包传输到在其他虚拟机上运行的应用程序和外部世界。这些术语将是下一篇文章的基础。

Virtio 基本构建块

guest VM 或guest是在物理计算机上安装、执行和托管的 VM。托管guest VM 的计算机称为host,它为guest提供资源。客户机具有通过虚拟机管理程序在host操作系统上运行的单独操作系统。例如,host将为guest提供虚拟 NIC,以便guest计算机感觉好像它使用的是真正的 NIC,而实际上它使用的是虚拟 NIC。

以下构建基块创建了 virtio 稍后连接到的环境:

  1. KVM - 基于内核的虚拟机,允许 Linux 作为管理程序运行,因此主机可以运行多个隔离的虚拟环境,称为Guest。KVM 基本上为 Linux 提供管理程序功能。这意味着管理程序组件,如内存管理器、调度器、网络堆栈等,作为 Linux 内核的一部分提供。VMs 是由标准 Linux 调度器与专用虚拟硬件(如网络适配器)调度的常规 Linux 进程。
  2. QEMU - 一个托管的虚拟机监视器,通过仿真为guest计算机提供一组不同的硬件和device型号。QEMU 可与 KVM 配合使用,利用硬件扩展以接近本机的速度运行虚拟机。guest通过 qemu 命令行界面 (CLI) 执行。CLI 提供了为 QEMU 指定所有必要配置选项的功能。
  3. Libvirt - 一个将XML格式的配置转换为qemu CLI调用的接口。它还提供了一个管理守护进程来配置子进程(如 qemu),因此 qemu 不需要 root 权限。例如,当Openstack Nova想要启动一个VM时,它使用libvirt为每个VM调用一个qemu进程来启动每个VM的qemu进程。

下图显示了这三个构建基块如何组合在一起:
在这里插入图片描述

Host和Guest都包含内核空间和用户空间。如图所示,KVM在Host内核空间中运行,而libvirt在Host用户空间中运行。

Guest虚拟机在 qemu 进程内部运行,qemu 进程只是在host用户空间上运行的进程,并与 libvirt(用户空间应用程序)和 KVM(host内核)进行通信。

将为每个guest VM 创建一个 qemu 进程,因此,如果创建 N 个 VM,则将具有 N 个 qemu 进程,libvirt 将与每个进程进行通信。

Virtio spec 和 vhost 协议

在谈论 virtio-networking 时,我们可以将讨论分为两层:

  1. 控制平面 - 用于host和guest之间的capability交换协商,以建立和终止数据平面。
  2. 数据平面 - 用于在host和guest之间传输实际数据(数据包)。

区分这些层很重要,因为它们具有不同的要求(例如性能)和不同的实现,如本文和后续帖子所示。

从根本上说,数据平面需要尽可能高效地快速移动数据包,而控制平面需要尽可能灵活地支持未来架构中的不同device和vendor。

如引言中所述,virtio被开发为guest访问host上device的接口。我们可以将 virito 分为两部分:

  1. virtio spec - 由 OASIS 维护的 virtio 规范定义了如何在guest和host之间创建控制平面和数据平面。例如,数据平面由规范中详细介绍的缓冲区和环布局组成。
  2. vhost 协议 - 一种协议,允许**将 virtio 数据平面实现卸载到另一个元素(用户进程或内核模块)**以增强性能。

virtio 的控制平面是在基于 virtio 规范的 qemu 进程中实现的,但数据平面不是。因此,问题是为什么数据平面没有在qemu进程中以基于virtio规范的类似方式实现?
答案是性能

如果我们简单地在qemu中实现virtio规范数据平面,我们将为从内核到guest的每个数据包提供一个上下文切换,反之亦然。这是一个代价高昂的操作,会增加延迟并需要更多的处理时间(请记住,qemu是另一个Linux进程),因此如果可能的话,我们希望避免它。
这就是vhost协议发挥作用的地方,使我们能够实现一个数据平面,直接从内核(host)到guest,绕过qemu进程。

但是,vhost协议本身仅描述如何建立数据平面。无论谁实现它,还需要实现用于描述数据缓冲区(host和guest)和实际发送/接收数据包的环形布局

如后面各节所述,vhost协议可以在内核(vhost-net)或用户空间(vhost-user)中实现。本文中描述的 vhost-net/virtio-net 体系结构侧重于内核实现,也称为 vhost-net。

Vhost-net/virtio-net architecture

当我们谈论virtio接口时,我们有一个后端组件和一个前端组件:

  • 后端组件是 virtio 接口的host端
  • 前端组件是 virtio 接口的guest端

在 vhost-net/virtio-net 体系结构中,组件如下所示:

  • vhost-net 是在host内核空间中运行的后端
  • virtio-net 是在guest内核空间中运行的前端

下图显示了如何将virtio后端和前端映射到大图:
在这里插入图片描述

需要澄清的几点:

  • 由于vhost-net和virtio-net都在运行host和guest内核空间,我们也称它们为driver,所以如果有人写“vhost-net driver”(同样的事情),请不要混淆。
  • 我们在后端和前端之间有一个单独的控制平面和数据平面。如前所述,控制平面只是为vhost-net内核模块和qemu进程实现virtio规范,以进行通信,然后将其传递给guest并最终到达virtio-net。vhost-net使用vhost协议来建立框架,然后用于数据平面,以使用共享内存区域直接转发host和guest内核之间的数据包。

实际上,数据平面通信,即接收(RX)和传输(TX),是通过专用队列完成的。
对于每个guest,我们可以关联多个虚拟 CPU (vCPU),并且 RX/TX 队列是按 CPU 创建的,因此具有 4 个 vCPU 的更详细的示例如下所示(为简单起见,删除了控制平面):
在这里插入图片描述
注:一个vCPU对应一组RX和TX。

Virtio-networking and OVS

到目前为止,我们已经描述了guest如何使用 virtio 网络接口将数据包传递到host内核。为了将这些数据包转发给在同一host上或host外部(例如 Internet)上运行的其他guest,我们使用 OVS。

OVS 是一种软件交换机,可在内核内部启用数据包转发。它由一个用户空间部分和一个内核部分组成:

  • 用户空间 - 包括数据库(ovsdb-server)和用于管理和控制交换机的OVS守护程序(ovs-vswitchd)。
  • 内核空间 - 包括负责数据路径或转发平面的 ovs 内核模块。

OVS 控制器与数据库服务器和内核转发平面进行通信。要将数据包推入和推送出 OVS,我们使用 Linux 端口。在我们的例子中,我们有一个端口将OVS内核转发平面连接到物理NIC,而另一个端口连接到vhost-net后端。
请注意,我们正试图简化事情,因为在实践中,将有多个NIC通过多个端口连接到OVS,并且运行多个VM,因此多个端口连接到多个vhost-net后端。
回到 virtio-networking,下图显示了 OVS 如何连接到 virtio:
在这里插入图片描述

请注意所提到的用于将host外部的 OVS 连接到 vhost-net 以及从那里连接到 virtio-net 和 VM 中运行的应用的端口。

vhost-net/virtio-net 架构概述到此结束,该架构基于host内核、guest内核和内核中运行的 OVS

总结

在这篇文章中,我们触及了virtio网络生态系统的表面,向您介绍了virtio网络使用的虚拟化和网络的基本构建块。我们已经简要介绍了 virtio 规范和 vhost 协议,回顾了用于实现 virtio 接口的前端和后端架构,并带您了解了 vhost-net(host内核)与 virtio-net(guest内核)通信的 vhost-net/virtio-net 架构。

在试图解释事物时,我们遇到的一个根本性挑战是历史上术语的超载。例如,virtio-net 既指 virtio 规范中的 virtio 网络device实现,也指 vhost-net/virtio-net 体系结构中描述的guest内核前端。我们试图通过解释术语的上下文并使用virtio-net仅描述guest内核前端来解决这个问题。

正如将在后面的文章中解释的那样,virtio规范网络device还有其他基于DPDK和不同硬件卸载技术的实现,这些技术都在virtio网络的涵盖范围下。

接下来的两篇文章旨在更深入地了解 vhost-net/virtio-net 体系结构。一篇文章将面向架构师,提供对vhost-net/virtio-net的技术深入研究,并解释如何在实践中实现数据平面和控制平面。另一篇面向开发人员的帖子将是一个实践会话,包括Ansible脚本,以便能够尝试vhost-net/virtio-net架构。

如果您更喜欢高级概述,我们建议您留意即将在未来几周内发布的virtio网络和DPDK介绍。

为了跟上virtio网络社区的步伐,我们邀请您注册virtio网络邮件列表。这是一个公共邮件列表,您可以通过Mailman页面注册。

参考链接

https://www.redhat.com/en/blog/introduction-virtio-networking-and-vhost-net

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/472452.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大众EA111发动机

大众EA111发动机_什么是大众EA111发动机_太平洋汽车百科 大众EA111发动机_什么是大众EA111发动机_太平洋汽车百科 大众的EA111系列发动机是大众公司小排量发动机的主力,有1.2L、1.4L、1.6L三种排量。大众的EA111系列发动机融合了缸内直喷、涡轮增压等先进技术&…

鸿蒙Harmony应用开发—ArkTS-转场动画(页面间转场)

当路由进行切换时,可以通过在pageTransition函数中自定义页面入场和页面退场的转场动效。详细指导请参考页面转场动画。 说明: 从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 为了实现更好的转场效…

稀碎从零算法笔记Day22-LeetCode:存在重复元素 II

题型:哈希表、数组 链接:219. 存在重复元素 II - 力扣(LeetCode) 来源:LeetCode 题目描述 给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] …

使用vitepress生成文档博客简单demo

先创建个空目录(就是你的项目) 安装vitepress 就是在你刚创建的目录里安装vitepress: npm add -D vitepress初始化项目 还是在你刚操作的目录里执行: npx vitepress init然后按照命令行的指引一步一步走就好了 注意VitePress的项目位置&#xff0c…

外卖项目:实现用户端微信登录(debug)

文章目录 一、业务描述二、接口设计三、表结构设计四、配置文件五、断点调试 一、业务描述 用户进入到小程序的时候,微信授权登录之后才能点餐。需要获取当前微信用户的相关信息,比如昵称、头像等,这样才能够进入到小程序进行下单操作。是基…

SpringBoot如何写好单元测试

🐓序言 Spring中的单元测试非常方便,可以很方便地对Spring Bean进行测试,包括Controller、Service和Repository等Spring Bean进行测试,确保它们的功能正常,并且不会因为应用的其他变化而出现问题。 🐓单元测…

完全理解ARM启动流程:Uboot-Kernel

内容共计5W字数,但是我还是很多地方说的不够尽兴。那么下次聊! 前言 bootloader是系统上电后最初加载运行的代码。它提供了处理器上电复位后最开始需要执行的初始化代码。 PC机上引导程序一般由BIOS开始执行,然后读取硬盘中位于MBR(Main Bo…

Vue核心知识点 -Vue2响应式系统是基于什么实现的、以及会产生什么问题和解决方案

一、概念 在Vue 2中,响应式系统是基于Object.defineProperty实现的。它通过劫持对象的属性来实现数据的响应式更新。 当你将一个对象传递给Vue实例的data选项时,Vue会遍历对象的每个属性,并使用Object.defineProperty方法将其转换为getter和s…

YOLO_you only look once

前言 计算机图形学的课程即将结束,我需要提交一份关于YOLO模型的学习报告。在这段时间里,我对YOLO进行了深入的学习和研究,并记录下了我的学习过程和心得体会。本文将详细介绍YOLO模型的原理、优缺点以及应用领域,希望能够为后续…

nodejs pkg打包跨平台执行文件,带.node插件(sharp、sqlite3)

在nodejs引入的第三方库中,大部分插件都是nodejs原生开发,使用pkg可以快速打包,生成windows、linux(ubuntu、centOS等)、麒麟系统下面执行文件。遇到了第三方插件gdal、sharp、sqlite3,在webstorm中打包生成执行文件,跨平台部署的时候会出现找不到###.node文件,需要获取部…

多源BFS - 01矩阵

LCR 107. 01 矩阵 到最近的0的距离,对每一个非0的位置进行搜索,找到最短的距离即可,但如果对每一个非0的点都进行一次搜索的话,肯定是会超时的。这里可以考虑,将所有0点想象成一个0点(超级0)。然后找到所有1点到超级0的…

基于ssm的旅游管理系统

技术:ssmmysqljsp 一、背景 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。所以各行业,尤其是规模较大…

Nginx鉴权、限流

文章目录 一、Nginx鉴权1. 依赖模块2. Nginx配置3. Rest接口 二、Nginx限流1. 简介2. 控制速率2. 控制连接数 一、Nginx鉴权 1. 依赖模块 依赖模块 http_auth_request_module验证是否安装 nginx -V 2>&1 | grep -- http_auth_request_module2. Nginx配置 server {li…

Python模块-基础知识

Python模块-基础知识 1.模块分类: (1)自定义模块: 如果你自己写一个py文件,在文件内写入一堆函数,则它被称为自定义模块,即使用python编写的.py文件 (2)第三方模块&…

函数栈帧的创建和销毁 - 局部变量|函数传参|函数调用|函数返回|图文详解

目录 1.寄存器EBP和ESP 2.函数栈帧的创建 3.函数的调用 4. 函数栈帧的销毁 函数栈帧(function stack frame)是在函数调用期间在栈上分配的内存区域,用于存储函数的局部变量、参数、以及用于函数调用和返回的相关信息。每当函数被调用时&a…

品牌方年度抖音店铺打造流量运营孵化方案

【干货资料持续更新,以防走丢】 品牌方年度抖音店铺打造流量运营孵化方案 部分资料预览 资料部分是网络整理,仅供学习参考。 PDF共120页(完整资料包含以下内容) 目录 抖音年度短视频直播运营规划方案 1. 帐号视频发布规划 问…

C++进阶:二叉搜索树介绍、模拟实现(递归迭代两版本)及其应用

上次介绍完多态后:C进阶:详解多态(多态、虚函数、抽象类以及虚函数原理详解) 也是要开始继续学习了 文章目录 1.二叉搜索树1.1概念1.2二叉搜索树特性1.3 二叉搜索树的操作 2.模拟实现2.1项目文件规划2.2基本结构2.3各种接口、功能…

【数值模型系列】模拟区域网格设置工具WRFDomainWizard网页版使用介绍

大气数值模型首先需要进行模拟区域参数设置,这一过程可以使用WRF官网提供的WRFDomainWizard软件工具,也可以使用QGIS/GIS4WRF,甚至可以手动设置多次调整(不推荐但不少人使用)。本文介绍WRFDomainWizard工具的网页版&am…

六、循环结构

在python当中有两类循环结构:for循环和while循环 一、遍历for循环 for循环首先判断遍历对象中是否有元素,在依次遍历 for循环常与range()函数使用 for i in range(1,10,):#range()函数依次遍历1~10但不包括10print(i,end ) p…

《尚品甄选》:后台系统——通过面向切面编程AOP,实现记录日志功能

文章目录 一、记录日志的意义二、日志数据表结构三、记录日志思想四、切面类环境搭建五、保存日志数据 一、记录日志的意义 后台管理系统记录操作日志的意义非常重要,主要体现在以下几个方面: 安全性:操作日志可以记录管理员操作行为&#…