【原创】Linux虚拟化KVM-Qemu分析(一)
背景
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分析(一)的更多相关文章
- 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分析(四)之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 ...
- Linux虚拟化技术KVM、QEMU与libvirt的关系(转)
说明:个人理解,KVM是内核虚拟化技术,而内核是不能使用在界面上使用的,那么此时QEMU提供了用户级别的使用界面,相互辅助.当然,单独使用QEMU也是可以实现一整套虚拟机,不过QEMU+KVM基本是标 ...
- 关于Linux虚拟化技术KVM的科普 科普二(KVM虚拟机代码揭秘)
代码分析文章<KVM虚拟机代码揭秘--QEMU代码结构分析>.<KVM虚拟机代码揭秘--中断虚拟化>.<KVM虚拟机代码揭秘--设备IO虚拟化>.<KVM虚拟 ...
- 关于Linux虚拟化技术KVM的科普 科普三(From OenHan)
http://oenhan.com/archives,包括<KVM源代码分析1:基本工作原理>.<KVM源代码分析2:虚拟机的创建与运行>.<KVM源代码分析3:CPU虚 ...
- KVM 介绍(3):I/O 全虚拟化和准虚拟化 [KVM I/O QEMU Full-Virtualizaiton Para-virtualization]
学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...
- <Mastering KVM Virtualization>:第一章 了解Linux虚拟化
本章为读者提供了Linux虚拟化中流行技术的深刻见解,以及相较于其他同类技术的优势特点.本书共有14章,囊括了KVM虚拟化中的各个方面,从KVM的内部构造开始,并包括了诸如软件定义网络(SDN),性能 ...
随机推荐
- 04 CMD规范基础使用详解
CMD模块规范 1.1 CMD规范说明 专门用于浏览器端,并且模块的加载是异步的,而且只有模块使用时才会加载执行: CMD规范的语法类似于Commonjs + AMD --定义模块使用AMD语法,暴露 ...
- 什么是CSV
逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本).纯文本意味着该文件是一个字符序列,不 ...
- MongoDB副本集部署
mongodb 副本集搭建 环境192.168.1.191 master192.168.1.192 slave,arbiterOS: ubuntu14.04mongodb: mongodb-l ...
- laravel 用户认证简单示例
一.模型代码: 实现接口:\Illuminate\Contracts\Auth\Authenticatable 并引入trait:\Illuminate\Auth\Authenticatable &l ...
- HTML自动刷新页面
<meta http-equiv="refresh"content="5"/> 英文""
- Kubernetes/K8s CKA认证全套实训视频教程下载
地址: 链接:https://pan.baidu.com/s/1bwEUZTCVzqM3mGjrlISbcg 提取码:r1kx 目录: 目录: │ 1-1.kubernetes理论教程 - 云原生技术 ...
- 面试官你好,我已经掌握了MySQL主从配置和读写分离,你看我还有机会吗?
我是风筝,公众号「古时的风筝」,一个简单的程序员鼓励师. 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在里面. 面试官:我看你简历上写的你们公司数据库是 ...
- 7.28 NOI模拟赛 H2O 笛卡尔树 并查集 贪心 长链剖分
LINK:H2O 这场比赛打的稀烂 爆蛋. 只会暴力.感觉暴力细节比较多不想写. 其实这道题的难点就在于 采取什么样的策略放海绵猫. 知道了这一点才能确定每次放完海绵猫后的答案. 暴力枚举是不行的.而 ...
- 6.3 省选模拟赛 Decompose 动态dp 树链剖分 set
LINK:Decompose 看起来很难 实际上也很难 考验选手的dp 树链剖分 矩阵乘法的能力. 容易列出dp方程 暴力dp 期望得分28. 对于链的情况 容易发现dp方程可以转矩阵乘法 然后利用线 ...
- bzoj 5206 [Jsoi2017]原力
LINK:原力 一张无向图 这道题统计三元环的价值和.有重边但是无自环. 我曾经写过三元环计数 这个和那个题差不太多. 不过有很多额外操作 对于重边问题 我们把所有颜色相同的重边缩在一起 这样的话我们 ...