xm list源碼分析
XenAPI.py:442 parseServer():
從/etc/xen/xm-config.xml讀取配置,得到
serverType: Xen-APIserverURI: http://localhost:9363/username: mepassword: mypassword
python\xen\xm\main.py:2979
2979: main() 判斷是否列印help
2956: xm_lookup_cmd() 尋找命令對應的函數-->xm_list()
3003:_run_cmd 根據serverType:
如果Xen-API:
server = XenAPI.Session(serverURI)
parseAuthentication()
*server.login_with_password()
如果XMLRPC: server = ServerProxy(serverURI) <------
xmlrpclib.ServerProxy
跳到xm_list()執行
python\xen\xm\main.py:853 xm_list()
命令列參數解析
如果show_vcpus --> 跳到xm_vcpu_list()
801:getDomains()
如果 Xen-API:
*所有虛機:
server.xenapi.VM.get_all_records()
*所有虛機的Metrics:
server.xenapi.VM_metrics.get_all_records()
根據二者得到所有虛機的資訊
根據參數中的虛機名稱過濾並轉換為sxp格式 map2sxp
如果 XMLRPC:
server.xend.domain(dom, full)
或者server.xend.domains_with_state(True, state, full)
如果--long參數 map(PrettyPrint.prettyprint, doms)
如果--label參數
xm_label_list->parse_doms_info->server.xend.security.get_domain_label->輸出
否則:xm_brief_list->parse_doms_info->輸出
*server.login_with_password()登陸的過程:
getattr(self, 'session.%s' % method)(*params) --> __getattr__ --> xmlrpcclient.ServerProxy.__getattr__(self, name)-->xmlprc伺服器執行
*所有虛機:server.xenapi.VM.get_all_records()的過程
通過xm.XenAPI(xmlrpcclient)向伺服器發送RPC請求
XMLPRCServer.py伺服器端註冊的處理函數server.register_instance(XendAPI.XendAPIAsyncProxy(self.xenapi)) -----> 同步介面??
通過XendTaskManager建立task並啟動,具體的處理在XendAPI中
VM.get_all_records通過_get_all_records():通過VM_get_all()得到所有UUID,再根據UUID和VM_get_record()得到最終的資訊 O(N*N)
VM_get_all():XendDomain.instance().list('all')得到所有UUID 更新domains(需要更新Xen Store Daemon中的資料) 迴圈遍曆domains和managed_domains,得到所有虛機的UUID VM_get_record(): XendDomain.instance().get_vm_by_uuid() 迴圈遍曆domains和managed_domains,如果uuid一致,則輸出 註:
domains和managed_domains資訊有重合,這兒本可以直接用uuid作為key來得到字典的values,但是程式裡面卻用迴圈遍曆values再比較uuid。難道values中存放的uuid與作為key的uuid不一致??
*VM_metrics類的請求被轉寄給XendVMMetrics
調用XendVMMetrics的所有get_*方法合并得到Metrics
相關類:
VM: A virtual machine (or ’guest’)
VM metrics:The metrics associated with a VM
libxc
libxc(libxenctrl):libxc是一個C語言庫,它提供了一些簡單易用的API,使使用者程式可以方便的和Hypervisor進行通訊。主要封裝了dom0中的/proc/xen/privcmd,/dev/xen/evtchn以及/dev/xen/gntdev提供的IOCTL介面。