文章目錄
摘要:XenStore是Xen提供的一個域間共用的儲存系統,它以字串形式存放了管理程式和前、後端驅動程式的配置資訊。Dom0管理所有的資料,而DomU通過共用記憶體,向Dom0請求與自己相關的索引值,以此實現域間通訊。Xen提供了多種介面用來操作XenStore:命令列的xenstore-*命令、使用者空間的xs_系列函數、核心的XenBus介面,都可以用來方便地操作XenStore的資料。
0. 動機
在Xen的半虛擬化(PV)系統中,各個虛擬機器(Domain)之間可以利用Xen核心提供的授權表(Grant Table)和事件通道(Event Channel)機制進行域間通訊。但是在實際使用中有這樣的問題:
- Alice使用授權表共用了一個頁面,但是Sanae想要拿來用,必須事Crowdsourced Security Testing道它的授權引用(gref);
- Alice開啟一個事件通道(unbound evtchn),但是Sanae想要綁定這個通道,必須事Crowdsourced Security Testing道Alice使用的連接埠號碼(remote port)。
顯然,想要解決這兩個問題,需要Alice和Sanae之間,在建立自訂的授權表、事件通道之前就能夠互相通訊。
使用XenStore可以很方便地實現這種通訊。
1. 快速入門
XenStore是Xen提供的一個域間共用的儲存系統,它以字串形式存放了管理程式和前、後端驅動程式的配置資訊。Dom0管理所有的資料,而DomU通過共用記憶體,向Dom0請求與自己相關的索引值,以此實現域間通訊。
XenStore的儲存結構類似於Dom樹:每一個節點(Node)有一個字串值(Value),並且可以有多個子節點。在Dom0啟動後,XenStore的結構如下:
/
vm
{uuid}
…
local
domain
0
vm
device
control
memory
console
limit
type
name
......
1
…
tool
xenstored
在根(/)下有三個子目錄,vm,local(實際上是/local/domain)和tool。vm存放虛擬機器管理資訊。tool暫時沒有資料。而/local/domain存放了活動虛擬機器設定和驅動資訊。/local/domain中每一個目錄項代表一個活動的虛擬機器,例如/local/domain/0代表dom0。Dom0可以讀寫XenStore的全部資料,而Dom-x只能訪問/local/domain/x的內容。需要在dom0和domx之間共用的內容,一般都寫在這個目錄下,所以/local/domain是最常用的目錄。
Xen提供了多種介面用來操作XenStore:命令列的xenstore-*命令、使用者空間的xs_系列函數、核心的XenBus介面,都可以用來方便地操作XenStore的資料。
操作 |
命令列 |
使用者空間 #include <xs.h>-lxenstore |
核心空間 #include “xen/xenbus.h” |
列目錄 |
xenstore-ls(遞迴) xenstore-list(不遞迴) |
xs_directory |
xenbus_directory |
讀寫 |
xenstore-read xenstore-write |
xs_read xs_write |
xenbus_read xenbus_write xenbus_scanf xenbus_printf |
建立/刪除目錄 |
xenstore-mkdir xenstore-rm |
xs_mkdir xs_rm |
xenbus_mkdir xenbus_rm |
監視 |
xenstore-watch |
xs_watch xs_unwatch xs_read_watch |
xenbus_watch xenbus_unwatch |
例子
命令列
xenstore-write example/Alice hello!
使用者空間
struct xs_handle *xh = xs_open(0);int xt=xs_transaction_begin(xh);xs_write(xh,xt,"/local/domain/0/example/Alice", "hello!", sizeof("hello!"));xs_transaction_end(xh, xt, 0);xs_close(xh);
核心空間
struct xenbus_transaction trans;xenbus_transaction_start(&trans);xenbus_printf(trans, "example", "Alice", "Hello! trans_id = %d", trans.id);xenbus_transaction_end(trans, 0);
Note: example/Alice相當於/local/domain/{當前domain}/example/Alice
具體的使用方法,可以查看相應的標頭檔
快速參考:
http://wiki.xen.org/xenwiki/XenStoreReference