XenStore

12 篇文章 2 订阅
  1. XenStore
    XenStore 是一种在Xen guest Domain间共享的存储系统,他是一个简单的分层储存结构,由Domain 0维护,并且通过共享存储页面和事件通道访问。尽管XenStore对Xen系统的操作非常重要,但是并没有通过Hypercall与其关联。start info page中包括共享存储页面的地址,用来与store进行通信。客户机映射该页面,从而通过本页面中的环形缓冲区进行后续的通信工作。

  2. XenStore接口
    Hypervisor自身并不知道store的存在,它是由Domain0中运行的守护进程来维护的,并且使用类似其他设备访问驱动的方式进行访问。store的基本呢接口包括两个环形缓冲区,每一个方向各占一个,更新store的请求或者通知当前内容的请求被放置在一个缓冲区域,而响应和和更改的异步通知被插入到另一个环形缓冲区域。第一个缓冲区域被Domain U写入被Domain 0客户机读取,第二个环形缓冲区域被Domain 0写入被Domain U读取。
    这里写图片描述
    XenStore是由目录组成,目录可以包含其他目录或子键。每一个子键都有一个关键值。XenStore可以被想像成一个嵌套关联数组,或者字典。这一结构类似于文件系统,尽管用途有所不同,并没有打算使用store来存储或者大量的数据,实际上这一接口也是难于用于大量数据的传输。

  3. 浏览XenStore
    Xen发行版包括了一些列命令行工具来检查和操作store,他们是XenStore-*,并可以从Domain0中使用过。为了获取XenStore的完整列表,使用xenstore-ls:

[root@localhost ~]# xenstore-ls
tool = ""
 xenstored = ""
local = ""
 domain = ""
  0 = ""
   name = "Domain-0"
   domid = "0"
   device-model = ""
    0 = ""
     state = "running" 
   memory = ""
    target = "262144"
    static-max = "524288"
    freemem-slack = "157208"

store中有3个顶层实体是tool,vm和local,tool层被被工具来存储信息,这一部分的存在用来允许工具拥有一个一直的存储和通信机制,从而与底层的Domain 0的文件系统隔离。/vm树包含每一个运行的虚拟机入口点,通过全局唯一的ID来识别,这个树中的信息是相当稳定的,当 guest Domain在生产周期内不应该大量修改。依靠UUID进行检索允许这个树在迁移后被复制出啦,并且虚拟机的迁移的UUID将保持不变。

# xenstore-ls /vm/1d6af2c8-edf6-fc8c-c659-222ebbf3feea
image = "(linux (kernel /root/xen-src/extras/mini-os/mini-os.elf))"
ostype = "linux"
kernel = "/root/xen-src/extras/mini-os/mini-os.elf"
cmdline = ""
ramdisk = ""
shadow_memory = "0"
uuid = "1d6af2c8-edf6-fc8c-c659-222ebbf3feea"
on_reboot = "restart"
start_time = "1176124400.97"
on_poweroff = "destroy"
name = "Mini-OS"
xend = ""
restart_count = "0"
vcpus = "1"
vcpu_avail = "1"
memory = "32"
on_crash = "destroy"
maxmem = "32"

这里的许多设置是由用于创建Domain的配置文件提供的,字段ostype指向用来创建该Domain的Domain builder。目前xen发布有两种Domain builder:Linux和HVM。
Linux的Domain builder是一个相当通用的支持可加载模块的ELF加载器,HVM的Domain builder被设计为用来启动为未经修改的操作系统。增加一个新的Domain builder需要对xen打补丁。

  1. XenStore设备

XenStore使用的页面被Domain builder映射到guest Domain的地址空间中,机器帧序号(machine frame number)由起始页面提供。客户机为了使用这一页面,首先需要获取指向它的指针。在x86平台上,客户机了解虚拟物理内存地址和机器地址的区别,用户能通过使用机器帧列表完成这一工作。它放在guest Domain虚拟地址空间的顶端,对客户机而言是只读的。
XenStore interface structure[xen/include/public/io/xs_wire.h]

 #define MASK XENSTORE IDX( i d x ) ( ( i d x ) & (XENSTORE RING SIZE−1) )
