当前位置: 首页 > news >正文

KVM创建的虚拟机,虚拟机的网卡是如何生成的

KVM虚拟机的虚拟网卡(vNIC)的生成是一个由用户空间工具(QEMU)Linux内核 协同工作的过程。

其核心流程可以概括为:通过 TUN/TAP 驱动在宿主机上创建一个虚拟网络端点(TAP设备),然后将这个TAP设备的一端交给虚拟机的虚拟网卡,另一端连接到宿主机的虚拟网络(如网桥)上。

下面是详细的步骤和原理分解:

核心参与者

  1. QEMU/KVM:虚拟机监控器(VMM),负责模拟整个虚拟机,包括虚拟硬件设备(如虚拟网卡)。
  2. Linux Kernel
    • KVM 模块:处理CPU和内存的虚拟化。
    • TUN/TAP 驱动:这是生成虚拟网卡的关键。它提供了创建虚拟网络设备的能力。
    • 网桥驱动Open vSwitch:用于将多个TAP设备(即多个虚拟机)连接在一起,构成虚拟网络。
  3. Libvirt(常用管理工具):通过定义XML配置文件,最终调用QEMU命令行来启动虚拟机,简化了整个过程。

虚拟网卡生成的具体步骤

第1步:定义与请求(Configuration)

当你通过 libvirt(使用 virshvirt-manager)或直接使用 qemu 命令行启动虚拟机时,你会在配置中指定网络连接方式。最常见的是“桥接网络”或“NAT网络”。

例如,一个典型的Libvirt网络配置XML片段:

<interface type='network'> <mac address='52:54:00:8a:7b:07'/><source network='default'/> <model type='virtio'/> 
</interface>
  • <model type='virtio'/>:指定了要模拟的网卡型号为 virtio。这是一种半虚拟化驱动,性能远优于完全模拟的e1000等网卡。
第2步:设备创建与后端建立(Creation & Backend)

当QEMU进程根据配置启动虚拟机时,会发生以下事情:

  1. QEMU调用TAP驱动:QEMU使用Linux的 ioctl() 系统调用与 /dev/net/tun 设备交互,请求内核的TUN/TAP驱动程序创建一个新的TAP设备

  2. 内核生成TAP设备:TAP驱动程序在内核中创建并注册一个新的网络接口,名称通常由系统自动分配(如 tap0, vnet0, vnet1)或由QEMU指定。你可以在宿主机上使用 ip link 命令看到它。

    # 在宿主机上执行
    ip link show
    ...
    5: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master virbr0 state UNKNOWN mode DEFAULT group default qlen 1000link/ether fe:54:00:8a:7b:07 brd ff:ff:ff:ff:ff:ff
    
    • 这个 vnet0 就是虚拟网卡在宿主机端的对应物。它像一个真实的网卡,一端连着宿主机的网络协议栈,另一端连着QEMU进程。
  3. QEMU与TAP设备连接:QEMU会打开这个TAP设备文件。从此,QEMU进程可以通过文件读写操作来与这个TAP设备交换数据。发往TAP设备的数据可以被QEMU读取,QEMU写回TAP设备的数据则相当于从该设备发送出去。

第3步:前端模拟(Frontend Emulation)

在虚拟机内部,QEMU会模拟一个完整的、指定型号的网卡硬件(如virtio-net PCI设备)。

  1. 虚拟机操作系统启动后,会探测到这个虚拟PCI设备。
  2. 虚拟机内核需要安装相应的驱动程序来驱动它。对于 virtio 型号,需要加载 virtio_net 驱动。
  3. 驱动加载后,在虚拟机内部就会出现一个普通的网络接口,通常命名为 eth0ens3 等。这就是虚拟机看到的“虚拟网卡”。
第4步:数据通路连接(Data Path)

