聲明:
本博客歡迎轉發,但請保留原作者信息!內容系本人學習、研究和總結,如有雷同,實屬榮幸!
原文地址:http://blog.csdn.net/gtt116/article/details/9070487
前言
OpenStack使用的語言是python,比他年長的2歲的OpenNebula就顯得比較奇葩,使用的是C語言和Ruby,shell,多種語言混雜而成。
關於兩者的優劣在此不做討論,但我個人認爲OpenStack的發展偏向公有云,而OpenNebula的設計初衷就是私有云,這可以從兩個產品的設計上看出來。
OpenStack的功能基本是仿照AWS,也就是按照公有云的思路來設計接口和功能。比如虛擬機的host信息對用戶透明,調度算法對用戶透明,調度過程對用戶透明。
而OpenNebula則不同,所有關於虛擬機的任何信息一開始就設計在接口上了。所以在OpenNebula中,可以看到虛擬機詳細的創建過程,調度過程,操作日誌,因爲OpenNebula就是爲了數據中心虛擬化(私有云)而來的,而這些關鍵信息對於數據中心的管理至關重要。
OpenStack中關於虛擬機的很多信息並不能通過調用接口來獲取,比如說調度的歷史,虛擬機的遷移的歷史記錄,在數據庫中也沒有完整的記錄,目前只能從系統日誌中“挖”出來。她其實完全有能力提供這些信息,只是兩個產品的使用場景不同,導致了給用戶感覺的不同。因爲對於公有云用戶不關心這些事情,也就註定了OpenStack一開始不會花太多精力在這些方面。這些功能應該歸爲系統運維功能,就是常說的管理員功能。對於OpenStack只有基本功能完善了,普通用戶滿意了,纔會將更多的精力放在系統運維上。不過從launchpad的BP上來開,未來OpenStack的發展會慢慢的向更強運維性發展。
回到正題,本文主要講述OpenNebula的代碼結構和物理部署結構。對OpenNebula中某個功能的具體實現沒有詳細的描述,點到爲止,旨在拋磚引玉,爲初看OpenNebula代碼的同學提供方便。
注:本文基於OpenNebula4.0進行分析,其他版本可能會些許不同。
OpenNebula Web UI的試用錄像:
優酷 較模糊。
水管高清無碼。
物理架構
主要進程
- oned:OpenNebula的core服務,監聽2633端口,處理XML-RPC請求。另外它會創建如下子進程,這些進程各司其職:
- one_vmm_exec.rb: VirtualMachine Manager,負責管理虛擬機。
- one_im_exec.rb:Imformation Manager,管理和管理虛擬機和宿主機的狀態信息。
- one_tm.rb:TransferManager。
- one_hm.rb: HookManager。
- one_datastore.rb: 數據存儲,類似於Openstack的實例存儲和卷。
- one_auth_mad.rb: 驗證模塊。
- mm_sched: 負責調度虛擬機。
- sunstone-server.rb:OpenNebula的dashboard。
代碼組織結構
在OpenNebula中,核心架構都是通過c++實現的,具體到業務時才使用Ruby,Shell這樣的語言,還是體現其指導原則:“輕量,簡單”。下面將具體介紹哪些是核心架構,哪些部分是業務邏輯,並且之處源碼中比較有價值的地方。
使用c++的部分用的是scons這個構建工具,高級版的make(http://www.scons.org/),他得“MakeFile”文件名叫:SConstruct。
OpenNebula的源碼地址:git://git.opennebula.org/one.git
源碼目錄如下:
├── install.sh
├── LICENSE
├── NOTICE
├── README.md
├── SConstruct
├── share
└── src 主要源碼
下面將分析上文提到的幾個服務進程的源碼。
oned
/* VM related methods */
RequestManagerRegistry.addMethod("one.vm.deploy", vm_deploy);
RequestManagerRegistry.addMethod("one.vm.action", vm_action);
RequestManagerRegistry.addMethod("one.vm.migrate", vm_migrate);
到此,XML-RPC請求註冊完畢,按照這個思路,大家就可以比較順利的閱讀代碼了。one_*m.rb
VM_MAD = [
name = 'vmm_kvm'
executable = 'one_vmm_exec'
arguments = '-t 15 -r 0 kvm'
default = 'vmm_exec/vmm_exec_kvm.conf'
type = 'kvm'
]
可以看到`executable`指向的是one_vmm_exec,這個文件是ruby的可執行文件。這樣如果OpenNebula管理另外一種虛擬化技術,只要編寫對應的*_mad即可,並且OpenNebula的這種設計完全脫離了程序語言,理論上任何程序語言都可以擴展OpenNebula。