内核级虚拟化技术

这篇可能讲的有一点点的无聊,因为基本上是概念性的东西,我也是理解了很久才慢慢的搞懂的。

一、虚拟化与虚拟化技术

  1.1、虚拟化的定义

  虚拟化主要指的是特殊的技术,通过隐藏特定计算平台的实际物理特性,为用户提供抽象的、统一的、模拟的计算环境(称为虚拟机)(IBM定义)。虚拟化为有效利用大型机的资源提供了技术支持。

  虚拟机技术也是多种多样,而可以虚拟的层次或者可虚拟的方面也是遍布从硬件到应用层整个计算机系统。

  1.2、虚拟化技术

    其实现在的虚拟化技术非常多的,比如说我现在在用的:VMWare、VirtualBox(sun)。

    还有就是Hyper-V(Microsoft )、 OpenVZ(Parallels)、LPARS(IBM)等等。

二、虚拟化分类

  虚拟机的分类也是多种多样。可以通过是否在裸机上部署来分为面向主机的的虚拟机和面向裸机的虚拟机。面向主机的虚拟机是指的在一台已经安装操作系统的主机上安装虚拟机管理(VMM)程序,而面向裸机的是指在裸机上直接安装虚拟机管理程序,

  所有的虚拟机调用都是直接由虚拟机管理程序来负责,没有了操作系统这一步,所以这种方式在效率上要高于面向主机的。不过,比较流行的技术比如vmware,xen都是面向主机的。

 2.1、硬件虚拟化与软件虚拟化

  软件虚拟化:软件层面的虚拟化,往往是指在同一个操作系统实例的基础上提供多个隔离的虚拟运行环境,也常常被称为容器技术。LXC(Linux Container)则是采用了这种技术,它主要是采用了linux本身提供的技术,在一定程度上模拟虚拟化。

        软件虚拟化也可以理解成进程级虚拟机,其他虚拟化成为系统级虚拟机。在进程级虚拟机中负责虚拟化的软件成为运行时软件,而系统级虚拟机中负责虚拟化的软件成为VMM(Virtual Machine Monitor)

  硬件虚拟化:硬件虚拟化基本上就是在一台宿主机上虚拟了整个系统,各台虚拟机之间相互不可见。这会很明显导致很多重复的线程和重复的内存页出现,性能上肯定会有影响。所以采用这种技术,一台宿主机上虚拟机的个数肯定会有一定限制。

  2.2、平台虚拟化与软件虚拟化

  2.3、全虚拟化与半虚拟化

  Full Virtualization(全虚拟化):几乎是完整地模拟一套真实的硬件设备。大部分操作系统无须进行任何修改即可直接运行在全虚拟化环境中。像kvm等技术是全虚拟化。

  Paravirtualization(半虚拟化):不对硬件设备进行模拟,虚拟机拥有独立的运行环境,通过虚拟机管理程序共享底层的硬件资源。大部分操作系统需要进行修改才能够运行在半虚拟化环境中。

                  它的性能要稍微高于全虚拟化。像Xen。因为需要改动托管系统的内核,所以xen是不支持win虚拟机的。

  Partial Virtualization(部分虚拟化):仅仅提供了对关键性计算组件或者指令集的模拟。操作系统可能需要做某些修改才能够运行在部分虚拟化环境中。

三、传统虚拟化架构和KVM虚拟化架构

  3.1、传统虚拟化架构

  3.2、KVM虚拟化架构

  KVM是嵌入在Linux操作系统标准内核中的一个虚拟化模块,它能够将一个Linux标准内核转换成为一个VMM,嵌有KVM模块的Linux标准内核可以支持通过kvm tools来进行加载的GuestOS。

  所以在这样的操作系统平台下,计算机物理硬件层上直接就是VMM虚拟化层,而没有独立出来的HostOS操作系统层。 

在这样的环境中HostOS就是一个VMM。每个由KVM创建的GuestOS都是HostOS(或VMM)上的一个单个进程。而在GuestOS上的User-space中运行的Applications可以理解为就是进程中的线程。

四、linux使用KVM实现全虚拟化

  4.1、KVM全虚拟化实现

  KVM只是虚拟化解决方案的一部分,想要实现全虚拟化,还需要的条件是:

    1) CPU处理器提供的虚拟化支持(VT-x 硬件辅助虚拟化,可以为GuestOS创建虚拟化处理器,本质是对寄存器的隔离模拟和对指令集的划分)。 

    2) 内存可以通过kvm虚拟化成独立的虚拟化地址(/dev/kvm) 

    3)I/O虚拟化(QEMU)   

  所以说: KVM虚拟化 = KVM内核模块 + /dev/kvm + QEMU

  4.2、kvm全虚拟化详解

    1)/dev/kvm

    Linux操作系统标准内核中的KVM内核模块生成了一个名为/dev/kvm的设备,有了/dev/kvm设备,使得GuestOS的地址空间(内存地址、磁盘地址)能够独立于标准内核或其他任何GuestOS的地址空间。

    Linux操作系统目录结构包含的/dev目录树下的设备对于所有User-space进程或线程(无论是在GuestOS上,还是在VMM上)来说都是通用的,但是每个打开/dev/kvm设备的不同的进程或线程,所能使用的都是唯一且各不相同的地址映射(为了支持GuestOS间的隔离)。

    KVM内核模块通过/dev/kvm设备提供了内存虚拟化,给予GuestOS与内核或者其他GuestOS相对独立的地址空间。每个GuestOS都有自己的地址空间,并且这些地址空间是在实例化GuestOS时创建映射的。

    映射给GuestOS的物理内存实际上是映射给这个GuestOS在VMM中相应进程的虚拟内存。   

