【转载】Linux虚拟化KVM-Qemu分析(一)
作者:LoyenWang
出处:https://www.cnblogs.com/LoyenWang/
公众号:LoyenWang
版权:本文版权归作者和博客园共有
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
背景
Read the fucking source code!--By 鲁迅A picture is worth a thousand words.--By 高尔基
说明:
- KVM版本:5.9.1
- QEMU版本:5.0.0
- 工具:Source Insight 3.5, Visio
1. 概述
- 从这篇文章开始,将开始虚拟化的系列研究了,大概会涉及到ARM64虚拟化支持、KVM、QEMU等分析;
- 虚拟化相关的实践与操作有且仅有:VMware/VirtualBox等虚拟机使用、QEMU使用、QEMU源码修改模拟IO设备;
Show me the code,一切从源代码出发;
本文作为开篇,从宏观方面来进行介绍,有个初步认识,不涉及到具体原理分析。
2. 概念
2.1 虚拟化

什么是虚拟化?
- 虚拟化是一种资源管理技术,在非虚拟化系统中,单个操作系统管理和使用所有的硬件资源,而在虚拟化系统中,硬件资源可以被抽象和分割成多个虚拟的实体用于支持多个操作系统,多个操作系统可以共享所有的实体硬件资源,从而达到物理资源的最大化利用;
Virtual Machine Motior(VMM),虚拟机监控器,也叫Hypervisor,向下管理实际的物理资源,向上给不同的虚拟机提供逻辑资源;Virtual Machine(VM),虚拟机可以根据自己的选择运行不同的OS(Guest OS),它会认为自己独享硬件;- 虚拟化的好处就是能提高资源的利用率,比如当前计算机的配置资源都很高,实际的利用率比较低,如果进行统一管理并进行虚拟化,那就可以支持更多的用户来合理利用了;
2.2 软件虚拟化和硬件虚拟化
2.2.1 软件虚拟化
通过软件模拟来实现VMM层,比如QEMU,还是以图片来举例说明下:

- 以典型的场景为例(ARM+Linux的模拟环境):在PC机Ubuntu系统中使用Qemu来模拟ARM64处理器,并在ARM64中运行Guest OS,假设Guest OS也为Linux;
- 在没有硬件虚拟化的支持下,QEMU本质上完成的工作是二进制的翻译,这个问题怎么来理解呢?比如Guest OS运行时,APP和OS都认为自己是运行在ARM64中,执行文件也都是交叉编译器生成的,我们都知道不同的处理器架构,指令集都不一样,ARM上运行的程序放置到X86运行是无法执行的,Qemu的出现就可以解决这个问题,硬生生转换翻译过去;
- Qemu的翻译过程为:将
Guest代码指令翻译成TCG(Tiny Code Generator)中间代码,最终翻译成Host架构支持的代码指令;
2.2.2 硬件虚拟化
纯软件行为来翻译指令,显然是一件很低效的事情,硬件虚拟化的支持可以提高整体的性能,硬件虚拟化指处理器本身提供能力来让客户机指令独立运行。

KVM (Kernel-Based Virtual Machine),基于内核的虚拟机,实现对CPU和内存的虚拟化,以及硬件I/O虚拟化的拦截,Guest的I/O被KVM拦截后交给Qemu去处理;KVM是内核的一个Module,可以让Linux变成一个Hypervisor;KVM需要Host处理器本身支持虚拟化扩展,比如intel VT,AMD-V等;
2.3 半虚拟化和全虚拟化

- 半虚拟化(
Para-Virtualization):客户机操作系统知道自身运行在虚拟环境里,进行定制化修改,以配合Hypervisor进行工作,优点是半虚拟化的架构更精简,性能上有一定优势,缺点是客户机OS需要修改,用户体验偏差; - 典型的半虚拟化技术
virtio,需要宿主机/Hypervisor和客户机都安装对应的驱动; - 全虚拟化(
Full Virtualization):客户机操作系统不需要任何改动,使用简单,由于全虚拟化需要模拟出完整的,和物理平台一样的平台给客户机,因此也增加了Hypervisor的设计难度;
2.4 Type1虚拟化和Type2虚拟化

