23.虚拟化技术

虚拟化是什么

virtualization

将任何一种资源(CPU,内存)抽象成另一种形式的技术都叫虚拟化,是资源的一种逻辑表示关系,解除了物理硬件与操作系统之间的紧耦合关系。

虚拟化前:IT资源独立,每台服务器只能装对应的操作系统,无法扩展其他的资源,也就是操作系统必须与硬件紧耦合;

举例:上世纪工人包分配,不能跳槽;

虚拟化后:通过虚拟化技术将底层资源资源池化,成为共享资源,于是上层操作系统与硬件解耦,操作系统从资源池中抽取资源,最大化的利用资源;

资源池化:将物理资源通过虚拟化技术抽象成逻辑资源;举例:自来水厂

举例:BOSS直聘,中介

虚拟化的基本概念

Hypervisor(VMM)管理虚拟机的生命周期;有KVM,CNA.ISO

Guest Machine(VM):VRM.ISO

Guest OS:windows,linux;

Hypervisor的分类

一型虚拟化/裸金属虚拟化:hypervisor与操作系统在同一层

二型虚拟化/宿主型虚拟化:hypervisor与操作系统不在同一层

注:VMM与VM属于hypervisor

RING指令

ring指令是CPU指令的一种分类方式,主要用于区分指令的执行权限和分配方式

不管是VMM或者是VM调度底层资源时都需要相应的RING权限

有四种分类:

问:VMware workstation运行在哪一层?

答:ring3

问:为什么VMware workstation创建虚拟机时可以调度CPU资源??

答:全虚拟化

在虚拟化的环境中,需要为每个guest OS提供隔离的,单独的CPU环境,通常有三种解决方案:全虚拟化,半虚拟化,硬件辅助虚拟化。

全虚拟化

全虚拟化就是全部由软件模拟的,当在VMM上创建虚拟化时,虚拟机能够正常申请CPU资源,因为VMM在申请资源的时候通过二进制翻译(BT)向ring0申请,这时候就能创建成功。

特点:guest OS并不知道自己运行在模拟的环境中,

缺点:需要VMM做中间传话,有个中间商赚差价

VMware workstation,QUME等

半虚拟化

XEN是裸金属虚拟化,属于半虚拟化。

通过软件模拟的虚拟化,将hypervisor层运行在ring0,guest OS运行在ring 1,而应用程序依旧运行在ring3;

特点:要修改系统,guest OS知道自己运行在模拟的环境中,非敏感指令可用穿透操作系统直接调度底层资源。

问:我的电脑支持半虚拟化??

答:不支持;无法修改win10的源码

硬件辅助虚拟化

CPU支持虚拟化;如hyper-V是微软的虚拟化产品

虚拟化的发展史

REHL 5.0加入XEN XEN不愿意把源码加入到Linux

RHEL 5.4收购了KVM 5.4-5.9 XEN KVM 并行

REHL 6.0抛弃了XEN,只保留了KVM

KVM

KVM简介

KVM的全称是Kernel-based Virtual Machine,字面意思是基于内核的虚拟机。其最初是由Qumranet公司开发的一个开源项目。2008年,QumranetRedHat所收购,但KVM本身仍是一个开源项目,由RedHatIBM等厂商支持。
KVM之所以叫做基于内核的虚拟机,是因为KVM本身是一个Linux内核模块,当安装有Linux系统的物理机安装了这个模块后,就变成了Hypervisor,而且还不会影响原先在该Linux上运行的其它应用程序。
Xen类似,KVM支持广泛的CPU架构,除了x86/x86_64 CPU架构之外,还将会支持大型机(S/390)、小型机(PowerPCIA64)及ARM等。
KVM充分利用了CPU的硬件辅助虚拟化能力,并重用了Linux内核的诸多功能,使得KVM本身是非常瘦小的,KVM的创始者Avi Kivity声称KVM模块仅有约10000行代码,但我们不能认为KVMHypervisor就是这个代码量,因为从严格意义来说,KVM本身并不是Hypervisor,它仅是Linux内核中的一个可装载模块,其功能是将Linux内核转换成一个Hypervisor
通过KVM模块的加载将Linux内核转变成HypervisorLinux本身运行于内核模式,主机进程运行于用户模式,虚拟机则运行于客户模式,使得转变后的Linux内核可以将主机进程和虚拟机进行统一的管理和调度,这也是KVM名称的由来。
KVM历史:
200610月,以色列公司Qumranet发布KVM
200612月,KVM合入内核(Linux 2.6.20rc);
20072月,Linux 2.6.20正式版发布;
20089月,Redhat1.07亿美元收购Qumranet
20099月,RHEL 5.4开始支持KVM(同时支持Xen);
201011月,RHEL 6.0之后仅支持KVM

KVMQEMU

KVM用来模拟CPU的运行,但缺少了对NetworkI/O的支持。QEMU-KVM是一个完整的模拟器,它基于KVM上,提供了完整的I/O模拟支持。其中OpenStack为了跨VM性,所以不会直接控制QEMU-KVM,而是通过Libvirt的库去间接控制QEMU-KVM,后续我们会对Libvirt进行介绍。
KVM离不开QEMUKVM实现初期,为了简化开发和代码重用,在QEMU基础上进行了修改,主要是将比较消耗CPU性能的CPU虚拟化和内存虚拟化部分移交到了内核中实现,保留IO虚拟化模块在用户空间实现。避免了用户态和内核态的频繁切换,优化使用性能。
QEMU离不开KVM。之前我们提到,QEMU是一个纯软件的实现,运行在用户空间,性能非常低下,所以从QEMU的角度可以说是QEMU使用了KVM的虚拟化功能,为自身虚拟机提供资源与加速。
/dev/kvm接口是QEMUKVM交互的“桥梁”。/dev/kvm本身是一个设备文件,我们可以通过ioctl函数来对该文件进行控制和管理,从而完成用户空间与内核空间的数据交互。KVMQEMU的通信过程主要就是一系列针对该设备文件的ioctl系统调用。

KVM工作原理

KVM基本结构如上图。KVM已经是内核模块,被看作是一个标准Linux字符集设备(/dev/kvm)。QEMU通过Libkvm应用程序接口,用fd(文件描述符)通过ioctl向设备驱动来发送创建、运行虚拟机命令。设备驱动KVM会解析命令。
KVM模块让Linux主机成为了一个虚拟机监视器(VMM),在原有执行模式基础上,增加了客户模式。在虚拟机运行时,三种模式的工作为:
客户模式:执行非I/O的客户代码,虚拟机运行在这个模式下。
用户模式:代表用户执行I/O指令,QEMU运行在这个模式下,它用来为虚拟机模拟执行I/O类的操作请求。
内核模式:实现客户模式切换,处理因I/O或者其他指令引起的从客户模式退出动作(VM-Exit)。KVM模块工作在这个模式下。此模式下可以真正操作硬件,当Guest OS执行I/O类操作或特权指令操作时,需要向用户模式提交请求,然后由用户模式再次发起硬件操作请求给内核模式,从而真正操作硬件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云网大周

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值