zoukankan      html  css  js  c++  java
  • 操作系统层虚拟化

    维基百科,自由的百科全书
     

    操作系统层虚拟化英语:Operating system–level virtualization),亦称容器化英语:Containerization),是一种虚拟化技术,这种技术将操作系统内核虚拟化,可以允许用户空间软件实例(instances)被分割成几个独立的单元,在内核中运行,而不是只有一个单一实例运行。

    这个软件实例,也被称为是一个容器(containers),虚拟引擎(Virtualization engine),虚拟专用服务器(virtual private servers)或是 jails。对每个行程的拥有者与用户来说,他们使用的服务器程序,看起来就像是自己专用的。

    操作系统层虚拟化之后,可以实现软件的即时迁移(Live migration),使一个软件容器中的实例,即时移动到另一个操作系统下,再重新运行起来。但是在这种技术下,软件即时迁移,只能在同样的操作系统下进行。

    类Unix操作系统中,这个技术最早起源于标准的chroot机制,再进一步演化而成。除了将软件独立化的机制之外,内核通常也提供资源管理功能,使得单一软件容器在运作时,对于其他软件容器的造成的交互影响最小化。

    相对于传统的虚拟化(Virtualization),容器化的优势在于占用服务器空间少,通常几秒内即可引导。同时容器的弹性可以在资源需求增加时瞬时复制增容,在资源需求减小时释放空间以供其他用户使用。由于在同一台服务器上的容器实例共享同一个系统内核,因此在运行上不会存在实例与主机操作系统争夺RAM的问题发生,从而能够保证实例的性能。

    相关技术

    LXC

     

    Linux Containers logo.png

    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在使用抽象虚拟是经由libvirtLXC与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)这个命令来调用这个服务。

    这个技术的目标是:

    1. 虚拟化:每个软件监狱(jail)都是在主机机器上执行的一个虚拟环境,有它自己的档案系统,行程,使用者与超级使用者的账户。在软件监狱内运行的行程,它面对的环境,跟实际的操作系统环境几乎是一样的。
    2. 安全性:每个软件监狱都是独立运作,与其他软件监狱隔离,因此能够提供额外的安全层级。
    3. 容易删除及创建:因为每个软件监狱的运作范围有限,这使得系统管理者可以在不影响整体系统的前提下,以超级使用者的权限,来删除在软件监狱下运作的行程。

    这个技术是基于类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)到操作系统层虚拟化(像OpenVZLinux-VServerLXC)。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

    用户和用户组

        Linux 内核从版本 2.4.19 开始陆续引入了 namespace 的概念。其目的是将某个特定的全局系统资源(global system resource)通过抽象方法使得namespace 中的进程看起来拥有它们自己的隔离的全局系统资源实例(The purpose of each namespace is to wrap a particular global system resource in an abstraction that makes it appear to the processes within the namespace that they have their own isolated instance of the global resource. )。Linux 内核中实现了六种 namespace,按照引入的先后顺序,列表如下:

    namespace引入的相关内核版本被隔离的全局系统资源在容器语境下的隔离效果
    Mount namespaces Linux 2.4.19 文件系统挂接点 每个容器能看到不同的文件系统层次结构
    šUTS namespaces Linux 2.6.19 nodename 和 domainname 每个容器可以有自己的 hostname 和 domainame
    IPC namespaces Linux 2.6.19 特定的进程间通信资源,包括System V IPC 和  POSIX message queues 每个容器有其自己的 System V IPC 和 POSIX 消息队列文件系统,因此,只有在同一个 IPC namespace 的进程之间才能互相通信
    PID namespaces Linux 2.6.24 进程 ID 数字空间 (process ID number space) 每个 PID namespace 中的进程可以有其独立的 PID; 每个容器可以有其 PID 为 1 的root 进程;也使得容器可以在不同的 host 之间迁移,因为 namespace 中的进程 ID 和 host 无关了。这也使得容器中的每个进程有两个PID:容器中的 PID 和 host 上的 PID。
    Network namespaces 始于Linux 2.6.24 完成于 Linux 2.6.29 网络相关的系统资源 每个容器用有其独立的网络设备,IP 地址,IP 路由表,/proc/net 目录,端口号等等。这也使得一个 host 上多个容器内的同一个应用都绑定到各自容器的 80 端口上。
    User namespaces 始于 Linux 2.6.23 完成于 Linux 3.8) 用户和组 ID 空间  在 user namespace 中的进程的用户和组 ID 可以和在 host 上不同; 每个 container 可以有不同的 user 和 group id;一个 host 上的非特权用户可以成为 user namespace 中的特权用户;

    Linux namespace 的概念说简单也简单说复杂也复杂。简单来说,我们只要知道,处于某个 namespace 中的进程,能看到独立的它自己的隔离的某些特定系统资源;复杂来说,可以去看看 Linux 内核中实现 namespace 的原理

    Linux内的各种层,还显示了在用户空间内核空间之间的分离。
    用户模态 用户应用 例如:BashLibreOfficeGIMPBlender0 A.D.Mozilla Firefox
    低层系统构件 系统守护进程
    systemdrunit,logind,networkd,PulseAudio
    窗口系统
    X11WaylandSurfaceFlinger
    其他库
    GTK+QtEFLSDLSFMLFLTKGNUstep
    图形
    MesaAMD Catalyst
    C标准库 open()exec()sbrk()socket()fopen()calloc(),... (直到2000个子例程)
    glibc目标为POSIX/SUS兼容,uClibc目标为嵌入式系统,bionic
    内核模态 Linux内核 statsplicedupreadopenioctlwritemmapcloseexit等(大约380个系统调用)
    Linux内核系统调用接口(SCI,目标为POSIX/SUS兼容)
    进程调度子系统 IPC子系统 内存管理子系统 虚拟文件子系统 网络子系统
    其他构件:ALSADRIevdevLVMdevice mapperLinux Network SchedulerNetfilter
    Linux安全模块SELinuxTOMOYOAppArmorSmack
    硬件(CPU内存数据存储设备等。)

     

  • 相关阅读:
    Linux下常用程序的代理服务器(proxy)配置
    如何下载google play免费应用的apk文件
    sublime text多文件夹查找关键字
    linux下查看文件夹的大小
    使用virtualenv搭建独立的Python环境
    python代码中使用settings
    /lib /usr/lib /usr/local/lib区别
    修改setup.py的源
    Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling
    使用Restful风格中的post使用过遇到前端数据传送不到后端
  • 原文地址:https://www.cnblogs.com/zy09/p/10827077.html
Copyright © 2011-2022 走看看