本文首发于http://oliveryang.net,转载时请包含原文或者作者网站链接。
VMware存储栈那点儿事儿
解释什么是Virtual Machine的工作就交给万能的维基百科了。
本篇文章只限于VMware vShpere VMKernel的Storage Stack(存储栈)的介绍。这里要说的一些概念都是VMware虚拟化技术里存储相关的概念。VMware vShere的存储栈是VMKernel的重要组成部分,存储栈的大图可以从VMKernel Storage TOI下载到。我们就按照存储栈自下而上的顺序来一一介绍。
1. Storage Device Drivers
和其它操作系统一样,VMKernel的存储栈最底层就是驱动程序和驱动程序的框架了。而驱动和硬件的生态系统通常都是非Windows和Linux操作系统的一大弱点。VMKernel对硬件驱动程序的支持分为两大类,
Linux Device Drivers and Linux Emulation Layer
早期的vSphere VMKernel用了一个巧妙的办法来解决这个问题,那就是通过Linux驱动模拟层(vmklinux)来让Linux驱动源代码可以和VMKernel链接在一起。这个Linux模拟层为Linux原生驱动程序提供和Linux一致的API,降低驱动移植的代价。这种方式利用了Linux良好的硬件驱动生态系统,为vSphere的硬件兼容支持铺平了道路。
个人理解,Linux模拟层的另一个作用就把GPL许可的Linux驱动和商业许可的VMKernel隔离起来,解决中间的法律风险。具体来说就是,vmklinux作为一个Linux驱动模拟层,起到翻译GPL接口到VMware原生接口的作用。把Linux驱动的API,尤其是导出符号为GPL许可的API模拟实现,再调用vmkernel的原生API。这里面vmklinux已经按照GPL开源,但vmkernel就不用了,因为它没有直接使用GPL许可的API。(本人是法盲,但Linux兼容层的设计和代码绝对是经过律师专业的review,经得起考验的。) 虽然这貌似也不是VMware一家的这么做,但是这种作法依旧为VMware招来了诉讼。LWN也做了相关报导,前几个月还有一些进展,估计VMware不会败诉,否则一大堆公司要遭殃了。
Linux模拟层的代码在存储栈里对应了IDE,SCSI,Block,iSCSI,FC,FCOE驱动的所有相关协议API的模拟,应该还是有一定复杂度的。
Native Device Drivers and VMKernel Device Layer
Linux驱动兼容层的做法虽然巧妙,但带来了性能,可靠性和稳定性的一些问题。vSphere 5.5开始,Native Device Dri