有两种支持Guest地址到Host(VMM)地址的转换方法:

      应用LinuxOS维护的一组影子页表(shadow page table)

      CPU也可以通过在访问未经映射的内存位置时使用VMM(主机内核)来支持内存转换进程。

 所以总的来说,/dev/kvm设备的作用就是:将不同的GuestOS之间的地址隔离,或将GuestOS和HostOS(VMM)之间的地址隔离

    2)QEMU   

    QEMU是一个I/O虚拟化解决方案,能够对一个完整的计算机物理层环境进行虚拟化(EG. 磁盘、图形适配器、网络设备)。

    在GuestOS中生成的所有I/O请求都会被QEMU中途截获,并重新发送到QEMU进程模拟的User Mode中。

  4.3、Openstack、KVM、QEMU

    KVM 用来模拟 CPU 的运行,但缺少了对 Network 和 I/O 的支持。QEMU-KVM 是一个完整的模拟器,它基于 KVM 上,提供了完整的 Network 和 I/O 支持。其中 Openstack 为了跨 VM 性,所以不会直接控制 QEMU-KVM,而是通过 libvit 的库去间接控制 QEMU-KVM 。

    KVM的实现原理图:

    KVM内核模块为Linux标准内核引入了一种除现有的Kernel ModeUser Mode之外的新进程模式。这种新模式就称为Guest Mode模式,顾名思义,它用来执行GuestOS的代码。      Linux标准内核的执行模式可以针对不同的运行内容和目的进行定义。Guest Mode的存在就是为了执行GuestOS的代码,但是只针对那些非I/O的代码。I/O代码还需要QEMU来作为支持。   

GuestOS可以在两种模式下运行:

      在Guest Mode中运行的GuestOS可以支持标准的内核。

      在User Mode下运行的GuestOS则支持自己的内核和User-space(Applications)。

    相同的是,GuestOS只能够在User Mode下执行I/O操作,而且这是单独使用QEMU-KVM进行管理的。

  五、内核级虚拟化技术

  内核级虚拟化技术:Kernel-based Virtual Machine,简称KVM

  5.1、KVM优势

  1)KVM Memory Page Sharing

  2)The benefits od Disk Overlay

  5.2、KVM特性

    嵌入到Linux正式Kernel(提高兼容性)    代码级资源调用(提高性能)    虚拟机就是一个进程(内存易于管理)    直接支持NUMA技术(提高扩展性)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏BestSDK

Docker的三大核心概念

Docker是啥 Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可...

31450
来自专栏搜云库

Docker-17.06.2 环境搭建

Docker 简介 Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在...

21770
来自专栏北京马哥教育

如何用两个小时入门 Docker?

最初的2小时,你会爱上Docker,对原理和使用流程有个最基本的理解,避免满世界无头苍蝇式找资料。本人反对暴风骤雨式多管齐下狂轰滥炸的学习方式,提倡迭代学习法,...

12700
来自专栏SDNLAB

OpenStack Zun组件详解

40650
来自专栏北京马哥教育

高中生也能读懂的Docker入门教程

Docker 是 Golang 编写的, 自 2013 年推出以来,受到越来越多的开发者的关注。如果你关注最新的技术发展,那么你一定听说过 Docker。不管...

40470
来自专栏程序员同行者

docker学习笔记

Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。简言之,docker就是用go开发的一种轻量级虚拟化容器。

12820
来自专栏织云平台团队的专栏

【 全干货 】5 分钟带你看懂 Docker !

Docker是什么?能干什么?使用了什么技术架构?怎么使用?...所有的问题本文都将为你一一解答。

1.4K30
来自专栏虚拟化云计算

说一说虚拟化绕不开的io半虚拟化

QEMU-KVM作为一个VMM提供了全虚拟化环境,guest不经过任何修改就能运行在KVM环境中。不过KVM在IO虚拟化方面,使用QEMU纯软件的方式来...

43590
来自专栏云计算爱好者

简单介绍Docker的架构特性与局限

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是...

28460
来自专栏python3

Docker是啥?

Docker的图标代表,它托着许多集装箱。我们可以把宿主机可当做这只鲸鱼,把相互隔离的容器可看成集装箱,每个集装箱中都包含自己的应用程序。

12720

扫码关注云+社区

领取腾讯云代金券