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

2018-04-09 11:16:57 浏览数 (1)

前言: 以作者的经验来看,虚拟化的跨度比较大,很多概念比较难以理解,本来以为“硬件行为,就是这样的”好多概念,都变成虚拟的了。 作者对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块盘了;挂载光驱,什么本地光驱了,什么远程光驱了,什么迁移不能带光驱了。。。

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

0 人点赞