专栏首页皮振伟的专栏[virt][concept]虚拟化技术概论--KVM,QEMU,Libvirt

[virt][concept]虚拟化技术概论--KVM,QEMU,Libvirt

前言: 以作者的经验来看,虚拟化的跨度比较大,很多概念比较难以理解,本来以为“硬件行为,就是这样的”好多概念,都变成虚拟的了。 作者对kernel略懂一二,结合过往的很多经验来看,就更加难以理解了~ 所以,作者尝试着把理解的过程描述出来(尽管作者在虚拟化上面,谈不上很专业,这里还是不自量力一下了)。 分析: 硬件概念:在分析虚拟化原理之前,先来看一下“本来就应该这样”的硬件设计图。 从Intel官网(http://download.intel.com/design/chipsets/datashts/29054901.pdf)下载文档。 下图就是选自文档的Intel 440 FX的块图:

分析块图的拓扑结构,再结合文档(以及过去的一些经验),不难发现,一个完整的平台应该包括以下: 1,CPU 2,Memory 3,IRQ chip 4,PCI Bus 5,PCI Bridge&PCI Device 6,Disk 7,Net Card 8,Other Device(isa,usb,video,keyboard,mouse,IDE controller,USB controller….) 虚拟化:如果想要成功跑起来虚拟机,就要虚拟出来上述的各种硬件出来(但不限于上述),并且,按照类似的拓扑结构组织起来。 所以,本文的主角出场了:KVM,QEMU。 KVM在Linux上被编译成为一个内核模块,提供最核心的CPU虚拟化能力,硬件的二级页表能力,中断注入能力等。

CPU的虚拟化:Intel的CPU提供的VMX能力,能够虚拟化出来CPU,使CPU跑在VM模式下,跑在VM模式下CPU遇到异常,会退出VM模式,然后KVM会handle住各种异常(异常不代表就是错误),要么KVM自己处理,要么交给QEMU来处理。 Memory的虚拟化:CPU进入VM模式下,其实就是在跑Guest OS的代码。Guest OS(以Linux为例)中,跑在protected mode,使用虚拟内存,Guest OS会把Guest Virtual Memory Address映射成Guest Physical Memory Address。而虚拟机在Host OS中,本身只是一个普通的进程,Host OS则需要把虚拟机进程的Host Virtual Memory Address映射成为Host Physical Memory Address。这样一个GVA->GPA->HVA->HPA的过程,会由硬件通过TDP(two dimentional paging)实现。 QEMU则完成了硬件设备的虚拟化。 PCI Bus虚拟化:QEMU虚拟化出来PCI Bus,用软件模拟出来PCI规范。当CPU访问PCI设备(PCI设备通过Bus,Device,Function来寻址)的时候,QEMU通过PCI Bus找到相应的设备,完成通信。 PCI Bridge&PCI Device的虚拟化:PCI Bridge可以用来扩展PCI Device的数目(一条PCI Bus最多有32个Device),可以在扩展后的Bus上继续添加PCI Device。而QEMU的PCI Device则完整的模拟硬件的PCI Device,PCI Device有自己的配置空间(关于PCI的配置空间,在这里不解析),QEMU需要实现PCI Device的配置空间读写能力,以便Guest可以得到配置;另外,QEMU还需要模拟出来PCI Device的Port IO/Memory Mapped IO能力,完成和Guest的通信。 Disk:在这里,暂时不分析block&file的区别,也不分析raw&qcow2的区别。总之,就是让虚拟机觉得自己有磁盘。在硬件上,磁盘是一个块设备,它可以接在IDE控制器上,也可以接在SCSI控制器上,还可以接在USB控制器上,在QEMU上,还可以让磁盘作为一个PCI Device直接接在PCI Bus上。 Net Card:网卡做为一个PCI Device,直接接在PCI Bus上。在Host中,可以使用TAP,网桥创建虚拟网卡。 Other Device的虚拟化:IDE controller做为一个PCI Device接在PCI Bus上,Disk或者CDROM可以接在IDE controller上,这里需要说明一下,IDE controller只能接4个IDE Device;SCSI controller可以做为一个PCI Device接在PCI Bus上,SCSI controller可以接15Disks。。。 Libvirt:Libvirt提供了包括qemu,lxc,vmware等多个虚拟化产品的管理能力。Libvirt提供了更加便于管理的xml管理机制,更加强大应用的用户管理工具virsh,更加严格的参数校验和状态维护能力等。 另外,libvirt同时提供了计算,存储,网络的管理能力。 后记: 给作者的感觉,Disk和Net Card的发挥空间更大一些,容易出问题,需要改动的地方也会比较多。各种挂卷了,卸卷了,XX厂家支持120块盘了;挂载光驱,什么本地光驱了,什么远程光驱了,什么迁移不能带光驱了。。。

概念性的东西偏多,不分析代码了。。。

本文分享自微信公众号 - AlwaysGeek(gh_d0972b1eeb60),作者:AlwaysGeek

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-02-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • [linux][network]ICMP协议分析

    前言: ICMP比较基础,说简单不简单,说难不难。 简单在于字段少,不能携带用户数据,没什么地方可以玩出太多花样;一般和它相关的就是ping和tracerout...

    皮振伟
  • [x86][kvm]avx512指令相关

    前文《[x86][linux]AVX512指令引起的进程crash》中,介绍了一次因为avx512指令导致的进程crash。

    皮振伟
  • [linux][network]虚拟网卡技术分析

    前言: 虚拟化场景下的网卡虚拟化,就是让虚拟机觉得自己有网卡。就有了e1000/rtl8139为代表的物理网卡软件模拟实现;为了加速Guest和Host之间的数...

    皮振伟
  • PCI配置空间简介

    现在有个难题——CF8h、CFCh端口是32位端口,可像Turbo C之类的16位C语言编译器都不支持32位端口访问。怎么办?我们可以使用**_ _ emit ...

    Daotin
  • Python实现HMACSHA1生成加密签名

    按key升序,key不为sign,value不为空时,把key和value拼装成x=a&y=b格式,然后使用HmacSHA1算法生成签名。

    橙子探索测试
  • 手把手的教你激活PyCharm --Pycharm激活详细教程(二)(非常详细,非常实用)

    第一步:点击‘Activation code’,授权激活pycharm,如下图所示:

    北京-宏哥
  • 广告小程序后端开发(11.个人中心:获取用户数据,用户发布的广告和店铺及图片)

    玩蛇的胖纸
  • uni-app学习(二)

    老梁
  • 解构赋值,你不能不懂!

    相信大家不难从上述的几段代码案例总结出来解构赋值的规律,我总结到如下几点: 1、解构主体为数组或者对象。 2、解构源必须具备Iterator接口或者经过转换之后...

    思梦php
  • 解构赋值,你不能不懂!

    思梦php

扫码关注云+社区

领取腾讯云代金券