将底层的计算机资源虚拟成多组彼此之间互相隔离的计算平台,并且每一个计算平台都应该有五大部件的所有设备(运算器,控制器,存储器,IO设备)。计算资源指的是CPU和内存。
实现应用分离和资源利用率最大化。
虚拟化=管理系统+虚拟机
裸机:在硬件上没有安装操作系统,而是直接安装hyper,hyper就是一个虚拟化软件,可以直接控制硬件。
xen, vmware ESX/ESXi
寄居:在硬件上安装操作系统,在操作系统上安装虚拟化软件,在虚拟化软件上创建虚拟机。
kvm, vmware workstation, virtualbox
从原理上来说:
当一个操作系统启动后,操作系统本身不执行任何生产任务,真正的生产功能由进程提供,
因此操作系统运行时为了能够协调多任务,操作系统被分割成了两段用户空间和内核空间
X86平台CPU指令集划分为4个特权模式:Ring0、Ring1、Ring2、Ring3。
内核空间:Ring0级别,特权代码 可直接调用内存和硬件 操作系统(内核)。
用户空间:Ring3级别,一切的普通应用程序,普通指令直接底层物理CPU上执行。
当用户空间中的进程要想执行特权指令或使用硬件时,需要通过系统调用来实现。(对内核的调用称为系统调用;对hypervisor的调用称为hyper call。)
驱动程序使用Ring1和Ring2级别。
所以一个虚拟机要正常运转使用计算资源(CPU内存),必须遵循4个特权模式
通过软件模拟,就可以实现。
硬件+操作系统+模拟器软件
常用的模拟有:PearPC, Bochs, QEMU
以QEMU为例,
QEMU是一个主机上的VMM(virtual machine monitor),通过动态二进制转换来模拟CPU4个特权模式,并提供一系列的硬件模型,使guest os认为自己和硬件直接打交道,其实是同QEMU模拟出来的硬件打交道,QEMU再将这些指令翻译给真正硬件进行操作。
优点:
一切都可以虚拟,虚拟机的cpu架构和物理cpu的架构可以不一致。
硬件上支不支持虚拟化功能无所谓,只是软件层面的模拟。
缺点:
guest os的一切指令必须通过vmm翻译给底层硬件,
例如需要将模拟的CPU指令集转化为真正物理CPU的指令,性能极差。
以上是虚拟CPU和物理CPU的架构不相同的情况。
如果虚拟CPU和物理CPU的架构完全相同,对虚拟机中ring3级别的应用,可以直接在底层物理CPU上执行,这样是OK的。
但是对于虚拟机的guest os,其实他是处于ring1的,但他自身无法感知,觉得自己处在ring0,会直接发出特权指令。
这就带来了:
X86平台虚拟化方面的难点就是如何将虚拟机越级指令使用进行隔离。
VMware公司最早的解决方案:捕获和翻译虚拟机指令。
在ring0中增加一个vmm。虚拟机监控器。
又称为hypervisor ,hypervisor只管理cpu 内存,IO设备不归hypervisor管理,相当于内核。
如果虚拟机发出ring0特权指令,vmm捕获后翻译转化成宿主机的指令集
因此这种方式,叫做完全虚拟化,guest os完全无感知。
优点:guest os不需要任何变动,速度性能远高于软件仿真,使用简单。
缺点:毕竟存储资源还是纯虚拟的,I/O设备性能不佳。
常见的完全虚拟化:VMware Workstation、 VMware ESX、VirtualBox、KVM、xen
Xen项目:对虚拟机的操作系统内核进行改造。
直接修改Guest OS内核代码,让虚拟机发出的ring0特权指令,直接去调用hypervisor call执行物理机的特权集。
vmm不再进行二进制翻译,虚拟机性能上去了。
因为guest os可以感知自己处于非ring0级别,这种方式叫做半虚拟化
常见的半虚拟化有:早期xen、Hyper-V、uml(user-mode linux)。
优点:这种模式和全虚拟化相比,架构更精简,而且在整体速度上有一定的优势。不再进行vmm二进制翻译。
缺点:需要对Guest OS进行修改,所以在用户体验方面比较麻烦。
Intel硬件解决方案:改造CPU指令
CPU指令进行改造,即VT-x
I/O通信也有硬件解决方案,称为VT-d
网络通信的称为VT-c。
Guest OS运行在ring0,理论上和宿主机性能一样,不过收到vmm的监视。
引入了硬件支持,比如Intel的VT-x和AMD的AMD-V,一般配合市面上的主流全虚拟化和半虚拟化产品使用。KVM只能运行在硬件辅助虚拟化场景中,
所以能启用VT-X就一定用上。
上述的虚拟化方式中的每个虚拟机都有自身独立的用户空间和内核空间,而底层对虚拟机管理的方式是通过hypervisor或host上的VMM(虚拟机监视器)实现,
创建虚拟机的目的提供用户空间来提供服务,内核空间无意义,
所以,同一个宿主机上的所有容器共享一个内核空间(底层操作系统)。
每个用户空间共享使用内核,这样就实现将用户空间分隔为多个,彼此间互相隔离。(稳定性低,但是性能好)
容器虚拟化的原理:基于CGroups、Namespace等技术将进程隔离,每个进程就像一台单独的虚拟机一样,有自己独立的资源、根目录、进程编号和内存空间等。
常用的容器级虚拟化由:OpenVZ、LXC
目前最热的容器虚拟化技术就是Docker,优势在于可以将一个开发环境进行打包,很方便的在另一个系统上运行。但是磁盘和网络性能还是有很多限制。
虚拟出一个程序运行所依赖的库环境。
wine,实现在linux运行windows程序。
jvm
参考如下:
https://www.jianshu.com/p/4e893b5bfe81
https://blog.csdn.net/gui951753/article/details/81045508
https://blog.csdn.net/qq_43260557/article/details/90730556?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158798910919195239808533%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=158798910919195239808533&biz_id=0&utm_source=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-2
https://blog.csdn.net/weixin_30405421/article/details/97208758
https://www.jianshu.com/p/312056e70387
https://blog.csdn.net/gui951753/article/details/81045508
https://www.cnblogs.com/lriwu/p/8954151.html
https://blog.csdn.net/qq_41258650/article/details/105006558
https://www.cnblogs.com/lriwu/p/8954151.html