RSS Feed

April, 2013

  1. 虚拟化的两种方案

    April 3, 2013 by xudifsd

    虚拟化是云计算催生的技术之一,它的目的就是让运行在其上的应用程序觉得自己独占所有的资源。与当年的虚拟内存的出现的原因一样:在出现虚拟内存之前,所有的进程都能知道本机上还有哪些其他的进程,需要注意不要踩到别的进程。但是出现虚拟内存之后所有进程都觉得自己独占了4G内存(32位机器)。而现在的虚拟化技术只是将这个虚拟范围扩展了而已(扩展到了文件系统,进程和设备领域)。

    解释现在正在进行的虚拟化潮流的入门概念最清楚的就是这篇文章了,它将虚拟化的两种方案做了比较,并且指出现在正在进行的Container虚拟化的缘由。

    虚拟化的目标

    简单来说虚拟化的目标就是这两个:

    • 资源控制和隔离
    • 名字空间的隔离

    所谓的资源控制就是记录用户(这个用户不是指人类,而是指进程或进程组,之后也使用这个概念)消耗了多少资源,并给与每个用户一定的,而不是无限制的资源。而隔离则将虚拟化进行地更加彻底:防止一个用户的资源需求影响到其他用户的资源需求(例如在内存资源欠缺的系统中,一个进程的的内存需求可能会将另一个进程的内存页swap到外存而减缓其完成速度)。

    名字空间的隔离就是允许在同一个硬件上的不同用户看到不同的UNIX资源(进程号或网络接口等),例如一个名字空间的进程号和另一个名字空间的进程号指的不是同一个进程,这样这两个名字空间就不会相互影响,因此也就让作业觉得自己独占了所有资源。

    虚拟化的两种实现

    虚拟化有两种实现,如果你只是想要了解如何进行选择,可以看这篇文章

    Hypervisor

    Hypervisor就是在操作系统上再运行一个或多个操作系统,这样底层的操作系统就叫做hypervisor,它来管理和分配上层操作系统所需要的资源。可以看到这样的虚拟化方案多么的无奈:为了实现资源和名字空间的控制和隔离而运行多个操作系统实体,这样的开销实在是有点大。

    根据维基的解释,这种虚拟化也分两种类型:

    • 原生(native),直接将需要虚拟的OS运行在裸机上,如kvm,Xen。这些方案都需要特殊的硬件支持
    • 宿生(hosted),在软件层面虚拟化,如Virtualbox。

    和上面第一个链接中提到的那样,hypervisor只是人们在OS实现真正操作系统层面虚拟化之前这个过渡时期所应用的方法而已,因为要让OS直接支持虚拟化还需要很多路要走,但是如果只是增加一些硬件支持就能使用虚拟化,那么这条路就会被当作临时的解决方案。最终在container实现之后这个技术终将成为历史(当然可能也不会消失,因为最近为了在linux上也能上12306.cn查票,我还在virtualbox里装了个Win。。这种需求不是container能解决的)。

    Container

    Container的虚拟化开销与Hypervisor相比就要少很多,因为就只是运行了一个内核而已,但是它有个问题就是实现并没有成熟,可能并不适合在生产环境中使用。

    Container也称operating system level virtualization。也就是说它在操作系统层面实现了前面提到的虚拟化目标,由于内核已经有了很多这些资源控制的API,所以主要问题已经不是实现这些API,而是将这些API统一起来,形成一个统一的模型。可以看这篇07年写的论文来了解一些进展。

    内核中实现资源控制的是cgroup,而实现名字空间隔离的就是namespace,LWN上已经有一系列的文章来介绍一些namespace相关的内核接口。

    结论

    如果只是想要在云计算中使用虚拟化来最大化利用硬件资源,那么Container是未来最好的选择,但由于仍然不成熟所以目前不太可能广泛部署,所以Hypervisor在Container成熟之前仍然是唯一选择。不过不知道你们怎么样,反正我是不会花时间去学它了。而现在也是学习Container虚拟化的最好时期,因为最近大量相关patch进入mainline kernel。似乎要开始跟着patch学虚拟化了。