- 从软件的框架角度,根据Hypervisor是直接在硬件之上,还是在宿主机操作系统之上,可以将虚拟化分成Type1和Type2;
- Type1虚拟化:
native/bare-mental Hypervisor,直接控制硬件资源和客户机,典型的是Xen; - Type2虚拟化:Hypervisor运行在宿主机操作系统之上,典型的比如:
VMware Workstation,KVM等,Hypervisor只是宿主机操作系统的一个应用程序;
2. kvm-qemu框架
从上文的虚拟化分类来看,我们研究目标KVM+Qemu,是采用硬件虚拟化技术的全虚拟化方案(Type2)。

Qemu (Quick Emulator):是虚拟化方案的用户态组成部分,它有两种模式:1)Emulator,模拟器,模拟各种硬件,使用的是二进制翻译技术;2)Virtualiser,虚拟机,通过ioctl与KVM内核模块进行交互,完成虚拟化功能;Qemu为每个VM虚拟机创建一个进程,针对每个vCPU虚拟CPU创建一个线程,Guest的系统和应用运行在vCPU之上;Qemu能模拟I/O功能,而这部分功能KVM可能并不是全部支持,执行流程如下:虚拟机VM中的程序执行I/O操作,VM退出进入KVM,KVM进行判断处理并将控制权交给Qemu,由Qemu来模拟I/O设备来响应程序的I/O请求;- KVM内核模块,依赖于底层硬件的虚拟化支持,主要的功能是初始化CPU硬件,打开虚拟化模式,将虚拟化客户机运行在虚拟机模式下,并对虚拟化客户机的运行提供一定的支持;
- KVM内核模块,实现CPU的虚拟化、内存的虚拟化等,而外设IO的虚拟化,通常不由KVM模块负责,只有对性能要求很高的虚拟设备才需要由KVM内核模块来负责,因此也就有KVM + Qemu的组合方案了;
本文纯当扫盲贴了,至于具体技术细节的深入分析,后续会进行不定期更新。
3. 参考
《KVM实战-原理、进阶与性能调优》
欢迎关注个人公众号,不定期更新内核机制文章

