Xen Tools 代碼閱讀心得

原文出處(雖然也是轉的尷尬

http://blog.chinaunix.net/uid-29104338-id-3844620.html


XenAPI:一個Xen的項目,目的是提供管理控制Xen所需要的數據模型和遠程調用接口。
XenStore:一個存儲Xen運行信息的機構,包含各個VM的信息,類似於Win中的註冊表。

libxc是一個C語言庫,它提供了一些簡單易用的API,使用戶程序可以方便的和Hypervisor進行通信。它的工作原理很簡單,主要封裝了dom0中的/proc/xen/privcmd/dev/xen/evtchn以及/dev/xen/gntdev提供的IOCTL接口。也就是說,我們本來可以直接通過上面這些內核級設備驅動進行相關的操作控制,但有了libxc之後,只需要調用其相應接口函數,由它負責數據結構的解析/封裝,然後再與底層hypervisor通信。這就是爲什麼說xm發出命令之後,到達xend,而xend需要調用libxc再處理後才與底層hypervisor通信:libxc是一個接口庫

看到有這樣的解析,借鑑一下:

/proc/xen/privcmd

1. xc_interface_open()

打開/proc/xen/privcmd,獲得文件描述符。

2. xc_sysctl()

填充xen_sysctl結構體,發送ioctl請求。

3. xc_interface_close()

關閉1中打開的文件描述

/dev/xen/evtchn

1. xc_evtchn_open

2. xc_evtchn_notify等函數

evtchn的操作比較簡單,不需要填充結構體,一般指明遠程Dom idport即可

3. xc_evtchn_close

/dev/xen/gntdev

1. xc_gnttab_open

2. xc_gnttab_map_grant_ref

3. xc_gnttab_close


用來控制Xen內核的庫,位於xen-../tools/libxc。包括兩個部分:

一個是libxenctrl,封裝了各種Hypercall提供的功能,其函數列表在xenctrl.h中列出;
另一個是libxenguest,提供在內核中創建domain的方法,其函數列表在xenguest.h中列出。

若在內核中通過修改hypercall的方式爲Xen添加功能,需要在libxenctrl中進行封裝。
libxc中的函數的第一個參數均爲int xc_handler,這其實是一個句柄,這個句柄對應着dom0中與guest kernel進行交互的proc文件,即/proc/xen/privcmd。
libxc中進行Hypercall的調用可以利用do_domctl這個函數,這個函數的定義在xc_private.h中。do_domctl的第二個參數struct xen_domctl封裝了一個hypercall的number and arguments。

如要在其中加入自己的新接口,需要在libxc目錄下執行make install命令,之後,可以自己編寫一個小型C程序,並引用<xenctrl.h>,在編譯時加入參數-lxenctrl就可以了。

Python
教程:http://docs.python.org/tutorial/
C與Python進行交互:http://docs.python.org/c-api/ 重點參考:http://docs.python.org/c-api/concrete.html

在xen-.../tools/python/lowlevel文件夾下,有xc和xs兩個子目錄,其中分別實現了對libxc和libxenstore的封裝。我們在libxc中添加自己的功能後,還需要在xc中進行python的封裝,這樣才能在python的代碼中調用這個功能。

在python的代碼中,初始化C封裝的類通常會以如下代碼:
import xen.lowlevel.xc
xc=xen.lowlevel.xc.xc()

Xend
Xend是一個守護進程,它的一個重要作用是充當各種RPC(Remote Procedure Call)服務器。其代碼位於python/xen/xend目錄下。其中的server子目錄下是和RPC服務器有關的代碼。server/XMLRPCServer.py這個文件中的run方法,是關於Xend把那些方法暴露到遠程去的。
關於XMLRPC,參考文檔:http://docs.python.org/library/xmlrpclib.html?highlight=xmlrpc#module-xmlrpclib和http://docs.python.org/library/simplexmlrpcserver.html?highlight=register_function#SimpleXMLRPCServer.SimpleXMLRPCServer.register_function

Xend中常見的功能:
XendConfig.py 這個類代表了創建domain的配置文件,它負責解析各種格式的domain配置文件並將他們轉化爲接近於XenAPI的表示方式。
XendDomain.py這個類表示了Xend中的一個虛擬機。也就是說它代表了Xend本身所存儲的關於一個Domain的信息以及相關的方法。在XendDomain中形似domain_*的方法會被自動加入RPC服務器中,被添加成xend.domain.*方法。
XendDomainInfo.py這個類表示了Xen中的一個虛擬機。也就是說它代表了從Xen中通過hypercall獲取的一個domain的信息,同時提供了操作domain的方法。XendDomainInfo中的方法往往是直接向Xen發命令,而XendDomain中的方法往往會調用XendDomainInfo中的方法。
XendAPI.py,這個是用來實現XenAPI的。

Xend的調試問題。Xend的標準輸出是不會輸出到屏幕上的,因此無法用print進行調試。解決方法是再xend
的配置文件/etc/xen/xend-config.sxp中加入loglevel DEBUG這一行,然後在平時用print的地方改用log.debug。最後在/var/log/xen/xend.log中可以看到輸出的內容。另外,終端下推薦使用tail -f /var/log/xen/xend.log這一命令,它會把向一個文件中追加的內容打印到屏幕上。

xm,這個命令僅僅是解析命令行參數,創建一個遠程過程調用實例(就是server這變量),然後根據配置文件的不同,如果使用XenAPI,就調用server.api.*這一系的方法,如果不使用XenAPI(默認情況),就調用server.xend.*這一系的方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章