虚拟化–LXC(Linux Containers)容器虚拟化技术

虚拟化技术有多个层次:虚拟化技术不只是Xen,Vmware。具体有下面几个层次:

1、硬件级虚拟化

硬件抽象层(Hardware Abstraction Layer)HAL虚拟化及时要能够正确的工作,所构造的虚拟机VM必须对其中的一些特权指令(修改页表等)操作进行处理,执行时产生陷入并它传递给下层的虚拟机管理器VMM执行。这是因为VM中运行的是没有经过任何修改的操作系统会里有特权指令得到CPU和内存等资源,当特权指令执行时,产生一个陷入,便马上将指令发送给VMM,这使得VMM可以完全控制虚拟机并保持每个VM的隔离。然后VMM在处理器中执行该指令,并将模拟结果及特权指令返回给VM。

该层次虚拟化技术是目前最广泛的虚拟化技术,比如业界影响力最大的Vmware和Xen都是硬件级虚拟化的范畴。KVM、VirualPC、UML等也属于该范畴。

在x86虚拟化方法上有三种流行的方式:Para-Virtualization, Full-Virtualization和Hardware-Assisted-Virtualization。

Para-Virtualization:典型的代表就是Citrix的Xen和Microsoft的Hyper-V,“在旁边的虚拟化”。就是在虚拟化软件Hypervisor上有很多客户虚拟机,旁边还有一个特别的OS,Xen中的术语是Dom0,其他的客户虚拟机叫做DomU。Dom0可以对底层的Xen进行管理整个硬件平台上的输入输出设备驱动器。也就是说该虚拟化方式不对设备驱动器做虚拟,只对CPU和内存做虚拟,所以又被称作是“半虚拟化”。半虚拟化有个缺点就是操作系统需要进行一定的修改,需要向其中注入hypercalls来处理DomU发出的敏感指令。

?Full-Virtualization:全虚拟化,典型的代表就是最经常使用的VirtualBox,VMware等产品。顾名思义,全虚拟化是对底层硬件包括CPU,内存,IO设备等全部都虚拟化。对于上面提到的敏感指令,Vmware使用“可执行代码翻译”将这些指令的可执行代码转变为一系列的新的指令,翻译得到的新指令和原来的指令有相同的含义,不过它可以得到硬件的支持,这样无需修改客户操作系统了。

Hardware-Assisted-Virtualization:硬件辅助虚拟化,IntelVT-x和AMD-V。处理器硬件的修改,使前面提到的客户机低特权不见发出的敏感指令“能够被hypervisor截获”,在这种新型的机器上(现在基本上所有的型号都支持该功能)Para虚拟化没有必要对客户机OS进行修改,Full虚拟化也没有必要进行二进制翻译。如果不考虑前面两种方式在IO设备处理上的不同,那么硬件协助的虚拟化及时已经取消了前面两种虚拟化技术之间的差别。

2、操作系统级虚拟化

操作系统级别的虚拟化是在安装好的宿主机上进行虚拟化,虚拟机VM共享宿主机资源,可以利用该虚拟环境来进行一些安全或 沙盒测试等。这种虚拟化技术可以有效的避免对屋里机器的重复安装(其实硬件级虚拟化的VMM都可以对虚拟机进行快速克隆),从而减少用户在机器安装上所花费的时间和精力。该层次的虚拟机和宿主机共享硬件资源,在操作系统之上通过一个虚拟层来进行用户的隔离。

应用程序的操作环境包括:操作系统、用户函数库、文件系统、环境设置等。如果应用系统所处的这些环境能够保持不变,那么,应用程序无法分辨出其所在的环境和真是的环境之间的差别。操作系统级虚拟化的关键思想在于,操作系统之上的虚拟层按照每个虚拟机的要求为其生成一个在宿主机之上的操作系统副本,从而位每个虚拟机产生一个完好的操作环境,并且实现虚拟机和宿主机的隔离。LXC就是该级别虚拟化。

比较:

硬件虚拟化和操作系统虚拟化:

硬件虚拟化是更加底层次的虚拟化,给VM机器的使用者就想拥有整个机器的资源用户易于接受,支持不同操作系统和应用程序而不需要重启机器,各VM之间隔离性更好,虚拟化管理器直接控制硬件,资源的利用率更好。

而操作系统级虚拟化:

与宿主机使用一个内核,性能损耗小、不需要指令级别的模拟、不需要专门的解释机制,直接在CPU核心的本地运行指令、轻量级隔离,在隔离的同时和提供共享机制,以实现容器和宿主机的资源共享。

3、指令级别的虚拟化

指令级虚拟化又称为指令集架构级虚拟化(ISA虚拟化)。它是通过纯软件的方法,模拟出于实际运行的应用程序或操作系统所不同的指令集去执行。这种方法构造的虚拟机我们更习惯称为模拟器(Emulator)。一个典型的计算机系统由处理器、内存、BUS、硬盘驱动器、磁盘控制器、定时器、多种IO设备等组成。模拟器通过将客户的虚拟机发出的所有指令翻译成本地指令集,然后在真实的硬件上执行。这些指令包括典型的处理器指令(如X86中的add,sun,jmp等)和特殊的IO指令。一个模拟器要成功的模拟一个真实的机器,它必须能够模拟真实机器所能做的一切事情,包括ROM芯片,重启,系统开关等。代表性的软件包括Bochs和QEMU。

当然,这种虚拟化技术是资源的损耗太大,模拟的操作太多。模拟器一般都是针对某个硬件平台架构进行全部指令的模拟,工作量太大。

4、编程语言级虚拟化

这种抽象层次的虚拟化主要代表有JVM虚拟机。这个抽象层次的虚拟化技术的主要思想是在应用层次上创建一个和其他类型虚拟机方式类似的虚拟机,并支持一种新的自定义的指令集(Java中的字节码)。这种类型的虚拟机使得用户在运行应用程序的时候就像在真是的物理机上。

5、程序库级虚拟化

在几乎所有的系统中,应用程序的编写都使用由一组用户级库来调用的API函数集。这些用户级的设计能后隐藏操作系统的相关底层细节,从而降低普通程序员的软件开发难度。API基本上和机器硬件平台无关但是和操作体系密切相关的接口,API调用定义了对内核的操作,以及操作的参数。因此可以在应用程序和运行库函数之间引入中间层来虚拟库函数的API接口,给上层软件提供不同的API。典型的虚拟化软件有Wine,Cygwin等。

后面会介绍典型的操作系统级的虚拟化技术LXC

LXC(Linux Containers)是一种基于容器的操作系统级的虚拟化技术。LXC可以在操作系统层次上位进程提供虚拟的执行环境,一个虚拟的执行环境就是一个容器。可以为容器绑定特定的CPU和内存节点,分配特定的比例的CPU时间,IO时间,限制可以使用的内存大小,提供device访问控制,提供独立的namespace(网络、pid、ipc、mnt、uts)。

LXC的实现是靠Linux内核中的相关特性实现的,它依赖于Linux内核cgroups子系统(Linux内核提供的一个基于进程组的资源管理框架,可以为特定的进程组限定可以使用的资源)和Linux内核的namespace特性(一种隔离方案,PID\IPC\NETWORK等系统资源不再是全局性的,而是数据特的namespace),每个namespace里面的资源对其他的namespace都是透明的。要创建新的namespace只需要在clone时指定相应的flag。

虚拟化–LXC(Linux Containers)容器虚拟化技术

相关文章:

你感兴趣的文章:

标签云: