文档介绍:虚拟化老兵介绍虚拟化技术
大家好,我是徐安,一位虚拟化老兵。2010年开始在世纪互联(云快线)接触云计算和虚拟化技术,应该算是国内较早的一批人吧。目前在汉柏科技有限公司,负责服务器虚拟化以及桌面虚拟化产品的技术工作。我将从虚拟化的主流技术介绍,前沿技术介绍,Docker技术介绍,MixSAN技术介绍四个方面展开今天的分享。由于笔者水平和知识所限,难免有理解不正确的地方,请各位大牛批评指正。
首先让我们看看主流虚拟化技术有哪些,无非就是CPU虚拟化,内存虚拟化,网卡虚拟化,磁盘虚拟化。
KVM是目前最主流的虚拟化技术,自Linux 。KVM分为四个模式,分别是客户(虚拟机)用户模式,客户(虚拟机)内核模式,Host Linux用户模式,Host Linux内核模式。虚拟机的用户模式和内核模式与虚拟化之前的操作系统对应,没有什么好解释的。Qemu-kvm是一个Host Linux用户态程序,就是一个进程,代表着一个虚拟机。Qemu-kvm主要负责为虚拟机模拟硬件,Qemu-kvm通过ioctl控制KVM内核模块。
一个虚拟机就是一个进程,那一个vCPU就是一个线程,它被Main线程创建。这么设计的好处是无需单独设计vCPU的调度算法了,就用Linux的线程调度即可。所以,对于一个vCPU来说,它就是拼了老命runing,看图可以见到两个while循环,第二个while就是让KVM内核运行该vCPU的上下文,一旦KVM内核运行不下去了,就看看是什么原因,qemu-kvm根据原因执行下一步动作,比如需要读写磁盘了,那就用qemu-kvm去打开该磁盘对应的文件,执行read,write操作。
整个虚拟机的虚拟地址到实际物理内存地址的访问(转换)过程为:GVA(虚拟机虚拟地址),通过VM页表转换为GPA(虚拟机物理地址),然后通过一个数据结构映射为HVA(物理机虚拟地址),再通过Host页表,转换为HPA(物理机物理地址)。
从上页可以看出,这么转换太慢了,需要加速。有两个办法来加速上一页的翻译过程。1)影子页表,2)EPT功能。那KVM使用哪个呢?如CPU支持EPT功能,那就走EPT。
EPT是利用硬件自动翻译GPA到HPA的地址映射:在构建VM的页表时,EPT硬件把翻译好的HPA地址反馈给VM页表,VM直接使用物理地址。
利用软件“欺骗VM”直接构建GVA到HPA的页表,VM还正常走页表翻译的流程,当需要加载页表的物理内存时,KVM接管起来,然后把页表里的内容直接替换成真实的HPA地址即可。
左边是普通网卡的虚拟化,首先qemu-kvm会模拟”E1000″的物理网卡,Guest OS通过模拟的中断和DMA操作与E1000交互,E1000在Qemu-kvm内用内部调用把这些请求转发到”tap代理”上,tap代理实际是open的Host OS的一个tap设备,所以收发包的流程就转换为针对tap设备的read,write操作。tap设备连接在bridge上,再通过TCP/IP协议栈或bridge上的物理网卡把网络包收发起来。右边是virtio网卡,与普通网卡不同的地方在DMA模拟操作变成了内存共享。
这是具体的函数调用过程,强调一下:tap的操作都会经过Qemu-kvm进程的poll处理。左边的是收包过程,右边的是发包过程。
收发包的调用流程。
vrio-blk与网卡虚拟化类似,首先模拟一个硬件设备,对硬件设备的读写操作都转换为磁盘代理的读写操作。这个磁盘代理可能是一个文件,一个块设备,一个网络设备,或者仅仅是一个模拟。
有兴趣的可以私下讨论,时间关系先过。
这个讲起来有点复杂,总之可设定虚拟机某个磁盘的缓冲策略,write-back,none,write-thru。实际上就是qemu-kvm打开文件的类型不同。write-back的意思是数据写入page cache中就不管了,none的话会写入buffer cache(设备缓冲中),write-thru那么设备缓冲也要跨过,直接写入设备中。
所谓前沿技术,只是个人的认识,不一定正确,请批评指正。
所谓的FT技术就是建立两个VM,一主一备。隔一段时间主VM暂停下,做一个checkpoint,然后恢复VM,在下一次checkpoint点之前,把上两次checkpoint之间的差异(CPU,内存)数据传递给备份VM,备份VM同步更新这些差异数据。这里的困难点就是checkpoint之间的时间间距尽量短,如果这段时间内存数据变化比较大,那传输的数据流就会巨大,那对主备之间的网络带宽压力就会比较大。
三级缓冲是这样的,以Widows系统举例,把C盘的母盘放在内存中,C盘的link clone出来的子盘放在SSD中,