OpenNebula支援虛擬機器的冷遷移(migrate)和熱遷移(live_migrate,也可稱為線上遷移),下面從代碼的角度來分析下虛擬機器移轉的代碼執行路徑。
1. OpenNebula中定義的Action的生命週期
OpenNebula通過定義多種action來表示不同的操作,同時,OpenNebula通過一個統一的架構來處理所有的action,整個處理過程我稱為action的生命週期,也可以這樣理解,每個對虛擬機器的操作都是由一個或多個action組成,所以,action的生命週期也可以理解為虛擬機器的生命週期。
Actions的生命週期如所示。
對於OpenNebula的使用者來說,每個對虛擬機器的操作都是通過RPC請求發起的(rpc的原理和機制不熟悉的同學,可以參見前面的文章《opennebula源碼分析 -- XML-RPC 原理分析 》),RPC
server(OpenNebula節點)接收到RPC請求後,會進行如下的處理和操作:
(1)將RPC請求轉化為DM(DispatchManager)類的action, DM類負責ation的派發工作
(2)DM類將action又轉化為LCM(LifeCycleManager)類的action,LCM類負責虛擬機器的生命狀態的設定,如使用者看到的Pending,Prolog,Boot,Running,Failed等狀態
(3)LCM類將action又轉化為VMM類的(VirtualMachineManager)action,VMM類負責虛擬機器相關的實際操作,如建立,刪除等,這裡的實際操作指的是通過virsh命令執行的操作
(4)VMM類將通過ssh,登入到物理機上執行virsh命令,來完成action代表的使用者的請求
以Migrate為例,看一下在整個migrate action的生命週期中,虛擬機器的狀態的變化。
RUNNING --> SAVE_MIGRATE --> PENDING --> PROLOG --> BOOT --> RUNNING
首先,只有處於RUNNING狀態的虛擬機器才能進行遷移操作;其次,遷移之前首先要SAVE當前的虛擬機器;再次,將SAVE好的虛擬機器拷貝到要遷移到的主機;最後,就是一個虛擬機器部署操作的生命週期了!
2. Migrate action相關的代碼執行流程
3. libvirt層的遷移命令
(1)冷遷移:
virsh migrate vm0 qemu+ssh://192.168.35..16/system
將名稱為vm0的虛擬機器通過ssh協議遷移到主機192.168.35.17上
(2)線上遷移:
virsh migrate --live vm0 qemu+ssh://192.168.35.16/system
這裡都採用了ssh來進行資料轉送,其實還可以利用tcp,如:
virsh migrate vm0
qemu+tcp://192.168.35..16/system