虛擬化按目前使用的類別分類,可分為兩種,主機級別虛擬化和容器級別虛擬化
1.主機級別虛擬化
- type-I:Hypervisor
- type-II:OS-hosted
a.type-I
這種虛擬化,hypervisor繞過我們熟知的os內核,直接接管硬件,然后自己再虛擬出對應所需要的os內核。主要產品有VMware ESXI,如下圖左側

b.type-II
宿主機虛擬化,hypervisor層運行於宿主機os之上,通過主機os內核來進行硬件的內核調試,主要產品有VMware workstation,如上圖右側
2.容器級別虛擬化
容器虛擬化,有別於主機虛擬化,其存在宿主機os,但其與主機級別虛擬化的type-II不一樣,並非進行內核的虛擬化,而是通過namespace進行虛擬化,通過namespace的隔離,進行各程序的隔離,通過cgroups,進行資源的控制,以此來進行虛擬化。如下圖

3.namespace
linux 內核從版本 2.4.19 開始陸續引入了 namespace 的概念。當一個程序運行於主機之中時,其基本要求有,系統根文件目錄、運行pid進程號、主機名、網卡、ipc通信、程序運行用戶這六大類。
linux將以上六類進行了內核級別的虛擬化,這六大類統稱為namespace
| namespace | 引入的相關內核版本 | 被隔離的全局系統資源 | 在容器環境下的隔離效果 |
|---|---|---|---|
| Mount | 2.4.19 | 文件系統掛接點 | 每個容器能看到不同的文件系統層次結構 |
| UTS | 2.6.19 | hostname | 每個容器能看到自己的hostname |
| IPC | 2.6.19 | 進程間通信 | 同一個IPC namespace的進程之間能互相通訊 |
| PID | 2.6.24 | 進程PID | 每個PID namespace中的進程可以有其獨立的PID,每個容器可以有其PID為1的root進程 |
| Network | 始於2.6.24完成於2.6.29 | 網絡相關的系統資源 | 每個容器用有其獨立的網絡設備,IP地址,IP路由表,/proc/net目錄,端口號 |
| User name | 始於2.6.23完成於3.8 | 用戶和組ID空間 | 每個container可以有不同的user和group id |
因為centos6的內核為2.6,所以user name不支持,所以centos6天然不太支持容器,雖然可以通過升級內核來進行支持,不過建議直接使用centos7以上的系統
4.cgroups
cgroups: Linux control groups,linux為運行的任務分配cpu、ram等,當namespace為容器進行隔離之后,還需要對每個容器進行資源的使用進行控制,不能讓其搶占其它容器的資源。
cgroups主要對以下內容進行資源控制
- blkio:塊設備IO
- cpu:CPU
- cpuacct:CPU資源使用報告
- cpuset:多處理器平台上的cpu集合
- devices:設備訪問
- freezer:掛起或恢復任務
- memory:內存用量及報告
- perf_event:對cgroup中的任務進行統一性能測試
- net_cls:cgroup中的任務創建的數據報文的類別標識
5.AUFS
a. AUFS的概念
AUFS:Union File System,聯合文件系統,主要功能是將位於不同物理位置的目錄合並成同一個目錄,有點類似於hadoop中hdfs的分布式存儲。
b.linux的基本文件系列
linux系統啟動,至少需要有兩種文件系統,一種是bootfs,一種是rootfs,
-
bootfs:包含 boot loader 和 kernel。用戶不會修改這個文件系統。實際上,在啟動(boot)過程完成后,整個內核都會被加載進內存,此時 bootfs 會被卸載掉從而釋放出所占用的內存。同時也可以看出,對於同樣內核版本的不同的 Linux 發行版的 bootfs 都是一致的。
-
rootfs:包含典型的目錄結構,包括 /dev, /proc, /bin, /etc, /lib, /usr, and /tmp 等再加上要運行用戶應用所需要的所有配置文件,二進制文件和庫文件。這個文件系統在不同的Linux 發行版中是不同的。而且用戶可以對這個文件進行修改。
同一個內核版本的所有linux系統的bootfs是相同的,rootfs不同
c.docker 鏡像
在docker images中,其采用的是分層技術,基礎鏡像中的roofs會一直保持只讀模式,docker利用union mount來在這個rootfs上增加更多的只讀文件系統,最后它們看起來就像一個文件系統即容器的rootfs。
在docker的分層鏡像中,除了支持aufs之外,還支持devicemapper,因為在aufs暫時還未被收納入linux內核主干,ubuntu14支持aufs,所以docker在ubuntu上面使用aufs,而作為比較保留的redhat系列上,docker使用的devicemapper

