前言: 虚拟化场景下的网卡虚拟化,就是让虚拟机觉得自己有网卡。就有了e1000/rtl8139为代表的物理网卡软件模拟实现;为了加速Guest和Host之间的数据交换速度,就有了virtio网卡;再virtio的基础上,为了减少qemu进程和host os之间的数据拷贝,就有了vhost-net。这几种情况下,都是完全使用软件模拟的网卡,使用TAP技术,虚拟化出来net device,再把对应的net device接入到网桥上,这样在虚拟机内存就可以向外部写数据了。 还有一类就是物理网卡提供了虚拟化能力。比如ixgbe提供了sriov能力。那么物理网卡虚拟化成多块网卡,再把虚拟网卡passthrough给虚拟机。 再有就是DPDK这种类型的玩法。 下面重点看虚拟网卡的实现原理。 分析: 1,PCI device QEMU虚拟化的440fx主板,网卡作为PCI Device会连接在PCI bus上。

用libvirt配置网卡的时候,可以指定PCI网卡的地址,例如<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> 如果不指定,libvirt会自动选择一个空的slot配置给网卡。 2,e1000/rtl8139的实现 Guest在遍历PCI设备的时候,扫描到<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>的时候,读对应的PCI config,就会发现一个e1000网卡(以e1000为例)。Guest使用PIO,MMIO和PCI 设备进行交互。如下图,

看数据流向,例如虚拟机中发送了一个packet,那么就会通过PIO/MMIO操作操作对应的PCI设备,把数据填写到了对应的register中;QEMU截获到对应的操作,读取对应的register中的数据,再组织起来,然后写给Host OS的TAP设备。TAP设备把数据路由到BRIDGE,BRIDGE再把数据路由到NIC。数据包就发送出去了。 3,virtio-net e1000/rtl8139类型的网卡,CPU会把很多时间花费在写register,读register上。而且Guest在写register的时候,会让vm陷入异常,退出VM mode。 在虚拟化的场景下,VM的内存,和QEMU的控制代码,在同一个进程中,就意味着,内存可以互相访问。 (免费订阅,永久学习)学习地址: Dpdk/网络协议栈/vpp/OvS/DDos/NFV/虚拟化/高性能专家-学习视频教程-腾讯课堂

那么virtio场景下的数据流向,就会变得短一些了:虚拟机中发送的packet,放到了虚拟机的内存(VringBuf)中。然后继续使用PIO访问,那么,QEMU就会截获到PIO操作。注意,这个PIO操作只需要写16bit就可以了,只是告诉QEMU有数据了。然后QEMU计算出来 VringBuf的HVA,把数据再写到TAP网卡中。可见,在virtio通信的过程中,是标准的PCI设备访问,不过差别就在于PIO做控制用,只需要传递少量的数据,大部分的数据通过共享内存实现。 在这个过程中,Guest中的driver没有任何一个地方需要判断自己是否跑在VM中,Host在加载Guest的时候,也不会修改Guest的virtio的二进制代码。Guest访问virtio网卡,也是使用PIO访问的标准的PCI设备。所以,KVM下的virtio为什么要叫半虚拟化设备? 有人会说,windows访问virtio网卡的时候,需要安装驱动。那么访问usb3.0的时候,也需要安装驱动,那么usb3.0也是半虚拟化设备? 同样的逻辑,是不是只能跑在虚拟机中?作者觉得是有机会跑在物理机上的。尤其是在嵌入式领域,比如你的手机,手机厂商提供的参数中内存是2G,但是实际可用的内存只会有1.6G,或者再多一些的样子。因为其他的内存被分配给了基带,硬件decode上。它们和CPU之间的通信,就是在共享内存。 4,vhost-net virtio已经优化掉了虚拟网卡路径上耗时最大的部分。但是,还有优化的空间:从Qemu把VringBuf中的数据写进了TAP网卡。这个过程是不是也可以优化? VM和QEMU在同一个进程中,所以可以共享内存。但是它们都在Host OS上,Host OS当然可以访问主机上的内存。

那么,数据路径就是:VM发送packet,写到了VringBuf中,通知Vhost-netdriver,Vhost-net计算出来Vringbuf的地址,直接填写给TAP设备。 Vhost-net减少了QEMU进程执行write系统调用的那次从user mode拷贝数据到kernel mode的过程。所以也叫zero copy。 5,virtio notify

Guest 在kick的时候,会执行到vp_notify函数。这个函数看起来很简单,就是执行了iowrite16。它的原理就在于,iowrite16的时候,就是执行PIO,PIO的指令会被Host截获到。所以Host就知道了Guest写数据了。同样,MMIO也可以。不过MMIO的处理路径比PIO要长一些,CPU消耗稍微高一点。 6,QoS libvirt提供了对网卡设置QoS的xml。需要提一下的时候,libvirt使用tc限速,不能对bridge类型的网卡限速。所以限速的位置可以选择在BRIDGE的port上。 后记: 虚拟网卡的能力,从e1000到virtio,再到vhost-net ,越来越强大。当然要比SRIOVS的能力弱一点。 但是虚拟网卡的好处在于和硬件无关,一台普通的x86服务器都可以。虚拟机的热迁移能力不会因为网卡而限制。虚拟机的运行主机也不需要过多限制。超融合,或者没有那么严格要求的性能的私有云场景下,使用vhost-net都是一个不错的选择。

