虚拟机主要是什么原理?
ツ▭虚拟机主要是什么原理?
我写了一个小项目桃花源(英文名为 peach),该项目是一个迷你虚拟机,用于学习 Intel 硬件虚拟化技术。学习该项目可使读者对 CPU 虚拟化、内存虚拟化技术有个感性、直观的认识,为学习 KVM 打下坚实的基础。peach 实现了如下功能:
使用Intel VT-x技术实现CPU虚拟化使用EPT技术实现内存虚拟化支持虚拟x86实模式运行环境支持虚拟CPUID指令支持虚拟HLT指令,Guest利用HLT指令关机代码仓库如下:
https://gitee.com/pandengyang/peach.git
https://github.com/pandengyang/peach.git
▶Ⓒ虚拟机主要是什么原理?
在理解虚拟机之前,我们需要先弄明白计算机系统(我们的电脑),明白了计算机系统的构成我们才能理解什么是虚拟机。
计算机系统通常由CPU, 内存,存储,网卡等硬件等构成,计算机是建立在这些硬件之上的,有了这些硬件才能构成一台完整的计算机。
虚拟机(Virtual Maching)就是虚拟出来的计系统,或者可以说是模拟出来的计算机系统。虚拟机依赖虚拟机管理程序(或者叫做虚拟机控制程序),虚拟机管理程序负责将宿主计算机的资源(内存,CPU,网络等等)映射到虚拟机的虚拟资源(内存,CPU,网络等等)。
通过上面的对比可以知道,计算机是有实实在在的硬件系统的,但是虚拟机是没有的,虚拟机的硬件系统都是将宿主机(安装虚拟机的计算机)的硬件系统虚拟出来的。这里可能比较抽象,我们可以举一个例子,计算机进行计算,直接使用自己的CPU来计算就行;但是虚拟机进行计算的话,虚拟机是没有自己的实际硬件CPU的,因此虚拟机的计算只有发到其宿主计算机的CPU上来计算。
如果上面的问题还比较抽象的话,我们可以拿现实中的例子来类比一下。大家都知道在北京租房子是很贵的,通常一套房子有单独的厨房,卫生间,客厅等。可是一套房整租 太贵了,这时候几个小伙子可以合租这一套房子,大家共用厨房,卫生间,客厅等配套设备。这个例子不一定恰当,但是已经比较近似了,希望大家可以明白我的意思。
好的,为什么要用虚拟机那?虚拟机的好处是什么?
虚拟机是轻量级的计算机系统,安装部署方便;虚拟机可以将宿主机的系统资源划分给多个虚拟机共同使用,提高资源的利用率;虚拟机之间是相互隔离的,一台虚拟机的事故不至于影响到其他虚拟机;有时候为了测试其它操作系统,我们没必要弄多台计算机,只需要装上虚拟机,在虚拟机上测试即可。
➚➯虚拟机主要是什么原理?
要了解虚拟机的原理,要从多个角度去思考。
虚拟机运行:
是指在完全隔离的环境中运行、具有完整硬件系统功能的软件模拟的完整计算机系统。
原理:
最初创建的Java源文件(.Java文件)中。Java文件首先通过前端编译器(javac或ECJ)编译为Java字节代码文件。
JRE接着加载Java字节代码文件,加载系统分配给JVM的内存区域,运行引擎解释或编译类文件,然后实时编译器将字节代码转换为机器代码。
虚拟机资源包括CPU、内存、网络和磁盘等多个方面。规划虚拟机时,应考虑这些资源之间的关系。否则,分配的资源可能不适当,这会降低虚拟机内应用程序的性能。
CPU:
虚拟机只在一个物理核心上运行每个vCPU,因此CPU频率越高,虚拟机运行速度越快,vCPU数量越多,有助于提高应用程序的性能。
更复杂的因素之一是,在ESXi服务器中,所有虚拟机共享物理CPU。ESXi服务器中的内核数越多,每个vCPU的内核份额就越大,因此多核的性能比内核频率高,但数量比较少时更好。
如果虚拟机使用大量CPU时间,建议为虚拟机分配第二个vCPU,但由于只有多线程应用程序才能有效使用多个vCPU,因此为虚拟机分配多个vCPU并不意味着应用程序运行得更快。
RAM:
在ESXi服务器中,RAM资源通常是有限的,在将RAM分配给虚拟机时需要特别小心。VMkernel在处理RAM时非常聪明。允许虚拟机使用ESXi服务器上的所有物理内存,并且不使用物理内存。
完全使用物理内存后,VMkernel必须确定哪些虚拟机可以保留物理内存,哪些虚拟机可以保留物理内存。这称为“内存回收”。回收虚拟机使用的物理内存存在影响虚拟机性能的风险。虚拟机回收的内存越多,产生的风险就越大。
最明智的做法是仅向虚拟机分配完成操作所需的内存。额外分配内存会增加回收风险。另一方面,在虚拟机操作系统中使用未使用的内存作为磁盘缓存时,这是一个折衷点,因为对磁盘系统的性能要求会大大降低。
对于数据库服务器和VDI台式机,向虚拟机分配更多内存通常比不购买高性能磁盘阵列而在一台ESXi服务器上运行更少的虚拟机更经济高效。关键是在虚拟机的负载中分配足够的内存,没有浪费。
☩◍虚拟机主要是什么原理?
虚拟机的概念比较宽泛,通常人们接触到的虚拟机概念有VMware那样的硬件模拟软件,也有JVM这样的介于硬件和编译程序之间的软件。一般情况下,指的是前者。
虚拟化是一种资源管理技术, 是将计算机的各种物理资源, 如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破物理设备结构间的不可切割的障碍,使用户可以比原本的架构更好的方式来应用这些资源。这些资源的虚拟部分是不受现有资源的架构方式、地域或物理设备所限制。
虚拟化创建了一层隔离层,把硬件和上层应用分离开来,允许在一个硬件资源上运行多个逻辑应用。
虚拟化有:服务器虚拟化、应用程序虚拟化、展现层虚拟化、桌面虚拟化。
首先看一下整个虚拟机在物理机上的结构。
每台虚拟机的组成要素:虚拟机的os,应用程序需要的各种包,应用程序。而每一台虚拟机都是在Hypervisor的基础上建立起来的。
Hypervisor
Hypervisor(虚拟机管理器)是一种运行在物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享一套基础物理硬件,因此也可以看作是虚拟环境中的“元”操作系统,它可以协调访问服务器上的所有物理设备和虚拟机,也叫虚拟机监视器(Virtual Machine Monitor)。
针对上图的可以理解为:Hypervisor是运行在物理机之上,为多台虚拟机提供能够宿主在物理主机之上的基础环境。
其实Hypervisor可以分为两种:
I型--裸机型,直接运行在物理设备之上,是一种基于内核的虚拟机(其中包括 Oracle 虚拟机、VMware ESX Server、Microsoft Hyper-V 和 Citrix XenServer【2】)。这种类型的Hypervisor所扮演的角色是一种抽象概念的OS。
II型--宿主机型,运行在宿主机器的操作系统上(如上图)(VMware Workstation、Microsoft Virtual PC 和 Parallels Workstation【2】 ) 创建硬件全仿真实例。Hypervisor构建出一整套虚拟硬件平台(CPU/Memory/Storage/Adapter),上面需要你再去安装新的操作系统和需要的应用软件,这样底层和上层的OS就可以完全无关化。
✎Ⓑ虚拟机主要是什么原理?
其实这个东西不是一两句话能说清楚的,
要回答这个问题,首先看为什么一个OS无法直接与另外的OS共存。答案很简单,OS作为硬件上第一层软件,认为自己拥有全部的硬件的访问和控制权,且自己是唯一的控制者。在这种情况下,如果两个OS共存,必然产生问题。
OS主要负责管理的是CPU和内存,以及众多的IO设备。于是我们可以分别讨论。hypervisor是实现虚拟化的关键,它会以一个内核态的驱动存在。
CPU的虚拟化:
背景知识:x86 CPU有一项权限机制,把CPU的状态置于RING 0到RING 3分别使CPU具有最高的权限到最低的权限。以Linux为例,内核运行于RING 0上,而其余全部用户进程运行于RING 3上(Xen比较奇葩,Linux在Xen下面会运行于RING 1)。在用户权限下,所有的IO设备是不可操作的,另外,有些控制寄存寄是无法访问的,一些privilege的指令是不能运行的。因此一个用户进程要想读写文件,进行一些操作,就要依赖于内核。系统调用能够使CPU运行于RING 0,并执行内核代码(具体方法见一些操作系统教程)。
背景说完。一个CPU的全部状态其实就是所有寄存器的值,只要保证任何操作之后寄存寄的值在OS看来是正确的,guest OS就可以正常执行。hypervisor会为每个虚拟的CPU创建一个数据结构,模拟CPU的全部寄存器的值,在适当的时候跟踪并修改这些值。
那么考虑虚拟化一个CPU,在虚拟化的guest OS里面,CPU无论如何也不可能运行于RING 0,因为这样的话,host OS必然会crash掉。因此,当一个guest OS想要进入到RING 0执行内核代码时,hypervisor会向guest OS说谎,并告诉它,你已经在RING 0上了,而实际上,所有的指令还是在RING 3上。当guest OS访问到任何privilege的东西时,hypervisor会接到fault,此时hypervisor会判断这个指令是什么,并修改相应的虚拟寄存器的状态,然后返回。这样guest OS就可以正常的运行。需要指出的是,在大多数的指令下代码是直接跑在硬件上的,而不需要软件介入。只有在一些权限高的请求下,软件会介入,并维护虚拟的CPU状态。
内存的虚拟化:
背景知识:虚拟内存,页表结构等。OS的基础内容,不表。
hypervisor虚拟化内存的方法是创建一个shadow page table。正常的情况下,一个page table可以用来实现从虚拟内存到物理内存的翻译。在虚拟化的情况下,由于所谓的物理内存仍然是虚拟的,因此shadow page table就要做到:虚拟内存->虚拟的物理内存->真正的物理内存。
以下是细节,如果看着闹心,请忽略。hypervisor会维护一个从虚拟内存到物理内存的映射,当guest OS更换自己的page table,也就是改变CR3寄存器的值,hypervisor会因为用户态的权限不足而接到一个general exception,hypervisor会记录用户想要更换的新的页表,并放上一个空的shadow page table,然后返回。这个空的shadow page table会在接下来的执行中造成CPU无法进行地址翻译,而产生page fault。在fault发生后,hypervisor会得到一个虚拟地址,然后根据之前记录的用户的页表结构,翻译出一个虚拟机器地址,然后再把这个虚拟的机器地址,由hypervisor维护的映射翻译为实际的机器地址,然后装入shadow page table,并返回执行。如此,就实现了:虚拟内存->虚拟的物理内存->真正的物理内存。
I/O虚拟化:
背景知识:memory mapped I/O device。大多数的PCI设备都是直接将自己的某些控制寄存器映射到物理内存空间上,CPU访问这些控制寄存器的方法和访问内存相同。CPU通过修改和读取这些寄存器来操作I/O设备。
虚拟化的方法很简单,没当hypervisor接到page fault,并发现实际上虚拟的物理内存地址对应的是一个I/O设备,hypervisor就用软件模拟这个设备的工作情况,并返回。比如当CPU想要写磁盘时,hypervisor就把相应的东西写到一个host OS的文件上,这个文件实际上就模拟了虚拟的磁盘。
------------------
推荐阅读:
俄军最强陆战王牌疑现卢甘斯克,T90金身已破,T14能力挽狂澜吗?
骁龙888的荣耀,天玑9000+的iQOO,骁龙778G 4G的华为,如何选?
茶卡盐湖和天空一号该去哪个景区?因为时间比较赶,该优先去哪个景区呢?