至此,一条完整的数据通路已经建立:

  • 虚拟机内部:应用程序通过socket发送网络数据包。
  • 虚拟机内核:数据包经过内核协议栈,由 virtio_net 驱动处理。
  • QEMU进程virtio_net 驱动通过一种高效的机制(如vhost-net)将数据包传递到宿主机的用户空间QEMU进程。QEMU再将数据包写入它打开的TAP设备文件(如 vnet0)中。
  • 宿主机内核:TAP设备 vnet0 接收到数据包,仿佛是自己收到的一样,然后将其转发给其“master”(例如网桥 virbr0br0)。
  • 虚拟交换机:网桥根据MAC地址表进行转发。如果目的地是外部网络,数据包会从网桥的物理接口(如 ens33)发送到物理交换机;如果目的地是同一宿主机上的另一台虚拟机,则数据包会被转发到对应的TAP设备上,完成内部交换。

反之亦然,从物理网络发往虚拟机的数据包,会通过物理网卡到达网桥,网桥再转发给TAP设备 vnet0,QEMU从TAP设备文件读取到这个数据包,然后通过virtio机制注入到虚拟机内部。


总结与关键点

  1. 生成机制:虚拟网卡的本质是 “前端(虚拟机内)模拟 + 后端(宿主机上)TAP设备”
  2. 谁是创造者:虚拟网卡是由 QEMU进程 请求 Linux内核的TUN/TAP驱动 动态创建的。
  3. 性能关键:使用 virtio 模型和 vhost-net(内核加速模块)可以大幅降低开销,让数据通路尽可能短,避免在用户空间(QEMU)多次拷贝,从而获得接近原生的网络性能。
  4. 管理工具libvirt 并不是必需的,但它极大地简化了调用QEMU和配置复杂网络(如自动将TAP设备加入网桥)的过程。

简单来说,KVM虚拟机的虚拟网卡是通过QEMU调用TUN/TAP驱动在宿主机上创建一个TAP设备,并将其与虚拟机内部模拟的网卡前端通过高效的virtio机制桥接起来而生成的

http://www.dtcms.com/a/445860.html

相关文章:

  • 网站开发人员结构清新太和做网站
  • 【开题答辩全过程】以 SportsGo健身网站为例,包含答辩的问题和答案
  • Cobalt Strike
  • Java Servlet(三)--- 写一个简单的网站,表白墙程序,登录功能的实现
  • 达梦数据库(DM8)物理备份与还原
  • 【AI论文】OpenGPT-4o-Image:面向高级图像生成与编辑的综合性数据集
  • Pyenv 使用教程:安装与卸载
  • 告别PECL,拥抱PIE:像Composer一样管理PHP扩展
  • weex做网站python做网页
  • 【超详细】使用conda配置python的开发环境
  • 深圳沙井公司网站建设网上银行登录
  • 高端公司网站建设自适应网站cms
  • isis整体知识梳理
  • 水管 / 污水管道巡检机器人(研究思路_1)
  • 操作系统命令:Linux与Shell(Operating System Command Line, OS/CLI)目录导航、文件操作与日志查看命令实践
  • 北海建设工程信息网站自助提卡网站怎么做
  • 【QT】概述补充——对象树
  • 一套完整的前端“白屏”问题分析与解决方案(性能优化)
  • fd 工具指南:find 的现代替代品
  • 珠海做网站最好的公司有哪些做恐怖网站
  • 国庆训练题题解10.5
  • CLion实现ini 解析器设计与实现
  • python全栈(基础篇)——day04:后端内容(字符编码+list与tuple+条件判断+实战演示+每日一题)
  • 广州网站建设功能洛阳霞光企业网站建设公司
  • list 与 forward_list:一场 STL 中的“链表哲学”之争
  • Vue 学习与实践大纲(后端视角)
  • 2025时序数据库选型,从架构基因到AI赋能来解析
  • 三合一网站平台做网站 如何注册公司
  • 中山今科网站建设德州百度推广公司
  • Rust 与 传统语言:现代系统编程的深度对比