操作系统层虚拟化
操作系统层虚拟化(英语:Operating system–level virtualization),亦称容器化(英语:Containerization),是一种虚拟化技术,这种技术将操作系统内核虚拟化,可以允许用户空间软件实例(instances)被分割成几个独立的单元,在内核中运行,而不是只有一个单一实例运行。
这个软件实例,也被称为是一个容器(containers),虚拟引擎(Virtualization engine),虚拟专用服务器(virtual private servers)或是 jails。对每个行程的拥有者与用户来说,他们使用的服务器程序,看起来就像是自己专用的。
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。操作系统层虚拟化之后,可以实现软件的即时迁移(Live migration),使一个软件容器中的实例,即时移动到另一个操作系统下,再重新运行起来。但是在这种技术下,软件即时迁移,只能在同样的操作系统下进行。
在类Unix操作系统中,这个技术最早起源于标准的chroot机制,再进一步演化而成。除了将软件独立化的机制之外,内核通常也提供资源管理功能,使得单一软件容器在运作时,对于其他软件容器的造成的交互影响最小化。
相对于传统的虚拟化(Virtualization),容器化的优势在于占用服务器空间少,通常几秒内即可引导。同时容器的弹性可以在资源需求增加时瞬时复制增容,在资源需求减小时释放空间以供其他用户使用。由于在同一台服务器上的容器实例共享同一个系统内核,因此在运行上不会存在实例与主机操作系统争夺RAM的问题发生,从而能够保证实例的性能。
相关技术
LXC

