[原] KVM 虚拟化原理探究(1)— overview
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。
最新文章
- Spring MVC 学习总结(二)——控制器定义与@RequestMapping详解
- The Coco-Cola Store C(Contest #3 )
- 【转】第一次使用Android Studio时你应该知道的一切配置(三):gradle项目构建
- 从string.size()和string.length()聊到长度的问题和一个关于数据结构定义的技巧
- CI 笔记(1)
- js获取随机颜色
- R语言面向对象编程:S3和R6
- .NET MD5 加密
- No Team Selected:A team must be selected to run 'ProjectName' on iPhoneName
- 【ElasticSearch篇】--ElasticSearch从初识到安装和应用
- v-for 在 VSCode 中出现 Elements in iteration expect to have 'v-bind:key' directives.
- MVC设计模式的简单理解
- 洛谷P1188PASTE题解
- vue不通过路由直接获取url中参数的方法示例
- 2.15 C++常量指针this
- Myelipse中xml约束文件的导入(以spring为例)
- get_client_ip() 获取IP地址
- win10下ASP.NET Core 2.0部署环境搭建(转)
- [SoapUI] Datasink怎么显示每次循环的结果
- December 28th 2016 Week 53rd Wednesday
热门文章
- 实时的.NET程序错误监控产品Exceptionless
- [APUE]标准IO库(下)
- 实现代理设置proxy
- org.jboss.deployment.DeploymentException: Trying to install an already registered mbean: jboss.jca:service=LocalTxCM,name=egmasDS
- Java程序员应该了解的10个面向对象设计原则
- android_m2repository_rxx.zip下载地址以及MD5
- Android事件分发机制浅谈(一)
- C语言可以开发哪些项目?
- js分页页码算法
- APP并非一个人在战斗,还有API—Xamarin.Android回忆录