文前說明
作為碼農中的一員,需要不斷的學習,我工作之餘將一些分析總結和學習筆記寫成博客與大家一起交流,也希望採用這種方式記錄自己的學習之旅。
Ovirt 簡介
- Ovirt 是一個基於 x86 架構上的 KVM 虛擬化技術的開源 IaaS 雲服務解決方案。
- 在架構設計上它使用了 Node/Engine 分離結構,以方便功能的劃分與管理。
- 節點端 ovirt-node,由 fedaro 16 訂製而成。也可以在 Linux 系統上安裝 vdsm 服務從而得到一個 Node。
- 管理端 overt-engine 類似於 vmwarevcenter,基於 web 頁面。
- Ovirt 的目的是提供一套符合市場規範的 KVM 虛擬化管理軟件,儘可能的開發和利用 KVM 的特點。
虛擬化
- 虛擬化是一種技術,主要包含有 cpu/io/內存/網絡 等虛擬化。
- 在 x86 平臺虛擬化技術中,新引入的虛擬化層通常稱為虛擬機監控器(Virtual Machine Monitor,VMM),也叫做 Hypervisor。
- 虛擬機監控器的運行環境,也就是真實的物理機平臺,稱之為宿主機。
- 而虛擬出來的平臺通常稱為客戶機,裡面運行的操作系統對應地也稱為客戶機操作系統。
- 虛擬機監控器的主要職能是管理真實的物理硬件平臺,併為每個虛擬客戶機提供對應的虛擬硬件平臺。
- 實現虛擬化的重要一步在於虛擬化層必須能夠截獲計算元件對物理資源的直接訪問,並將其重定向到虛擬資源池中。
- " 截獲並重定向 " 的實現方式為軟件虛擬化和硬件虛擬化。
- 軟件虛擬化是純軟件的方法在現有的物理平臺上實現對物理平臺訪問的截獲和模擬。
- qemu 是純軟件仿真,所有的指令都是軟件模擬執行。
- vmware 是動態二進制翻譯,虛擬機監控器在可控制的範圍內,允許客戶機的指令在物理機平臺上直接運行。但是,客戶機指令在運行前會被虛擬機監控器掃描,其中突破虛擬機監控器限制的指令會被動態替換為可以在物理平臺上直接運行的安全指令。
- 硬件虛擬化是物理平臺本身提供了對特殊指令的截獲和重定向的硬件支持。
- VMM 將客戶機置於一種受限制的模式下運行,一旦客戶機試圖訪問物理資源,硬件會暫停客戶機的運行,將控制權交回給 VMM。
- 虛擬化模型的底層是整個物理系統,主要包括處理器、內存和輸入輸出設備。物理系統之上,與以往熟悉的操作系統模型不同,運行的是虛擬機監控器。
- 虛擬化類型
- 第一種,虛擬機是在系統上電之後首先加載運行 VMM。一般會提供一個具有一定特權的特殊虛擬機,由這個特殊虛擬機來運行需要提供給用戶日常操作和管理使用的操作系統環境。(ESX/ESXi、Xen、Hyper-V)
- 第二種,虛擬機監控程序,在系統上電之後仍然運行一般意義上的操作系統(俗稱的宿主機操作系統)。MM作為特殊的應用程序,可以視作操作系統功能的擴展。(KVM、Virtual Box、VMware Workstation)
- 虛擬化軟件有 kvm/xen/lxc 等。
- KVM(Kernel-based Virtual Machine) 是集成到 Linux 內核的 Hypervisor,是 X86 架構且硬件支持虛擬化技術(IntelVT 或 AMD-V)的 Linux 的全虛擬化解決方案。
- 是 Linux kernel 的一個模塊,利用 Linux 做大量的事,如任務調度、內存管理與硬件設備交互等。
- 可以用命令 modprobe 去加載 KVM 模塊。加載了模塊後,才能進一步通過其他工具創建虛擬機。但僅有 KVM 模塊是遠遠不夠的,因為用戶無法直接控制內核模塊去作事情,還必須有一個運行在用戶空間的工具才行。這個用戶空間的工具,KVM 的開發者選擇了已經成型的開源虛擬化軟件 qemu。
- KVM 使用了 qemu 的一部分,並稍加改造,就成了可控制 KVM 的用戶空間工具。KVM 是內核中對 CPU 的虛擬化,qemu 實現對其他設備的虛擬化,合併成為 qemu-kvm,支持全虛擬化。
- KVM 打開並初始化系統硬件以支持虛擬機的運行。
- 在被內載加載的時候,KVM 模塊會先初始化內部的數據結構。
- 做好準備之後,KVM 模塊檢測系統當前的 CPU,然後打開 CPU 控制寄存器 CR4 中的虛擬化模式開關。
- 通過執行 VMXON 指令將宿主操作系統(包括 KVM 模塊本身)置於虛擬化模式中的根模式。
- 最後,KVM 模塊創建特殊設備文件 /dev/kvm 並等待來自用戶空間的命令(qemu)。
- 虛擬機的創建和運行將是一個用戶空間的應用程序 qemu 和 KVM 模塊相互配合的過程。
- qemu 是一套由 Fabrice Bellard 所編寫的模擬處理器的自由軟件。
- qemu 本身可以不依賴於 KVM,但是如果有 KVM 的存在並且硬件(處理器)支持比如 Intel VT 功能,那麼 qemu 在對處理器虛擬化這一塊可以利用 KVM 提供的功能來提升性能。
- xen 是直接運行在裸機上的虛擬化管理程序,所以它支持半虛擬化和全虛擬化。
- lxc Linux Container 容器是一種內核虛擬化技術。
- libvirt 是一套免費、開源的支持 Linux 下主流虛擬化工具的 C 函數庫。主要用於提高硬件資源的利用率、提高運維、管理的效率。
- libvirt 操作和管理 KVM 虛機的虛擬化 API,可以由 Python、Ruby、Perl、PHP、Java 等語言調用。可以操作包括 KVM、vmware、XEN、Hyper-v、LXC 等在內的多種 Hypervisor。
- 主要由三個部分組成:API 庫,一個守護進程 libvirtd 和一個默認命令行管理工具 virsh。
- Ovirt 與 Open Stack
- Ovirt 是提供私有云,Open Stack 都有。
- Ovirt 是面向 KVM 的,雖然由於其支持 libvirt,理論上還支持 xen 和 virtualbox,但是目前社區內默認其主要針對 KVM,可以充分的利用 KVM 的特性。Open Stack 是面向多種系統來實現一整套數據中心方案。在對 KVM 的支持上,Open stack 不如 Ovirt。
- Ovirt 部署簡單,直接 rpm 包安裝或者用定製化的 iso 安裝即可。
- Open Stack 採用了模塊化,可以各個模塊分開部署,方便第三方的定製和獨立開發,具有標準的 API 接口。
Ovirt 的邏輯結構
Ovirt 邏輯結構圖
- 用戶(管理員和用戶)
- 系統管理員通過網頁可以創建、修改虛擬機及相關設備或用戶權限。
- 用戶在擁有權限的情況下可以操作自己的虛擬機,並通過 VNC 或 SSH 登陸自己的虛擬機。
- Engine
- 提供內建的網頁服務供用戶和系統管理員使用。
- 在整個系統中充當管理者的角色並對外提供管理服務,它掛載了自己的數據庫記錄整個系統中所有的虛擬機配置,各個節點的自身狀態,系統的網絡狀態,存儲器狀態。
- 管理的邏輯,狀態及策略全部在 Engine 中設置與實現。
- 向外提供 REST API 接口,用戶可以調用這些 API 進行第三方程序的開發。
- engine-Cli 命令行 API 使用的就是 REST API。
- Node
- 只負責功能上的實現,不進行任何狀態的記錄和任何策略的實現。
- 僅僅負責實現虛擬機器與設備的創建與修改,資源的共享與保護,如何使用這些功能交給 Engine 處理。
- 暴露基於網絡的 XMLRPC API 與 Engine 交互。
- Engine 通過這些接口控制各個 Node 上功能的使用。
- Node 可以由一個普通的 Linux 上安裝 VDSM(Virtual Desktop Server Manager 虛擬桌面服務管理)構成,也可以由一個專為 Ovirt 定製的 Linux 系統構成。
- 在定製的情況下,Node 上的許多文件系統都是 ramdisk(基於內存的 Linux 磁盤設備),系統重啟後其中的內容消失,從而保證了 Node 的無狀態性。
VDSM 對存儲器的管理
Node 上運行的主要組件
- 每一個 Node 上都會運行一個 VDSM,實現網絡、存儲器、虛擬機的創建與修改的功能。
- VDSM 的大部分代碼實現用在了存儲系統上,其功能包括數據的組織,集群下的數據共享與保護,故障恢復。
- 通常情況下每一個物理機器當作一個 Node,運行一個 VDSM,Node 本身只攜帶少量存儲器用以保存配置。
- 一個集群中通常有一個 Engine 和數個 Node,這些 Node 通過網絡連接到 SAN(Storage Area Network 存儲區域網絡)上,VDSM 把 Node 上運行的虛擬機存儲數據保存在 SAN 上,Node 本身為無狀態的節點,重新啟動後狀態消失,從而保證了系統整體的可用性,一般情況下不會因用戶的操作而使 Node 失效。
- 一旦問題發生,通常一次重啟既可恢復工作狀態。
VDSM 的功能
- 負責 Node 的自動啟動與註冊。
- 虛擬機的操作與生命週期管理。
- 網絡管理。
- 存儲管理。
- Host 與 VM(Virtual Machine 虛擬機)狀態監視與報告。
- 提供對虛擬機的外部干涉功能。
- 提供內存與存儲的合併與超支功能(Over Commitment)。
Storage Domain(存儲域)
- 是 VDSM 中的最基本存儲實體,簡稱 SD。
- 所有的 virtual image 和 virtual image 對應的元數據都會保存在其中。
- virtual image 表示的是虛擬機程序用到的虛擬磁盤數據,特指虛擬機程序最終能夠操作的文件或設備文件對象。)
- 元數據是描述 virtual image 相關數據大小、狀態、鎖等內容的一組數據集合。
- Storage Domain 包括兩種類型
- File Domain 使用文件系統存儲數據並同步操作,主要針對 NFS(Network File System)和 LOCALFS(Local File System)本地文件系統。
- 在文件系統的幫助下,File Domain 擁有良好的 virtual image 操作能力,每一個虛擬機的存儲數據(稱為 Volume)和對應的元數據都以文件的方式保存。
- 每一個 Domain 實際對應於 Host 文件系統上的一個目錄,針對 NFS 文件系統 VDSM 還有額外的邏輯來處理相關意外與錯誤情況。
- Block Domain 直接操作原始的塊數據,使用 Linux 的 LVM(Logical Volume Manager 邏輯卷管理器) 功能來組織數據,主要針對 iSCSI(Internet Small Computer System Interface),FCoE(Fibre Channel over Ethernet )等塊設備。
- 目標設備上通常沒有一個文件系統來保證訪問的安全性,VDSM 使用了郵箱機制來保證任意時刻,只有一個 Node 可以修改 Block 上的內容,而其他 Node 則通過 Socket 郵箱發送自己的修改請求(Request Mail)。
- 通常設備將使用 Linux 的 device mapper 機制進行一次映射,每一個 Domain 實際上是一個 Linux 中的 Volume Group,元數據保存在其中的一個 Logic Volume 及其 tag 上,虛擬機的 Volume 保存在另一個 Logic Volume 中。
- 操作請求速度和監視功能都會比 File Domain 弱一些。
Storage Pool(存儲池)
- 簡稱 SP,是一組 SD 的組合,目標是管理跨越 SD 之間的操作,SD 之間互相的引用、備份、恢復,合併一般發生在一個 SP 之中。
- 在數據中心裡,一個 SP 抽象了一組 SD 的集合供外界的 Node 訪問或者 Engine 管理,並且一個 SP 中的所有 SD 必須是同一類型,如 NFS 或者 iSCSI。
- 為了保證 SP 中的數據安全,一組 SP 中需要選擇一個 SD 作為 Master Domain。這個 Domain 的不同之處在於它會保存 SP 中 所有的元數據(Meta Data),保存一些 異步請求或者任務的數據,保存所在 SP 的 集群存儲用到的鎖。
Data Center(數據中心)
- Ovirt 中抽象出了 Data Center 概念,一個 Data Center 將擁有一組 Node Cluster 用來運行虛擬機,一個 Storage Pool 用來保存虛擬磁盤數據。
- Node Cluster 是一組專門用來運行虛擬機的 Node 的集合,運行在其中的虛擬機可以動態遷移到 Node Cluster 中的另外一個 Node 上。
- 一個 Data Center 是一個完成 Ovirt 所有功能的實體,在這個 Data Center 中用戶可以創建虛擬機、備份虛擬機、配置虛擬機的 Storage Domain,動態遷移虛擬機。
- Node/Engine 有一些算法在開啟的時候可以自動平衡 Data Center 中的 Node 的負載。
- 一個 Data Center 是一個管理 Node Cluster 與 Storage Pool 的集合。
Data Center 結構圖
Storage Pool Manager(存儲池管理者)
- 由於 Data Center 中所有的 Node 都擁有對 Data Center 中的 Storage Pool 的訪問權限,因此 VDSM 實現了一個稱為 SPM(Storage Pool Manager)的功能角色。
- 在一個 Data Center 中,所有的 Node 啟動後會自動選舉出一個 Node 充當 SPM 的角色,被選舉者將運行 VDSM 上的 SPM 邏輯,負責完成以下功能:創建 / 刪除 / 縮放所在 Data Center 中的 Image,快照,模板。
- 這些操作的共同點是會影響 Storage Pool 中的元數據,如 SAN 上鬆散塊設備的分配。
- 為了保證元數據不被多個 Node 同時修改,SPM 擁有對 Storage Pool 中元數據的排它性操作權限,SPM 使用集中式郵箱接受其他 Node 的相關請求,其他 Node 只能通過給 SPM 發送操作請求的方式修改元數據,最終的操作都由 SPM 線性完成,從而避免了存儲器操作競態的出現。
- 為了兼顧效率,不修改元數據的普通操作,如數據讀寫,Node 可以不同過 SPM,自己直接訪問 Storage Pool 完成。
- 由於 SPM 是由一個普通 Node 選舉出來的,因此當它因為外部原因失效後,系統將會選舉出另外的 Node 充當 SPM,從而保證系統能繼續運行。
Storage Image 和 Storage Volume
- Storage Image 和 Storage Volume 則是 VDSM 抽象出來以方便給虛擬機使用的概念。
- Storage Image 和前面所描述的 virtual image 不同,virtual image 是虛擬機程序看到的虛擬磁盤,一個 Storage Image 中往往包含很多 Storage Volume,每一個 Storage Volume 都可以作為一個 virtual image 傳遞給虛擬機作為虛擬磁盤使用。
- 同一個 Storage Image 中的多個 Storage Volume 往往存在相互備份,相互引用等關係。
- 當幾個 Storage Volume 之間是引用的關係時,這幾個 Storage Volume 集合成為一個 virtual image 傳遞給虛擬機,在虛擬機看來它操作的就是一個虛擬磁盤只不過數據分佈在一系列的 Storage Volume 上(這時把最外層的 Storage Volume 作為參數傳遞給虛擬機啟動程序 )。
- Storage Image 用來管理這樣一組含有內在聯繫的 Storage Volume。在 Storage Domain 和 Storage Pool 建好後,VDSM 便可以通過 SPM 在指定的 Storage Domain 裡創建 Storage Image 與 Storage Volume。創建虛擬機的時候需要 Storage Volume 做為參數。
VM 使用 Storage Volume 示意圖
Storage Over Commitment(存儲超支)
- Storage Over Commitment 是一個允許管理者分配比實際存儲空間大的虛擬存儲器給用戶使用的技術。
- 一個虛擬機所佔用的實際存儲空間可以比它所定義的存儲空間小的多,只有當其中的存儲數據真正增長時,其實際存儲空間才會動態增長。
- 如管理員定義 VM1 擁有 12G 的 Image,但系統啟動後這個 Image 實際只佔用了 10M 的存儲空間。
- 當用戶在虛擬機安裝軟件後,Image 實際佔用的空間才會增長。
- 這種技術允許虛擬機不需要考慮實際機器的物理存儲能力,做到存儲器的共享與使用效率最大化。
- Qemu 的幾種存儲格式都能提供這種動態伸縮能力,如 QCOW2 格式。
- VDSM 使用了 Qemu 的存儲縮放功能,當使用的 Storage Domain 為 Logic Volume 時,VDSM 將會監視 Qemu 所標記的寫入上限位置。
- 當發現越界時,VDSM 將會請求 SPM 擴展 Logic Volume 大小,從而完成空間的動態增長。
VDSM 對 LV 的動態擴展
https://www.ibm.com/developerworks/cn/cloud/library/1209_xiawc_ovirt/
閱讀更多 騎單車去帶娃 的文章