LXC,其名称来自Linux软件容器(Linux Containers)的缩写,一种操作系统层虚拟化(Operating system–level virtualization)技术,为Linux内核容器功能的一个用户空间接口。它将应用软件系统打包成一个软件容器(Container),内含应用软件本身的代码,以及所需要的操作系统核心和库。透过统一的名字空间和共享API来分配不同软件容器的可用硬件资源,创造出应用程序的独立沙箱运行环境,使得Linux用户可以容易的创建和管理系统或应用容器。[1]
在Linux内核中,提供了cgroups功能,来达成资源的区隔化。它同时也提供了名称空间区隔化的功能,使应用程序看到的操作系统环境被区隔成独立区间,包括行程树,网络,用户id,以及挂载的文件系统。但是cgroups并不一定需要引导任何虚拟机。
LXC利用cgroups与名称空间的功能,提供应用软件一个独立的操作系统环境。LXC不需要Hypervisor这个软件层,软件容器(Container)本身极为轻量化,提升了创建虚拟机的速度。软件Docker被用来管理LXC的环境。
OpenVZ
OpenVZ是基于Linux内核和操作系统的操作系统级虚拟化技术。OpenVZ允许物理服务器运行多个操作系统,被称虚拟专用服务器(VPS,Virtual Private Server)或虚拟环境(VE,Virtual Environment)。
与VMware这种虚拟机和Xen这种硬件辅助虚拟化技术相比,OpenVZ的主机与客户系统都必须是Linux(虽然在不同的虚拟环境里可以用不同的Linux发行版)。但是,OpenVZ声称这样做有性能上的优势。根据OpenVZ网站的说法,使用OpenVZ与使用独立的实体服务器相比,性能只会有1-3%的损失。
OpenVZ的Linux客户系统其实是共享OpenVZ主机Linux系统的内核,也就意味着OpenVZ的Linux客户系统不能升级内核。
OpenVZ是SWsoft, Inc.公司开发的专有软件Virtuozzo(Virtuozzo虚拟机还支持Windows客户系统)的基础。OpenVZ的授权为GPLv2。
OpenVZ由两部分组成,一个经修改过的操作系统核心与一套用户工具。
但是,基于OpenVZ的Linux虚拟机/Linux VPS可能配置起来不如基于KVM的Linux虚拟机/Linux VPS灵活。例如,OpenVZ虚拟机/VPS无法更新内核;不支持部分软件;其不能升级内核的限制也可能会给Linux的发行版升级带来麻烦。
Docker
Docker是一个开放源代码软件项目,让应用程序部署在软件货柜下的工作可以自动化进行,借此在Linux操作系统上,提供一个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制[1]。
Docker利用Linux核心中的资源分离机制,例如cgroups,以及Linux核心名字空间(namespaces),来创建独立的容器(containers)。这可以在单一Linux实体下运作,避免引导一个虚拟机造成的额外负担[2]。Linux核心对名字空间的支持完全隔离了工作环境中应用程序的视野,包括行程树、网络、用户ID与挂载文件系统,而核心的cgroup提供资源隔离,包括CPU、存储器、block I/O与网络。从0.9版本起,Dockers在使用抽象虚拟是经由libvirt的LXC与systemd - nspawn提供界面的基础上,开始包括libcontainer库做为以自己的方式开始直接使用由Linux核心提供的虚拟化的设施,
依据行业分析公司“451研究”:“Dockers是有能力打包应用程序及其虚拟容器,可以在任何Linux服务器上运行的依赖性工具,这有助于实现灵活性和便携性,应用程序在任何地方都可以运行,无论是公有云、私有云、单机等。
chroot 技术
hroot是在unix系统的一个操作,针对正在运作的软件行程和它的子进程,改变它外显的根目录。一个运行在这个环境下,经由chroot设置根目录的程序,它不能够对这个指定根目录之外的文件进行访问动作,不能读取,也不能更改它的内容。chroot这一特殊表达可能指chroot(2)系统调用或chroot(8)前端程序。
由chroot创造出的那个根目录,叫做“chroot监狱”(chroot jail,或chroot prison)。
FreeBSD jail
FreeBSD jail,一种操作系统层虚拟化技术,在FreeBSD操作系统中运作。利用这个技术,FreeBSD的系统管理者,可以创造出几个小型的软件系统,这些软件系统被称为监狱(jails)。
这个技术被Poul-Henning Kamp采纳,加入FreeBSD系统中。2000年,伴随FreeBSD 4.0版的发布,正式对外公开。系统管理者可以使用jail(8)这个命令来调用这个服务。
这个技术的目标是:
- 虚拟化:每个软件监狱(jail)都是在主机机器上执行的一个虚拟环境,有它自己的档案系统,行程,使用者与超级使用者的账户。在软件监狱内运行的行程,它面对的环境,跟实际的操作系统环境几乎是一样的。
- 安全性:每个软件监狱都是独立运作,与其他软件监狱隔离,因此能够提供额外的安全层级。
- 容易删除及创建:因为每个软件监狱的运作范围有限,这使得系统管理者可以在不影响整体系统的前提下,以超级使用者的权限,来删除在软件监狱下运作的行程。
这个技术是基于类Unix系统下的chroot机制,进一步发展而来。chroot jail限制行程只能存取某个部分的档案系统,但是FreeBSD jail机制限制了在软件监狱中运作的行程,不能够影响操作系统的其他部分。也就是说,在软件监狱中的行程,是运作在一个沙盒上。
cgroups
cgroups,其名称源自控制组群(control groups)的简写,是Linux内核的一个功能,用来限制、控制与分离一个行程组群的资源(如CPU、内存、磁盘输入输出等)。
这个项目最早是由Google的工程师(主要是Paul Menage和Rohit Seth)在2006年发起,最早的名称为行程容器(process containers)[1]。在2007年时,因为在Linux内核中,容器(container)这个名词有许多不同的意义,为避免混乱,被重命名为cgroup,并且被合并到2.6.24版的内核中去[2]。自那以后,又添加了很多功能。
功能
cgroups的一个设计目标是为不同的应用情况提供统一的接口,从控制单一进程(像nice)到操作系统层虚拟化(像OpenVZ,Linux-VServer,LXC)。cgroups提供:
- 资源限制:组可以被设置不超过设定的内存限制;这也包括虚拟内存。[3] [4]
- 优先级:一些组可能会得到大量的CPU[5] 或磁盘IO吞吐量。[6]
- 结算:用来衡量系统确实把多少资源用到适合的目的上。[7]
- 控制:冻结组或检查点和重启动。
Linux Namespace
Linux Namespace是Linux提供的一种内核级别环境隔离的方法。不知道你是否还记得很早以前的Unix有一个叫chroot的系统调用(通过修改根目录把用户jail到一个特定目录下),chroot提供了一种简单的隔离模式:chroot内部的文件系统无法访问外部的内容。Linux Namespace在此基础上,提供了对UTS、IPC、mount、PID、network、User等的隔离机制。
Namespace |
系统调用参数 |
隔离内容 |
UTS |
CLONE_NEWUTS |
主机名与域名 |
IPC |
CLONE_NEWIPC |
信号量、消息队列和共享内存 |
PID |
CLONE_NEWPID |
进程编号 |
Network |
CLONE_NEWNET |
网络设备、网络栈、端口等等 |
Mount |
CLONE_NEWNS |
挂载点(文件系统) |
User |
CLONE_NEWUSER |
用户和用户组
|
用户模态 | 用户应用 | 例如:Bash,LibreOffice,GIMP,Blender,0 A.D.,Mozilla Firefox等 | ||||
---|---|---|---|---|---|---|
低层系统构件 | 系统守护进程: systemd,runit,logind,networkd,PulseAudio等 |
窗口系统: X11,Wayland,SurfaceFlinger |
其他库: GTK+, Qt, EFL, SDL, SFML, FLTK, GNUstep等 |
图形: Mesa,AMD Catalyst等 |
||
C标准库 | open(),exec(),sbrk(),socket(),fopen(),calloc(),... (直到2000个子例程) glibc目标为POSIX/SUS兼容,uClibc目标为嵌入式系统,bionic等 |
|||||
内核模态 | Linux内核 | stat, splice, dup, read, open, ioctl, write, mmap, close, exit等(大约380个系统调用) Linux内核系统调用接口(SCI,目标为POSIX/SUS兼容) |
||||
进程调度子系统 | IPC子系统 | 内存管理子系统 | 虚拟文件子系统 | 网络子系统 | ||
其他构件:ALSA,DRI,evdev,LVM,device mapper,Linux Network Scheduler,Netfilter Linux安全模块:SELinux,TOMOYO,AppArmor, Smack |
||||||
硬件(CPU,内存,数据存储设备等。) |
