1. 程式人生 > >Linux Container-核心輕量級虛擬化技術

Linux Container-核心輕量級虛擬化技術

LXC為Linux Container的簡寫。Linux Container容器是一種核心虛擬化技術,可以提供輕量級的虛擬化,以便隔離程序和資源,而且不需要提供指令解釋機制以及全虛擬化的其他複雜性。相當於C++中的NameSpace。容器有效地將由單個作業系統管理的資源劃分到孤立的組中,以更好地在孤立的組之間平衡有衝突的資源使用需求。與傳統虛擬化技術相比,它的優勢在於: (1)與宿主機使用同一個核心,效能損耗小; (2)不需要指令級模擬; (3)不需要即時(Just-in-time)編譯; (4)容器可以在CPU核心的本地執行指令,不需要任何專門的解釋機制; (5)避免了準虛擬化和系統呼叫替換中的複雜性; (6)輕量級隔離,在隔離的同時還提供共享機制,以實現容器與宿主機的資源共享。 總結:Linux Container是一種輕量級的虛擬化的手段。 Linux Container提供了在單一可控
主機
節點上支援多個相互隔離的server container同時執行的機制。Linux Container有點像chroot,提供了一個擁有自己程序和網路空間的虛擬環境,但又有別於虛擬機器,因為lxc是一種作業系統層次上的資源的虛擬化。

編輯本段LXC的實現

Sourceforge上有LXC這個開源專案。LXC專案本身只是一個為使用者提供一個使用者空間的工具集,用來使用和管理LXC容器。LXC真正的實現則是靠Linux核心的相關特性,LXC專案只是對此做了整合。基於容器的虛擬化技術起源於所謂的資源容器和安全容器。 LXC在資源管理方面依賴於Linux核心的cgroups子系統,cgroups子系統是Linux核心提供的一個基於程序組的資源管理的框架,可以為特定的程序組限定可以使用的資源。LXC在隔離控制方面依賴於Linux核心的namespace特性,具體而言就是在clone時加入相應的flag(NEWNS NEWPID等等)。 lxc常見命令使用: lxc-version
 用於顯示系統LXC的版本號(可以通過此命令判斷系統是否安裝了lxc) 用法:lxc-version 例如:lxc-version lxc-checkconfig 用於判斷linux核心是否支援LXC 用法:lxc-checkconfig 例如:lxc-checkconfig lxc-create用於建立一個容器 用法:lxc-create -n name [-f config_file] -n 後面跟要建立的容器名字 例如:-n foo -f 後面跟容器配置檔案的路徑 注:1.採用lxc-create建立的容器,在停止執行後,不會被銷燬,要採用lxc-destroy命令才能銷燬 2.容器命令空間是全域性的,系統中不允許存在重名的容器,如果-n 後面跟一個已經存在的容器名,建立會失敗 例如:lxc-create --n foo --f foo.conf lxc-execute
 用於在一個容器執行應用程式 用法: lxc-execute -n name [-f config_file] [ -s KEY=VAL ]command -n 後面跟容器名字(容器名字用於管理容器)例如:-n foo -f 後面跟容器配置檔案的路徑(如果沒有配置檔案,可以直接用-s指定配置選項,如果什麼都沒有,系統採用預設策略)例如:-f foo.conf -s 後面跟配置鍵值對 例如:lxc.cgroup.cpu.shares=512 command 為要執行的命令 例如:/bin/bash 這個命令會mount /proc 並且會自動建立/銷燬容器。 注:1.如果容器還不存在,lxc-execute會自動建立一個,容器停止執行後會被自動銷燬 2.用lxc-execute啟動應用程式,配置優先順序如下: 如果指定-f選項,那麼之前建立容器(如果容器是已存在的)的配置檔案不會被使用 如果指定-s選項,則在命令列中的配置鍵值對會覆蓋配置檔案(無論之前的還是-f指定的)相同配置 例如:lxc-execute --n foo --s lxc.cgroup.cpu.shares=512 /bin/bash 使用實際例子: lxc-execute -n test /bin/bash 這個會啟動一個lxc並給出類似的一個cmd視窗,網路是與作業系統共用的,這裡好像僅僅是建立了一個名稱空間 如果沒有指定-f,預設的隔離將被使用,這個命令當你需要一個快速在一個隔離的環境中執行程式。在物理機上和container中都會執行lxc-init,在宿主機上面,這個程式用於轉發lxc-kill 訊號到已經啟動的程式中 ,在container中,這個程式的pid為1,它會fork出要執行的命令(pid為2)並執行。 lxc-start 用於在容器中執行給定命令 用法:lxc-start -n name [-f config_file] [-c console_file] [-d] [-s KEY=VAL] [command] -d 將容器當做守護程序執行 -f 後面跟配置檔案 -c 指定一個檔案作為容器console的輸出,如果不指定,將輸出到終端 -s 指定配置 如果沒有指定命令,lxc-start 將要執行 /sbin/init 例如:lxc-start -n foo -f foo.conf -d /bin/bash 注:1.如果容器還不存在,lxc-start會自動建立一個,容器停止執行後會被自動銷燬 2.lxc-start配置優先順序與lxc-execute相同 3.lxc-start 與lxc.execute的異同: lxc-start 和 lxc-execute都可以在容器中啟動程序,區別在於lxc-start直接建立程序,lxc-execute先建立lxc-init程序,然後在lxc-init中fork一個程序來執行。(關於第4點,lxc-init所佔的是一個什麼樣的地位?) The orphan process group and daemon are not supported by this command, use the lxc-execute command instead If no command is specified, lxc-start will use the default "/sbin/init" command to run a system container. 4.lxc-start用於在容器啟動system,lxc-execute用於在容器執行應用程式 lxc-kill 傳送訊號給容器中的第一個使用者程序(容器內部程序號為2的程序) 用法:lxc-kil -n name SIGNUM -n 後面跟容器名 SIGNUM 訊號 (此引數可選,預設SIGKILL) 例如:lxc-kill -n foo lxc-stop 用於停止容器中所有的程序 用法:lxc-stop -n name -n後面跟要停止的容器名 例如:lxc-stop --n foo lxc-destroy 用於銷燬容器 用法:lxc-destroy -n name -n後面跟要停止的容器名 例如: lxc-destroy --n foo lxc-cgroup 用於獲取或調整與cgroup相關的引數 用法:lxc-cgroup -n name subsystem value -n 後面跟要調整的容器名 例如: lxc-cgroup -n foo devices.list lxc-cgroup -n foo cpuset.cpus "0,3" lxc-info 使用者獲取一個容器的狀態 用法:lxc-info -n name -n後面跟操作的容器名 例如: lxc-info --n foo 注:容器的狀態有:STARTING RUNNING STOPPING STOPPED ABORTING lxc-monitor 監控一個容器狀態的變換,當一個容器的狀態變化時,此命令會在螢幕上打印出容器的狀態 用法:lxc-monitor -n name 例如:lxc-monitor -n foo lxc-ls 列出當前系統所有的容器 用法:lxc-ls 例如:lxc-ls lxc-ps 列出特定容器中執行的程序 用法:lxc-ps 例如:lxc-ps -n foo 更多的命令介紹可以再man page獲得[1]

lxc能做什麼:

可以為容器繫結特定的cpu和memory,分配特定比例的cpu時間、IO時間,限制可以使用的記憶體大小(包括記憶體和swap空間),提供device訪問控制,提供獨立的namespace(網路、pid、ipc、mnt、uts)。


T4:淘寶私有云