![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
KVM
kvm
bob62856
这个作者很懒,什么都没留下…
展开
-
libvirt介绍
libvirt是为了更方便地管理各种Hypervisor而设计的一套虚拟化库,libvirt作为中间适配层,让底层Hypervisor对上层用户空间的管理工具(virsh,virt-manager)做到完全透明,因为libvirt屏蔽了底层各种Hypervisor的细节,为上层管理工具提供了一个统一的、较稳定的接口(API) 更多参考这个libvirt简介libvirt项目最初是为Xen设计的一...转载 2020-07-23 12:45:08 · 808 阅读 · 0 评论 -
KVM中Virtio网络的演化之路
作为一个开放的标准接口,virtio一直在云计算与虚拟化中扮演着重要的角色。而virtio网络接口,作为virtio标准支持下最复杂的接口之一,在虚拟机/容器网络加速、混合云加速中一直扮演着重要角色。本文将在读者对virtio标准与虚拟化有一定了解的前提下,介绍virtio网络架构从创造之初到如今的演化之路。1.virtio-net驱动与设备最原始的virtio网络Virtio网络设备是一种虚拟的以太网卡,支持多队列的网络包收发。熟悉virtio的读者应该知道,在virtio的架构中有前后端之分。在v转载 2020-09-10 15:52:52 · 1209 阅读 · 0 评论 -
KVM之EPT与影子页表(七)
一、简述Linux内存映射这部分其实是一个很庞大的话题,它包括分段、分页机制等,在不同架构、不同地址转换机制下,地址转换过程是不同的。本文的重点不在于这些复杂的分段分页保护机制、保护模式、实模式等内容。主要着眼于以下几个概念和问题:虚拟地址和物理地址MMU内存置换缺页中断处理页表项初始化过程1.1 虚拟地址和物理地址从进程和CPU角度分析虚拟地址和物理地址:虚拟地址(VA,virtual address):对于正在运行的进程而言,代码指令中指针所指的地址、函数入口地址、返回地址等,进程转载 2020-09-01 01:04:46 · 1686 阅读 · 2 评论 -
KVM中virtio之vring(八)
virtio原理拿网络驱动部分做案例,网络驱动virtio-net有两个队列:接收队列和发送队列;每个队列都对应一个virtqueue,两个队列之间是互不影响的。前后端利用virtqueue的方式如下图所示:当收包时,ReceiveQueue需要客户机 driver提前填充分配好的空buffer,然后记录到availRing,并在恰当的时机通知后端,当外部网络有数据包到达时,qemu后端就从availRing 中获取一个buffer,然后填充数据,完事后记录buffer head index到use转载 2020-08-28 21:05:27 · 3079 阅读 · 0 评论 -
KVM irqfd and ioeventfd(十九)
In previous article vhost architecture we mentioned that vhost and the guest signal each other by irqfd and ioeventfd mechanism.So let us see how irqfd and ioeventfd mechanism can take this role. We can find the patches in linus tree which implement them:转载 2020-07-17 00:09:14 · 694 阅读 · 0 评论 -
KVM Vhost-net 和 Virtio-net代码详解(十八)
场景Host上运行qemu kvm虚拟机,其中虚拟机的网卡类型为virtio-net,而Host上virtio-net backend使用vhost-net数据包进入虚拟机代码分析首先看vhost-net模块注册,主要使用linux内核提供的内存注册机制,这部分开发过linux kernel的人都应该很了解啦static struct miscdevice vhost_net_misc = { .minor = VHOST_NET_MINOR, .name = "vhost-net"转载 2020-07-04 17:51:07 · 1399 阅读 · 2 评论 -
KVM virtio_net之NAPI机制(十七)
在虚拟化场景,中断的开销更大,所以要尽可能的少用中断,我们从中断处理函数开始看。skb_recv_done函数static void skb_recv_done(struct virtqueue *rvq){ struct virtnet_info *vi = rvq->vdev->priv; struct receive_queue *rq = &vi->rq[vq2rxq(rvq)]; /* Schedule NAPI, Suppress further int转载 2020-07-04 17:02:48 · 747 阅读 · 0 评论 -
KVM中I/O设备直接分配和SR-IOV(十六)
学习 KVM 的系列文章:本文将分析 PCI/PCIe 设备直接分配(Pass-through)和 SR-IOV, 以及三种 I/O 虚拟化方式的比较。1. PCI/PCI-E 设备直接分配给虚机 (PCI Pass-through)设备直接分配 (Device assignment)也称为 Device Pass-Through。先简单看看PCI 和 PCI-E 的区别(AMD CPU):(简单点看,PCI 卡的性能没有 PCI-E 高,因为 PCI-E 是直接连在 IOMMU 上,而 PCI转载 2020-06-28 20:04:18 · 1133 阅读 · 0 评论 -
KVM之Virtio介绍 (十五)
概而言之,virtio 是半虚拟化 hypervisor 中位于设备之上的抽象层。virtio 由 Rusty Russell 开发,他当时的目的是支持自己的虚拟化解决方案 lguest。本文在开篇时介绍半虚拟化和模拟设备,然后探索 virtio 的细节。本文的重点是来自 2.6.30 内核发行版的 virtio 框架。Linux 是 hypervisor 展台。如我的 剖析 Linux hypervisor 所述,Linux 提供各种 hypervisor 解决方案,这些解决方案都有自己的特点和优点。这转载 2020-06-24 19:43:48 · 3276 阅读 · 0 评论 -
KVM中ioeventfd创建与触发的大致流程(十四)
在使用virtio-blk的情况时,virtio notify使用的ioeventfd机制,原因是为了提高性能,能够较快速的回到guest中运行。具体是如何建立这个ioeventfd的呢?流程理出来了,细节没看:1、在guest中,virtio-blk的初始化或者说是在探测virtio-blk之前virtio_dev_probe |-->add_status |-->dev->config->set_status[vp_set_status]转载 2020-06-23 01:08:00 · 1044 阅读 · 0 评论 -
KVM中vhost-user简介(十三)
什么是 vhost-user在 vhost 的方案中,由于 vhost 实现在内核中,guest 与 vhost 的通信,相较于原生的 virtio 方式性能上有了一定程度的提升,从 guest 到 kvm.ko 的交互只有一次用户态的切换以及数据拷贝。这个方案对于不同 host 之间的通信,或者 guest 到 host nic 之间的通信是比较好的,但是对于某些用户态进程间的通信,比如数据面的通信方案,openvswitch 和与之类似的 SDN 的解决方案,guest 需要和 host 用户态的 v转载 2020-06-22 01:24:24 · 1855 阅读 · 0 评论 -
KVM中virtio-user工作思路(十二)
主要查看一下virtio-user的工作思路,个人觉得他主要是用来替换KNI或者OVS的TAP设备,更好的用法应该是给container来用,主要是通过操作/dev/vhost-net创建kernel的tap设备用,然后kernel和virtio-user进行内存映射,便于收发报文。更正一下:目前来说container用virtio-user还不太合适,因为如果TAP设备加入到namespace的话,重启virtio-user就因为在当前的宿主机找不到TAP设备,会生成一个新的TAP设备。这块目前没有解决转载 2020-06-21 00:49:18 · 1399 阅读 · 1 评论 -
KVM中virtio、vhost 和vhost-user比较(十一)
virtio在虚拟机中,可以通过qemu模拟e1000网卡,这样的经典网卡一般各种客户操作系统都会提供inbox驱动,所以从兼容性上来看,使用类似e1000的模拟网卡是非常一个不错的选择。但是,e1000网卡上也包含了复杂的io端口,寄存器,缓存配置,虚拟机每次收发包都会引起更多的io和mmio操作,使得虚拟机频繁的陷出,最终导致网络性能不佳。为了解决上述全虚拟化的性能问题,IBM在2005年提出了virtio, 虚拟机中的半虚拟化前端驱动和主机上的后端服务简单的使用virtqueue共享队列交换数据转载 2020-06-18 18:46:46 · 1295 阅读 · 0 评论 -
KVM中virtio之vring(十)
一、Vring数据结构1、数据结构图的左半部分描述了virtio-blk设备与virtio设备的关系,virtqueue与vring_virtqueue的关系,如下:virtio-blk是一个virtio设备,它看到的队列是virtqueue,里面没有vring的实现,只记录了vring中还有多少空闲的buffer可以使用vring_virtqueue是一个virtqueue,它将VRing的实现隐藏在virtqueue下面,当一个virtio-blk设备真正要发送数据时,只要传入virtqueu转载 2020-06-10 04:11:38 · 1037 阅读 · 0 评论 -
KVM中virtio实现(九)
一、什么是 vhostvhost 是 virtio 的一种后端实现方案,在 virtio 简介中,我们已经提到 virtio 是一种半虚拟化的实现方案,需要虚拟机端和主机端都提供驱动才能完成通信,通常,virtio 主机端的驱动是实现在用户空间的 qemu 中,而 vhost 是实现在内核中,是内核的一个模块 vhost-net.ko。为什么要实现在内核中,有什么好处呢,请接着往下看。二、为什么要用 vhost在 virtio 的机制中,guest 与 用户空间的 Hypervisor 通信,会造成转载 2020-06-10 03:39:30 · 499 阅读 · 0 评论 -
KVM创建虚拟机(六)
一、概述kvm创建虚拟机有三种方式:1. 通过qemu-kvm创建2. 通过virt-install创建3. 通过virt-manager创建在使用这三种创建虚拟机前提是 宿主机必须支持 cpu 的硬件虚拟化技术(Intel 是 vmx,AMD 是svm),通过下面方式进行查看是否支持:egrep '(vmx|svm)' /proc/cpuinfo结果显示:flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cm转载 2020-05-16 22:43:59 · 951 阅读 · 0 评论 -
KVM中四种网络模型(三)
四种网络模型简要说明:1隔离模型该模型的特点是宿主机上的所有虚拟机之间可以组建网络,但是虚拟机无法与宿主机进行通信,也无法与其他网络的主机或其他宿主机上的虚拟机进行通信;相当于将虚拟机只是连接到一个交换机上,而这个交换机是在宿主机上虚拟出来的,即我们通常所说的网桥设备。2 路由模型该模型的特点是在隔离模型的基础上,在宿主机开启了ip路由转发功能,此时的宿主机相当于路由器,完成虚拟机与宿主机...转载 2020-04-30 23:07:09 · 1061 阅读 · 0 评论 -
KVM-QEMU基本工作原理分析(二)
1、理解KVM与Qemu的关系我们都知道开源虚拟机KVM,并且知道它总是跟Qemu结合出现,那这两者之间有什么关系呢?首先,Qemu本身并不是KVM的一部分,而是一整套完整的虚拟化解决方案,它是纯软件实现的,包括处理器虚拟化、内存虚拟化以及各种虚拟设备的模拟,但因为是纯软件模拟,所以性能相对比较低。而广义的KVM实际上包含两部分,一部分是基于LINUX内核支持的KVM内核模块,另一部分就是经...转载 2020-04-30 22:44:45 · 1927 阅读 · 0 评论 -
KVM虚拟化(一)
一、KVM虚拟化架构1、主流虚拟机架构图中对比了几种主流虚拟化技术架构:ESXi、Xen与KVM,其主要差别在与各组件(CPU、内存、磁盘与网络IO)的虚拟化与调度管理实现组件有所不同。在ESXi中,所有虚拟化功能都在内核实现。Xen内核仅实现CPU与内存虚拟化, IO虚拟化与调度管理由Domain0(主机上启动的第一个管理VM)实现。KVM内核实现CPU与内存虚拟化,QEMU实现IO虚拟化...转载 2020-04-30 20:57:43 · 2970 阅读 · 0 评论 -
KVM中I/O虚拟化介绍(五)
I/O虚拟化包括管理虚拟设备和共享的物理硬件之间I/O请求的路由选择。目前,实现I/O虚拟化有三种方式:I/O全虚拟化、I/O半虚拟化和I/O透传。全虚拟化:宿主机截获客户机对I/O设备的访问请求,然后通过软件模拟真实的硬件。这种方式对客户机而言非常透明,无需考虑底层硬件的情况,不需要修改操作系统。半虚拟化:通过前端驱动/后端驱动模拟实现I/O虚拟化。客户机中的驱动程序为前端,宿主机提供的...转载 2020-04-27 23:36:25 · 1599 阅读 · 0 评论 -
KVM半虚拟化驱动--virtio概述和基本原理(四)
一、 virtio概述KVM是必须使用硬件虚拟化辅助技术(如Intel VT-x、AMD-V)的hypervisor,在CPU运行效率方面有硬件支持,其效率是比较高的;在有Intel EPT特性支持的平台上,内存虚拟化的效率也较高。QEMU/KVM提供了全虚拟化环境,可以让客户机不经过任何修改就能运行在KVM环境中。不过,KVM在I/O虚拟化方面,传统的方式是使用QEMU纯软件的方式来模拟I/O...转载 2020-04-22 20:08:51 · 1760 阅读 · 0 评论