1、虚拟化
- 在计算机技术中,虚拟化(技术)或虚拟技术(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源(CPU、内存、磁盘空间、网络适配器等),予以抽象、转换后呈现出来并可供分割、组合为一个或多个计算机配置环境。由此,打破实体结构间的不可切割的障碍,使用户可以比原本的配置更好的方式来应用这些计算机硬件资源。这些资源的新虚拟部分是不受现有资源的架设方式,地域或物理配置所限制。一般所指的虚拟化资源包括计算能力和数据存储。
- 虚拟机:虚拟计算机设备
在管控逻辑上实现切割,在有限的资源之上覆盖一层管理软件,让管理软件在底层存储逻辑概念上对硬件加以切分,在逻辑上用软件模拟出或虚拟出硬件
CPU虚拟化
- 管理软件在逻辑上把CPU上连续的时间轴上切分为多个时间片,分给不同的虚拟机,处理该虚拟机的进程,这就相当于给该虚拟机配置了一个CPU
- 现代计算机以多任务多用户模式运行,内核把提供计算能力的计算资源进行虚拟化,因此操作系统就相当于内核的一个虚拟机
虚拟机是在操作系统对内核虚拟化之后进行的二次虚拟化,在虚拟化资源上安装操作系统,操作系统上存在两个空间:内核空间和用户空间,这样一来就存在了两个内核,也即存在两级管理 - x86架构cpu
从外向内为环3、环2、环1、环0
特权指令:存放在环0 控制指令
非特权指令:存放在环3 运算操作的非特权指令
环1和环2没有使用
只有操作系统有权限运行环0上的特权指令,任何运行在用户空间的进程使用非特权指在环3上运行,要想使用环0上的特权指令就需要进行系统调用,系统把环0进行封装并查任何一个请求者是否有权限进行调用
如下图所示:
- 半虚拟化、准虚拟化(paravirtualization)
典型代表:Xen
直接让内核知道运行在虚拟环境中,需要更改内核,linux支持
修改虚拟机的内核和宿主机的内核,让二者进行对接。当有需求虚拟机不会直接调用内核,而是调用宿主机提供的API,这样就去除了其中一部分步骤
- 完全虚拟化
通过 VMM 来预先拦截这些 OS 当中原本不能被虚拟化的命令(nonvirtualizable instructions),并将其进行二进制转译的替换操作,使操作系统认为自己可以直接掌控硬件,并不知道实际上已经被虚拟化成为虚拟机了,而应用程序一般性的命令则还是直接向硬件请求,以维持良好的性能。如下图所示:
- 硬件辅助虚拟化hvm
虚拟机内核使用环0,宿主机内核使用环-1
虚拟机内核发送特权指令时会触发环-1,唤醒真正的宿主机内核执行相关任务
需要CPU硬件生产厂商支持,在环0内增加一个环,即-1环
内存虚拟化
- 把虚拟机称为客户机Guest,物理机称为宿主机Host
物理机和虚拟机均可视为两层结构:
客户机Guest虚拟地址到客户机Guest物理地址的映射
宿主机Host虚拟地址到宿主机Host物理地址的映射 - 二次虚拟化:操作系统是对物理内核的一次虚拟化,在操作系统之上进行再次虚拟化是为二次虚拟化,相当于在宿主机之上叠加客户机,这样一来就形成了四级结构
如下所示:
四级结构:
客户机虚拟地址GVA-->客户机物理地址GPA-->宿主机虚拟地址HVA-->宿主机物理地址HPA
客户机虚拟地址GVA:Guest Virtual Adress
客户机物理地址GPA:Guest Physical Adress
宿主机虚拟地址HVA:Host Virtual Adress
宿主机物理地址HPA:Host Physical Adress
其中前两步由虚拟机的系统页表完成,
中间两步由 VMM 定义的映射表(由数据结构 kvm_memory_slot 记录)完成,它可以将连续的虚拟机物理地址映射成非连续的 Host 机虚拟地址,
后面两步则由 Host 机的系统页表完成
这样做得目的有两个:
提供给虚拟机一个从零开始的连续的物理内存空间。
在各虚拟机之间有效隔离、调度以及共享内存资源
-
页表page table:存储虚拟地址到物理地址的映射关系
-
MMU(内存管理单元):基于硬件实现对页表的管理,加速页表的查询速度。
-
传统的内存虚拟化方式,虚拟机的每次内存访问都需要VMM介入,并由软件进行多次地址转换,其效率是非常低的。因此才有了影子页表技术和 EPT 技术。
-
影子页表(shadow page table)简化了地址转换的过程,实现了Guest虚拟地址空间到Host物理地址空间的直接映射。
要实现这样的映射,必须为Guest的系统页表设计一套对应的影子页表,然后将影子页表装入Host的MMU中,这样当Guest访问Host内存时,就可以根据MMU 中的影子页表映射关系,完成GVA到HPA的直接映射。而维护这套影子页表的工作则由VMM来完成。
由于Guest中的每个进程都有自己的虚拟地址空间,这就意味着VMM要为Guest中的每个进程页表都维护一套对应的影子页表,当Guest 进程访问内存时,才将该进程的影子页表装入Host的MMU中,完成地址转换。
我们也看到,这种方式虽然减少了地址转换的次数,但本质上还是纯软件实现的,效率还是不高,而且VMM承担了太多影子页表的维护工作,设计不好。
为了改善这个问题,就提出了基于硬件的内存虚拟化方式,将这些繁琐的工作都交给硬件来完成,从而大大提高了效率。 -
EPT 扩展页表 在原有影子页表的基础之上,直接实现了客户机物理地址到宿主机物理地址的映射,步骤如下所示:
三级结构:客户机虚拟地址GVA-->客户机物理地址GPA-->宿主机物理地址HPA
即影子页表实现客户机Guest虚拟地址到客户机Guest物理地址的映射,
EPT页表实现Guest物理地址到宿主机Host物理地址的映射
而影子页表存在MMU中被管理,这样一来就实现了Guest物理地址到宿主机Host物理地址的直接映射,进一步提升了访问的效率
总结:
内存虚拟化经历从虚拟内存,到传统软件辅助虚拟化,影子页表,再到硬件辅助虚拟化,EPT 技术的进化,效率越来越高。
转载博客为 https://blog.csdn.net/yongliang_w/article/details/78367644
https://www.cnblogs.com/bakari/p/7966707.html
-
软件级:
影子页表(shadow page table) 属于半虚拟化 -
硬件级:
AMD:NPT(嵌套式页表)
Internet:EPT(扩展页表) 属于完全虚拟化 -
二级转换:
影子页表:虚拟机进程-->虚拟机内核-->物理机内核 基于软件实现
EPT:虚拟机进程-->物理机内核 基于硬件实现,速度更快
IO虚拟化
- IO路径需要虚拟
IO设备背后所需要的设备也需要虚拟
IO设备模拟器:在物理机上用文件充当硬盘使用,即在虚拟机层上使用文件模拟硬盘,在虚拟机访问硬盘接口时,查看到的是用文件模拟的硬盘
虚拟机用户空间某进程访问硬盘时,需要两级驱动:
首先把IO请求发送给虚拟机内核,内核需要驱动软件模拟的虚拟机硬盘,因此虚拟机内核把IO请求指令封装为物理格式发送给模拟虚拟机硬盘的软件,软件把指令转为对宿主机内核的IO请求,宿主机再驱动物理硬盘接口连接物理硬盘
假如在此过程中软件模拟的硬盘给scsi格式,而物理硬件为USB格式,这就形成了两级驱动
解决方法:
半虚拟化:
减少中间环节:让虚拟机内核知道处于虚拟空间,把虚拟机内核请求封装起来直接发送给物理机内核
IO透传技术:穿透物理机内核,给虚拟机内核分配一部分物理磁盘,让虚拟机直接驱动物理硬盘
性能好,影响迁移,并不常用
网络虚拟化
- 软件模拟
用纯软件模拟交换机
veth device 虚拟以太网设备
可以模拟出一对网卡,一头连接虚拟机充当网卡,一头连接交换机充当接口
linux用纯软件在内核级模拟交换机,完成报文交换
OpenVSwitch 开源虚拟交换机ovs,功能强大 - 半虚拟化
透传技术:影响迁移,不常用
知识扩展:
vmware workstation网络模式
仅主机模式 虚拟机仅能和宿主机通信
可以把安装vmware生成虚拟网卡看做一个虚拟交换机,给虚拟网卡配置一个ip地址,并且虚拟机连接到该虚拟交换机上,相互之间就可以通信;此时虚拟交换机没有打开转发功能,因此只能连接在虚拟交换机上的主机之间相互通信
注意:仅主机模式仅支持虚拟机内同一网段主机之间通信,那么虚拟机之间不同网段通信则需要开启转发功能,手动添加路由条目或者指定网关
NAT模式
虚拟交换机开启虚拟机转发功能,只需在宿主机进行SNAT源地址地址转换,把虚拟机内部的主机ip地址转换为物理网卡的ip地址,这样就能实现虚拟机内部的所有主机与虚拟机之外的主机进行通信
虚拟机启动自动获取地址:在虚拟机开启一个进程设置为DHCP服务器,连接到虚拟交换机上,如此就能自动获取ip地址
桥接模式
宿主机的物理网卡腾出来当做交换机,再创建虚拟网卡充当宿主机的网卡,宿主机的ip地址直接转移到虚拟网卡之上,物理机与虚拟机都可以连接到物理网卡充当的交换机上与web(外网)进行通信
缺点:使用桥接模式连接的主机都处于同一个网段,容易产生广播风暴
文章评论