Linux中的虚拟化
在信息大爆炸的今天,大数据、云计算孕育而生,随着计算机硬件的高速发展,单台计算机用途的单一化(在大规模的服务器机房中很多机器职责单一,有些只负责计算,有些只负责存储处理等),硬件的性能潜力不能被高效开发,于是虚拟化技术也由此被设计并开发出来。 何为虚拟化 虚拟化是一个广义的术语,在计算机方面通常是指计算元件在虚拟的基础上而不是真实的基础上运行。虚拟化技术可以扩大硬件
·
在信息大爆炸的今天,大数据、云计算孕育而生,随着计算机硬件的高速发展,单台计算机用途的单一化(在大规模的服务器机房中很多机器职责单一,有些只负责计算,有些只负责存储处理等),硬件的性能潜力不能被高效开发,于是虚拟化技术也由此被设计并开发出来。
何为虚拟化
虚拟化是一个广义的术语,在计算机方面通常是指计算元件在虚拟的基础上而不是真实的基础上运行。虚拟化技术可以扩大硬件的容量,简化软件的重新配置过程。CPU的虚拟化技术可以单CPU模拟多CPU并行,允许一个平台同时运行多个操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率——百度百科。虚拟化主要指的是特殊的技术,通过隐藏特定计算平台的实际物理特性,为用户提供抽象的、统一的、模拟的计算环境(称为虚拟机)——IBM定义。虚拟化为有效的利用计算机硬件资源,挖掘硬件的计算潜质提供了多种多样技术,从不同层次的虚拟化上分有如下图的虚拟化层次:
虚拟机分类:
虚拟机的分类也是多种多样。可以通过是否在裸机上部署来分为面向主机的的虚拟机和面向裸机的虚拟机。面向主机的虚拟机是指的在一台已经安装操作系统的主机上安装虚拟机管理(VMM)程序,而面向裸机的是指在裸机上直接安装虚拟机管理程序,所有的虚拟机调用都是直接由虚拟机管理程序来负责,没有了操作系统这一步,所以这种方式在效率上要高于面向主机的。不过,比较流行的技术比如vmware,xen都是面向主机的。
然后根据上面的图去分类的话,可以分为对硬件的虚拟和对操作系统或者对软件的虚拟。在硬件虚拟化这个层面,又有三种不同的技术:
1)Full Virtualization(全虚拟化),几乎是完整地模拟一套真实的硬件设备。大部分操作系统无须进行任何修改即可直接运行在全虚拟化环境中。像kvm、vmware等技术是全虚拟化。
2)Partial Virtualization(部分虚拟化),仅仅提供了对关键性计算组件或者指令集的模拟。操作系统可能需要做某些修改才能够运行在部分虚拟化环境中。
3)Paravirtualization(半虚拟化),不对硬件设备进行模拟,虚拟机拥有独立的运行环境,通过虚拟机管理程序共享底层的硬件资源。大部分操作系统需要进行修改才能够运行在半虚拟化环境中。它的性能要稍微高于全虚拟化。像Xen。因为需要改动托管系统的内核,所以xen是不支持win虚拟机的。
另外还有像硬件辅助虚拟化,就是宿主机的硬件架构在一定程度上提供对虚拟化的支持。像Intel-VT与AMD-V都提供了这类架构支持。
软件层面的虚拟化,往往是指在同一个操作系统实例的基础上提供多个隔离的虚拟运行环境,也常常被称为容器技术。LXC(Linux Container)则是采用了这种技术,它主要是采用了linux本身提供的技术,在一定程度上模拟虚拟化。软件虚拟化也可以理解成进程级虚拟机,其他虚拟化成为系统级虚拟机。在进程级虚拟机中负责虚拟化的软件成为运行时软件,而系统级虚拟机中负责虚拟化的软件成为VMM(Virtual Machine Monitor)
对于硬件与软件虚拟化两种技术,都是存在优点和缺点。对于硬件虚拟化,我们讨论全虚拟化和部分虚拟化。因为现在大部分的虚拟化技术Xen、kvm都支持这两种。硬件虚拟化基本上就是在一台宿主机上虚拟了整个系统,各台虚拟机之间相互不可见。这会很明显导致很多重复的线程和重复的内存页出现,性能上肯定会有影响。所以采用这种技术,一台宿主机上虚拟机的个数肯定会有一定限制。
对于软件虚拟化,我们来讨论LXC。LXC 是 Linux Containers 的缩写,是一种基于容器的、操作系统层级(内核)的、轻量级的虚拟化技术。LXC 可以在操作系统层次上提供虚拟环境(即容器)以隔离进程和资源,每个虚拟环境拥有自己的进程和独立的网络空间。还可以为容器绑定特定的 CPU 和 Memory 节点,分配特定比例的 CPU 时间、IO 时间,限制可以使用的内存大小(包括内存和 SWAP 空间),提供 Device 访问控制,提供独立的 namespace(网络、pid、ipc、mnt、uts)。容器虚拟化起源于 1982 年发布的 CHROOT 工具,这是一个特殊的基于文件子系统的容器虚拟,最早由 Sun 公司创始人 Bill Joy 开发并且作为BSD 4.2 的组成进行发布。此后,大量的容器虚拟化技术不断涌现,主要有:Solaris Zones、FreeBSD Jails、Linux VServer、OpenVZ,但是这些技术都没有被 Linux 内核所接受。相反 Linus 选择使用一系列新的内核特性来实现这一目标。LXC 就是利用这些新特性实现的下一代容器虚拟化技术,并随着 Linux 内核而发布。 容器技术原理是基于操作系统内核对不同的进程提供了不同的系统视图, 它可以在本地 CPU 核心运行指令,避免了全虚拟化中指令级模拟或即时编译的系统开销。同时也避免了准虚拟化(para-virtualization)和系统调用替换的复杂性。但是客户机必须使用与宿主机相同种类的操作系统,以及相同的内核数。 在基于容器的虚拟化技术中,进程不再是个全局的概念,而是从属于某个特定的容器。理想情况下,进程跟容器之间是动态关联的,进程可以在容器之间迁移。在基于容器的虚拟化技术中,容器既是资源容器,也是隔离的命名空间,它能有效地将由单个操作系统管理的资源划分到隔离的组中,以更好地在隔离的组之间平衡有冲突的资源的占用需求。从用户的角度上看,LXC 容器的运行和表现与独立拥有一台 Linux 服务器并无二致。
其原理是由Linux内核提供了一套“软件虚拟化”机制,支持在宿主系统中像运行进程一样运行其他操作系统(Guest OS),这就是 CHROOT 和cgroups 。CHROOT负责指引Guest OS的rootfs,cgroups负责资源管理。LXC正是利用 CHROOT+cgroups 的用户态工具,便于用户使用。 CHROOT 即 change root directory (更改 root 目录)。在 linux 系统中,系统默认的目录结构都是以 `/`,即是以根 (root) 开始的。而在使用CHROOT 之后,系统的目录结构将以指定的位置(比如 “/home/lxc/root”) 作为 `/` 位置。当程序的根目录改变之后,它是不可以访问新的根目录外的文件,这个新的根目录叫做 “CHROOT监狱(CHROOT jail, CHROOT prison)”。 在 CHROOT 之后执行的程序,当它去访问根目录时,实际上是访问 “/home/lxc/root” 不再是真正的根目录了。 Unix/Linux 的 POSIX API 是以文件路径为约定的,而且都是基于文件的(比如/proc 就是所有的进程所在的目录)。从某种意义上来说,CHROOT 相当于启动了一个非常粗糙的 Linux 容器。所以每个容器还需要有自己的上下文、进程和网络,容器的虚拟化技术才能落地。 cgroups 子系统是 Linux 内核提供的一个基于进程组的资源管理的框架,可以为特定的进程组限定可以使用的资源。LXC在隔离控制方面依赖于Linux内核的namespace特性,具体而言就是在clone时加入相应的flag(NEWNS NEWPID等等)。 基于容器的虚拟化技术主要通过隔离操作系统内核的对象(例如 PID、UID、系统共享内存、IPC、ptys等等)来完成安全性的隔离,具体就是运用名称空间和访问权限控制等等技术,将原来的全局对象(句柄、UID等)隔离到完全不同的名称空间里,不同虚拟机之间是完全不可见的,因此它们也不能访问到名称空间之外的对象。全局对象在每个虚拟机内本地化了,换句话说,全局的对象标记仅仅是在每个虚拟机内部全局。另外还需要过滤器,以便在虚拟机运行时检查其是否有权限访问内核对象。
总而言之,LXC是通过cgroup对线程进行隔离,对资源进行限制;通过Namespace对调用系统提供的系统调用来进行资源隔离。LXC介绍。通过此也可以看出,它所有虚拟化出来的虚拟机都是运行在宿主机本身上的,它的线程和资源对宿主机都是可见的。这就不存在很多重复的线程和内存也的问题,所以一台宿主机上可以通过此技术虚拟出更多的虚拟机。
VMWARE、XEN、LXC的性能比较
VMWARE
优势:1、成熟的商业化产品,可靠性无与伦比;2、格式转换工具,可以将物理机或者其他虚拟机的镜像转换为VMWARE的镜像;3、存储方案
略势:付费
XEN
优势:综合优势,更好的可用资源、平台支持、可管理性、实施、动态迁移和性能基准
略势:性能不如全虚拟化产品
LXC
优势:1、无需给内核打补丁;2、对宿主机没有特殊的硬件要求,在32位和64位处理器上都能运行;3、性能接近物理机
略势:1、只能运行Linux,不支持BSD、OSX、Windows;2、管理工具不完善;3、安全隔离性差;4、不支持对网络IO的管理
性能如下图:
参考资料:http://blog.duwei.name/index.php/archives/8/
更多推荐
已为社区贡献6条内容
所有评论(0)