由于工作的原因,需要开始接触虚拟化。正好前几天学了许岑的《如何成为有效学习的高手》,其中建议成年人需要以任务驱动的方式进行学习,并且需要刻意制造反馈,比如把学习内容整理成文章才能更有效的学习,所以尝试写下此文作为学习虚拟化历程的记录。 虚拟化我们都不陌生,平时我们网络工程师或者 Linux 运维工程师进行实验的各个平台都用了虚拟化的技术,比如VMware 还有EVE 模拟器等等。但其实我们使用的 Windows 其实也是一种最基础的虚拟化,它是分时复用系统,会将所有硬件进行虚拟化,再硬件资源逻辑化的基础之上,使用分时复用和共享内存功能,所以我们的电脑才能同时处理不同软件的工作。编程领域的 Java 虚拟机其实也是一种虚拟化技术,也是将操作系统资源进行虚拟化,然后 Java 程序就可以方便的移植到其他计算机上了。
广义上来讲,虚拟化就是在一套硬件上同时运行多个OS。虚拟化的实现就是开发出VMM(virtual machine monitor)虚拟机监视程序。最早的发展其实就是 IBM 开发分时系统了,IBM 工程师们通过将 CPU 的占用切分为无数个极短的时间片,然后让每片去执行不同的任务,通过轮询的方式使之伪装成多个 CPU 处理不同的程序,把物理资源逻辑化,以提高利用效率。
不同厂家开发出了不通的虚拟化软件和技术,他们的实现也有所不同。比如VMware 针对个⼈⽤户是VMware Workstation ,针对苹果系统是VMware Fusion,针对企业⽤户是VMware vSphere+VMware vCenter。Linux大厂 RedHat 使用的是(QEUM-KVM)kernel-based virtual machine 和QEUM。微软开发的是 hyper-V 运用在自家的 windows 系统上,厂家Citrix开发的是 Xen,这家和其他厂家不太相同,是一种半虚拟化技术。
因为工作的原因,我注重学习的是 Linux 的 KVM ,Linux 在 IT 领域应用的更为广泛,学习 Linux 就不在此多叙,如果想系统的入门学习Linux,可以去看看《Linux就该这么学》这本书。
在虚拟化中,物理机提供物理资源,再上一层是 Hypervior/VMM 也就是宿主机,由他分成不同的客户机 OS1,OS2,OS3......
虚拟化模式下有两种指令,特权指令和敏感指令。顾名思义,特权指令是操作和管理关键系统资源的指令,只有在最高特权级才能正确运行,如果在非最高特权级运行,特权指令会引发一个异常,处理器可能会陷入最高特权级,交由系统软件进行处理。敏感指令,是操作特权资源的指令,其中包含修改虚拟机的运⾏模式或者下⾯物理机的状态;读写时钟、地址重定位系统及所有的I/O指令、中断等寄存器;访问存储保护系统等等。通过对比可以得出特权指令比敏感指令等级更高。当 guest OS 执⾏特权指令的时候,VMM会捕捉到异常,对 guest OS 执⾏的特权指令进⾏特权降级,然后进行模拟,通过模拟的⽅式实现 guest OS 需要实现的操作。
需要注意的是由于X86架构的CPU,敏感指令并不完全是特权执⾏,有些敏
感指令对于VMM来说是捕捉不到的,所以⽆法进⾏特权降级然后陷⼊模拟,所以由于X86架构的CPU的这种情况,⽆法实现虚拟化的全部功能。
但如何解决X86架构的虚拟化实现呢,VMware给出了他们的技术方案,那就是通过二进制翻译(BinaryTranslation)。X86硬件虚拟化诞生也就十多年,但VMware已经成立了二十多年了,BT技术的历史也早已超过硬件虚拟化的历史,所以这是一项成熟到有些过时的技术了。BT技术包含了二进制代码翻译技术还有优先级压缩技术,他们的共用实现了让虚拟监视器和客户机可以运行在不同的特权级,实现Guest OS 的核心指令通过虚拟监视器的捕获和模拟来执行,实现客户操作系统需要做的操作。由于纯软件的实现⽅式导致效率极低,速度慢,所以又有了半虚拟化技术。半虚拟化采用了 Hypercall 技术,guest os 部分的代码被改变,使它会将特权指令的草案中都转还给 VMM 的 Hypercall,由 VMM 继续处理,使 guest os 知道自己运行在1环而不是0环,有效的避免了虚拟化的执行冲突问题。半虚拟化有一项优点,那就是效率高,但缺点是他无法虚拟化Windows,因为Windows不能修改代码。
本片介绍了虚拟化的概念还有各个厂家对虚拟化的不同技术实现,下一篇会持续介绍Linux 虚拟化技术 KVM 的安装和使用等。