操做系統層虛擬化

維基百科,自由的百科全書
 

操做系統層虛擬化英語:Operating system–level virtualization),亦稱容器化英語:Containerization),是一種虛擬化技術,這種技術將操做系統內核虛擬化,能夠容許用戶空間軟件實例(instances)被分割成幾個獨立的單元,在內核中運行,而不是隻有一個單一實例運行。php

這個軟件實例,也被稱爲是一個容器(containers),虛擬引擎(Virtualization engine),虛擬專用服務器(virtual private servers)或是 jails。對每一個行程的擁有者與用戶來講,他們使用的服務器程序,看起來就像是本身專用的。html

操做系統層虛擬化以後,能夠實現軟件的即時遷移(Live migration),使一個軟件容器中的實例,即時移動到另外一個操做系統下,再從新運行起來。可是在這種技術下,軟件即時遷移,只能在一樣的操做系統下進行。前端

類Unix操做系統中,這個技術最先起源於標準的chroot機制,再進一步演化而成。除了將軟件獨立化的機制以外,內核一般也提供資源管理功能,使得單一軟件容器在運做時,對於其餘軟件容器的形成的交互影響最小化。node

相對於傳統的虛擬化(Virtualization),容器化的優點在於佔用服務器空間少,一般幾秒內便可引導。同時容器的彈性能夠在資源需求增長時瞬時複製增容,在資源需求減少時釋放空間以供其餘用戶使用。因爲在同一臺服務器上的容器實例共享同一個系統內核,所以在運行上不會存在實例與主機操做系統爭奪RAM的問題發生,從而可以保證明例的性能。
安全

 

相關技術服務器

 

LXC

 

Linux Containers logo.png

LXC,其名稱來自Linux軟件容器(Linux Containers)的縮寫,一種操做系統層虛擬化(Operating system–level virtualization)技術,爲Linux內核容器功能的一個用戶空間接口。它將應用軟件系統打包成一個軟件容器(Container),內含應用軟件自己的代碼,以及所須要的操做系統核心和庫。透過統一的名字空間和共享API來分配不一樣軟件容器的可用硬件資源,創造出應用程序的獨立沙箱運行環境,使得Linux用戶能夠容易的建立和管理系統或應用容器。[1]網絡

在Linux內核中,提供了cgroups功能,來達成資源的區隔化。它同時也提供了名稱空間區隔化的功能,使應用程序看到的操做系統環境被區隔成獨立區間,包括行程樹,網絡,用戶id,以及掛載的文件系統。可是cgroups並不必定須要引導任何虛擬機。app

LXC利用cgroups與名稱空間的功能,提供應用軟件一個獨立的操做系統環境。LXC不須要Hypervisor這個軟件層,軟件容器(Container)自己極爲輕量化,提高了建立虛擬機的速度。軟件Docker被用來管理LXC的環境。dom

 

OpenVZ

OpenVZ是基於Linux內核操做系統操做系統級虛擬化技術。OpenVZ容許物理服務器運行多個操做系統,被稱虛擬專用服務器(VPS,Virtual Private Server)或虛擬環境(VE,Virtual Environment)。socket

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內存數據存儲設備等。)
相關文章
相關標籤/搜索