【转载】Linux虚拟化KVM-Qemu分析(一)的更多相关文章
- [转载]Linux 线程实现机制分析
本文转自http://www.ibm.com/developerworks/cn/linux/kernel/l-thread/ 支持原创.尊重原创,分享知识! 自从多线程编程的概念出现在 Linux ...
- KVM/QEMU/qemu-kvm/libvirt 概念全解
目录 目录 前言 KVM QEMU KVM 与 QEMU qemu-kvm Libvirt Libvirt 在 OpenStack 中的应用 前言 如果是刚开始接触虚拟机技术的话, 对上述的概念肯定会 ...
- 【原创】Linux虚拟化KVM-Qemu分析(三)之KVM源码(1)
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: KVM版本:5.9 ...
- Linux虚拟化技术KVM、QEMU与libvirt的关系(转)
说明:个人理解,KVM是内核虚拟化技术,而内核是不能使用在界面上使用的,那么此时QEMU提供了用户级别的使用界面,相互辅助.当然,单独使用QEMU也是可以实现一整套虚拟机,不过QEMU+KVM基本是标 ...
- 关于Linux虚拟化技术KVM的科普 科普三(From OenHan)
http://oenhan.com/archives,包括<KVM源代码分析1:基本工作原理>.<KVM源代码分析2:虚拟机的创建与运行>.<KVM源代码分析3:CPU虚 ...
- 关于Linux虚拟化技术KVM的科普 科普二(KVM虚拟机代码揭秘)
代码分析文章<KVM虚拟机代码揭秘--QEMU代码结构分析>.<KVM虚拟机代码揭秘--中断虚拟化>.<KVM虚拟机代码揭秘--设备IO虚拟化>.<KVM虚拟 ...
- KVM+QEMU虚拟化概念
概念: KVM,即Kernel-basedvirtual machine,由redhat开发,是一种开源.免费的虚拟化技术.对企业来说,是一种可选的虚拟化解决方案. 定义:基于Linux内核的虚拟机 ...
- 【原创】Linux虚拟化KVM-Qemu分析(一)
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: KVM版本:5.9 ...
- 【原创】Linux虚拟化KVM-Qemu分析(四)之CPU虚拟化(2)
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: KVM版本:5.9 ...
- 【原创】Linux虚拟化KVM-Qemu分析(五)之内存虚拟化
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: KVM版本:5.9 ...
随机推荐
- CopyOnWriteArrayList的使用和优缺点
CopyOnWriteArrayList允许并发读,读操作无锁,性能较高: 而写操作(含删除),比如向容器中添加/删除一个元素,则首先将当前容器复制一份,然后在新副本上执行写操作,结束之后再将原容器的 ...
- [OpenCV-Python] 18 图像梯度
文章目录 OpenCV-Python:IV OpenCV中的图像处理 18 图像梯度 18.1 Sobel 算子和 Scharr 算子 18.2 Laplacian 算子 OpenCV-Python: ...
- Linux期末佛脚指南
Linux的期末佛脚复习 常用文件操作命令 touch (创建文件) cat (查看文件内容) head (查看文件开头) tail (查看文件结尾) cp (复制文件) mv (移动文件) ls ( ...
- 用go设计开发一个自己的轻量级登录库/框架吧
用go设计开发一个自己的轻量级登录库/框架吧 几乎每个项目都会有登录,退出等用户功能,而登录又不单仅仅是登录,我们要考虑很多东西. token该怎么生成?生成什么样的? 是在Cookie存token还 ...
- 【Visual Leak Detector】核心源码剖析(VLD 2.5.1)
说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记.本篇对 VLD 2.5.1 源码做内存泄漏检测的思路进行剖析.同系列文章目录可见 <内存泄漏检测工具>目录 目录 说明 1. ...
- 2022-04-25:给定两个长度为N的数组,a[]和b[] 也就是对于每个位置i来说,有a[i]和b[i]两个属性 i a[i] b[i] j a[j] b[j] 现在想为了i,选一个最
2022-04-25:给定两个长度为N的数组,a[]和b[] 也就是对于每个位置i来说,有a[i]和b[i]两个属性 i a[i] b[i] j a[j] b[j] 现在想为了i,选一个最好的j位置, ...
- 2023-03-06:给定一个二维网格 grid ,其中: ‘.‘ 代表一个空房间 ‘#‘ 代表一堵 ‘@‘ 是起点 小写字母代表钥匙 大写字母代表锁 我们从起点开始出发,一次移动是指向四个基本方向之
2023-03-06:给定一个二维网格 grid ,其中: '.' 代表一个空房间 '#' 代表一堵 '@' 是起点 小写字母代表钥匙 大写字母代表锁 我们从起点开始出发,一次移动是指向四个基本方向之 ...
- 2022-06-11:注意本文件中,graph不是邻接矩阵的含义,而是一个二部图。 在长度为N的邻接矩阵matrix中,所有的点有N个,matrix[i][j]表示点i到点j的距离或者权重, 而在二部
2022-06-11:注意本文件中,graph不是邻接矩阵的含义,而是一个二部图. 在长度为N的邻接矩阵matrix中,所有的点有N个,matrix[i][j]表示点i到点j的距离或者权重, 而在二部 ...
- 2020-03-01:给定一个非负数组arr,代表直方图。返回直方图的最大长方形面积。
2020-03-01:给定一个非负数组arr,代表直方图.返回直方图的最大长方形面积. 福哥答案2020-03-01: 单调栈,大压小.有代码. 代码用golang编写,代码如下: package m ...
- 2021-10-14:被围绕的区域。给你一个 m x n 的矩阵 board ,由若干字符 ‘X‘ 和 ‘O‘ ,找到所有被 ‘X‘ 围绕的区域,并将这些区域里所有的 ‘O‘ 用 ‘X‘ 填充。力扣1
2021-10-14:被围绕的区域.给你一个 m x n 的矩阵 board ,由若干字符 'X' 和 'O' ,找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充.力扣1 ...