100 struct x e n s t o r e d o m a i n i n t e r f a c e {
101 char req [ XENSTORE RING SIZE ] ; /∗ Requests to x e n s t o r e
daemon . ∗/
102 char r s p [ XENSTORE RING SIZE ] ; /∗ R e p l i e s and async watch
e v e n t s . ∗/
103 XENSTORE RING IDX req cons , r e q p r o d ;
104 XENSTORE RING IDX r s p c o n s , r s p p r o d ;
105 } ;

这个结构体包含两个缓冲环——— 一个用于请求,一个用于响应————并且它们关联有生产者和消费者计数器。注意它们并不使用前面描述的环形缓冲区域宏定义,因为它们不符合通常环形缓冲区域宏定义纯粹的每一个请求对应一个响应的概念。

  1. 读写一个键
    XenStore的主要用途是便于正在运行的guest Domain和tool访问的位置上存放成对的键值,guestDomain tool可以用来存放它们的配置信息,或者设置信息供其他客户机访问。有3种方式可以用来访问XenStore。用户可以再支持Python并已经移植工具的运行系统图的shell中使用命令工具。这是shell脚本访问XenStore。或执行简单的需要XenStore交互的管理任务的最好方式。到更底层时,用户可以使用C API与host os暴露的XenStore设备进行通信。最后用户可以直接使用内核空间接口。最后一种方式是一个新移植guest Domain最有可能采用该的方式,应为只有内核暴露接口的情况下更高层次的方法才可以被工具使用。
    1、用户空间方法
    store可以直接在命令行下使用非常简单的去读写键值。xenstore-read和xenstore-write命令被用来达到这个目的。使用以下命令:
# xenstore-write /example ""
# xenstore-write /example/foo bar
# xenstore-list /example
foo
# xenstore-read /example/foo
bar
# xenstore-rm /example/foo
# xenstore-list /example

2、从内核调用的方法
客户机kernel能够以类似程度的控制与XenStore进行交互。XenStore想其他设备一样,通过共享存储页面和事件通道进行交互。在实现方式上,类似于控制台设备。不像其他设备需要从XenStore中获取他们的配置信息,store将自己的页面映射到客户机的地址空间,在系统启动的时候连接事件通道。
开始使用XenStore的两个信息都保存在start info page中的store_mfn和store_evtchn区域,首先给出保存环形缓冲区域的机器帧,这必须转换为虚拟机可以识别的虚拟地址,另一个是事件通道。XenStore与控制台是非常相似的,两者都通过domain builder映射到新的domain空间地址,还有分配事件通道在启动的时候,都有两个环,其中一个是请求者另一个是响应者。XenStore接口和其他大部分设备接口直接最大的不同在于前端和后端发送数据的方式。控制台是相当独特的,没有离散的请求和响应,而只需要提供一个连续接口。然而大部分其他设备有固定长度的消息。XenStore类似于基于数据包的接口,XenStore消息结构体显示如下,只展示了消息头,而不是整个消息。

/∗ I n i t i a l i s e the XenStore ∗/
22 i n t x e n s t o r e i n i t ( s t a r t i n f o t ∗ s t a r t )
23 {
24 x e n s t o r e = ( s t r u c t x e n s t o r e d o m a i n i n t e r f a c e ∗)
25 ( ( m a c h i n e t o p h y s m a p p i n g [ s t a r t −>s t o r e m f n ] << 12)
26 +
27 ( ( unsigned long )& t e x t ) ) ;
28 x e n s t o r e e v t = s t a r t −>s t o r e e v t c h n ;
29 /∗ TODO: Set up the e v e n t c h a n n e l ∗/
30
31 r e t u r n 0 ;
32 }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值