KVM 虚拟化原理探究— overview

标签(空格分隔): KVM


写在前面的话

本文不介绍kvm和qemu的基本安装操作,希望读者具有一定的KVM实践经验。同时希望借此系列博客,能够对KVM底层有一些清晰直观的认识,当然我没有通读KVM的源码,文中的内容一部分来自于书籍和资料,一部分来自于实践,还有一些来自于自己的理解,肯定会有一些理解的偏差,欢迎讨论并指正。本系列文章敬代表我个人观点和实践,不代表公司层面。

KVM虚拟化简介

KVM 全称 kernel-based virtual machine,由Qumranet公司发起,2008年被RedHat收购。

KVM实现主要基于Intel-V或者AMD-V提供的虚拟化平台,利用普通的Linux进程运行于虚拟态的指令集,模拟虚拟机监视器和CPU。KVM不提供硬件虚拟化操作,其IO操作等都借助QEMU来完成。

KVM有如下特点:

  • guest作为一个普通进程运行于宿主机
  • guest的CPU(vCPU)作为进程的线程存在,并受到宿主机内核的调度
  • guest继承了宿主机内核的一些属性,比如huge pages(大页表)
  • guest的磁盘IO和网络IO会受到宿主机的设置的影响
  • guest通过宿主机上的虚拟网桥与外部相连

KVM整体架构

每一个虚拟机(guest)在Host上都被模拟为一个QEMU进程,即emulation进程。

我们创建一个虚拟机后,用普通的ps 命令就可以查看到。

➜  ~ virsh list --all
Id Name State
----------------------------------------------------
1 kvm-01 running ➜ ~ ps aux | grep qemu
libvirt+ 20308 15.1 7.5 5023928 595884 ? Sl 17:29 0:10 /usr/bin/qemu-system-x86_64 -name kvm-01 -S -machine pc-i440fx-wily,accel=kvm,usb=off -m 2048 -realtime mlock=off -smp 2 qemu ....

可以看到,此虚拟机就是一个普通的Linux进程,他有自己的pid。并且有四个线程,线程数量不是固定的,但是至少会有三个(vCPU,IO,Signal)。其中有两个是vCPU线程,有一个IO线程还有一个信号处理线程。

➜  ~ pstree -p 20308
qemu-system-x86(20308)-+-{qemu-system-x86}(20353)
|-{qemu-system-x86}(20408)
|-{qemu-system-x86}(20409)
|-{qemu-system-x86}(20412)

虚拟CPU

guest的所有用户级别(user)的指令集,都会直接由宿主机线程执行,此线程会调用KVM的ioctl方式提供的接口加载guest的指令并在特殊的CPU模式下运行,不需要经过CPU指令集的软件模拟转换,大大的减少了虚拟化成本,这也是KVM优于其他虚拟化方式的点之一。

KVM向外提供了一个虚拟设备/dev/kvm,通过ioctl(IO设备带外管理接口)来对KVM进行操作,包括虚拟机的初始化,分配内存,指令加载等等。

虚拟IO设备

guest作为一个进程存在,当然他的内核的所有驱动等都存在,只是硬件被QEMU所模拟(后面介绍virtio的时候特殊)。guest的所有硬件操作都会有QEMU来接管,QEMU负责与真实的宿主机硬件打交道。

虚拟内存

guest的内存在host上由emulator提供,对emulator来说,guest访问的内存就是他的虚拟地址空间,guest上需要经过一次虚拟地址到物理地址的转换,转换到guest的物理地址其实也就是emulator的虚拟地址,emulator再次经过一次转换,转换为host的物理地址。后面会有介绍各种虚拟化的优化手段,这里只是做一个overview。

最新文章

  1. Fis3的前端工程化之路[三大特性篇之资源定位]
  2. AnjularJS系列3 —— 数据的双向绑定
  3. android 自定义控件中获取属性的三种方式(转)
  4. POJ 1094 Sorting It All Out
  5. CXF(2.7.10) - WSDL2Java generated Client
  6. Linux批量修改指定目录下的文件或文件夹权限
  7. BZOJ2802: [Poi2012]Warehouse Store
  8. oracle报错ORA-01507
  9. python编程中在ubuntu中安装虚拟环境及环境配置
  10. _00024 尼娜抹微笑伊拉克_云计算ClouderaManager以及CHD5.1.0群集部署安装文档V1.0
  11. SSM框架下声明式事务管理(注解配置方式)
  12. 分布式系统之CAP理论杂记
  13. PostgreSQL 10.7 linux 主从配置
  14. bzoj2253 纸箱堆叠
  15. [Windows] [VS] [C] [取得指针所指内存的十六进制形式字符串]
  16. Access数据库SQL注入(Access SQL Injection)
  17. python-循环小练习
  18. MFC笔记2
  19. ztree使用实例
  20. classloader trace

热门文章

  1. 开始做POI啦...
  2. SQL compute by 的使用
  3. Android setStartOffset方法:设置启动时间
  4. PKU 1458 Common Subsequence(最长公共子序列,dp,简单)
  5. java登陆验证码与JS无刷新验证
  6. ”ENV_IS_EMBEDDED“解惑以及相关的移植实验
  7. Redis安装介绍
  8. FastDFS分布式文件系统
  9. AI2(App Inventor 2)离线版服务器网络版
  10. 三星5.0以上机器最简单激活Xposed框架的经验
  11. CSS中默认被继承的属性
  12. 如何在地址栏(title标签里)和收藏夹里 加上网站的标志ICO、LOGO图片
  13. css的小知识3
  14. python笔记12-字典
  15. BZOJ3425[POI2013]Polarization——DP+bitset+分块
  16. C# 线程手册 第三章 使用线程 实现一个数据库连接池(实战篇)
  17. POJ2229 Sumsets
  18. Your local changes to the following files would be overwritten by merge: ... Please, commit your changes or stash them before you can merge
  19. Linxu 安装Nignx
  20. Xcode 6 下添加pch头文件