原文链接:https://cloud.tencent.com/developer/article/1087404

[linux][network]虚拟网卡技术分析相关推荐

  1. 虚拟网卡技术-VETH、MACVLAN、IPVLAN

    Linux的网卡驱动中内含了很多"虚拟网卡".早先的文章曾经详细分析过tun,ifb等虚拟网卡,类似的思路,在虚拟化大行其道的趋势下,Linux源码树中不断增加对"网络虚 ...

  2. linux里添加网卡,Linux添加虚拟网卡的多种方法

    Linux添加虚拟网卡的多种方法有时候,一台服务器需要设置多个ip,但又不想添加多块网卡,那就需要设置虚拟网卡.这里介绍几种方式在linux服务器上添加虚拟网卡.我们 有时候,一台服务器需要设置多个i ...

  3. 高级Linux Kernel Inline Hook技术分析与实现

    2019独角兽企业重金招聘Python工程师标准>>> ==Ph4nt0m Security Team==Issue 0x03, Phile #0x03 of 0x07|=----- ...

  4. linux 进程 inline hook,高级Linux Kernel Inline Hook技术分析与实现

    高级Linux Kernel Inline Hook技术分析与实现 时间:2015/6/28作者:网管联盟 一.简述 目前流行和成熟的kernel inline hook技术就是修改内核函数的opco ...

  5. linux没有网卡装置,基于Linux的虚拟网卡实现方法、装置、设备及介质与流程

    技术特征: 1.一种基于linux的虚拟网卡实现方法,其特征在于:包括以下步骤: s1,vpn系统通过ppp接口获取带有ppp协议的网络封包,从该网络封包中读取ppp协议数据,从该ppp协议数据中提取 ...

  6. 利亚德虚拟演播技术分析

    利亚德虚拟演播技术分析: 涉及技术: 动作捕捉 LED显示技术 多通道同步技术 OptiTrack摄像机定位技术 视频抠图技术(将捕捉到的人物与背景分离,不需要绿幕抠图) 三维BPR显示引擎,合成虚拟 ...

  7. linux 进程 inline hook,高级Linux Kernel Inline Hook技术分析与实现 -电脑资料

    ==Ph4nt0m Security Team== Issue 0x03, Phile #0x03 of 0x07 |=---------------------------------------- ...

  8. linux创建虚拟网卡vnet,Qemu之Network Device全虚拟方案二:虚拟网卡的创建

    当命令行传入nic相关参数时,Qemu就会解析网络相关的参数后进入虚拟网卡的创建流 程.而在上文中提到对于所有-net类型的设备,都视作一个net client来对待.而在net client的建立之 ...

  9. 远程连接linux虚拟网卡,Linux 虚拟机虚拟网卡问题导致无法连接问题

    问题描述 当 Linux 虚拟机启动时,通过串口输出或者启动日志, 观察到虚拟网卡启动或者初始化故障, 导致虚拟机无法连接. 问题分析 常见的超时报错范例如下: CentOS 复制 Bringing ...

最新文章

  1. MBZUAI大学招生了,Michael Jordan、Raj Reddy等大佬授课
  2. Linux内核分析:完成一个简单的时间片轮转多道程序内核代码
  3. 本地安全沙箱最快解决办法
  4. M 点滑动平均 Python 实现
  5. spark shuffle的写操作之准备工作
  6. tf调不到keras怎么 回事_拼多多刷单关键词搜不到是怎么回事?如何解决?
  7. OpenVINO 获取计算棒计算结果
  8. vue 高阶面试题_大厂面试题合集
  9. 46 -算法 - Leetcode -169 - 多数元素 - map insert 迭代器
  10. 使用FFmpeg转录网络直播流
  11. 数据交换技术(*):电路交换,报文交换,分组交换的概念,特点和优缺点以及存储转发技术概念
  12. 直播系统开发之ios对接腾讯云直播sdk
  13. 无接任何usb设备却提示无法识别usb设备
  14. 甲骨文UBUNTU安装宝塔面板无法访问
  15. Python爬虫学习①:
  16. 【Linux】误删libc提示Kernel panic not syncing: Attempted to kill init解决办法
  17. 鸿蒙 华为watch gt3手表hello world
  18. locked肆虐,不少人已经中招-是否也有你
  19. 视频 | 你不知道的开源60年秘史
  20. PIC10F200单片机编程总结-0

热门文章

  1. STM32开发笔记47:STM32F4+DP83848以太网通信指南系列(一):知识储备
  2. 工厂模式与策略模式之区别
  3. Linux:udev机制详解
  4. 【随机过程】随机过程第一章 随机过程的基本概念
  5. 虚函数原理与虚函数表
  6. 2022年度项目管理软件排名揭晓:哪些软件在市场中脱颖而出?
  7. oracle云erp产品有哪些,云ERP与传统ERP的区别有哪些百洋智能科技为您分析
  8. 2021教育企业邮箱怎么注册?如何申请学校邮箱?
  9. 张志华-统计机器学习-概论
  10. 安卓日志:拍照、文件读取的问题