首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

oVirt 中的存储管理(2)

oVirt 中的存储管理(2)

Storage Over Commitment 是一个允许管理者分配比实际存储空间大的虚拟存储器给用户使用的技术。一个虚拟机所占用的实际存储空间可以比它所定义的存储空间小的多,只有当其中的存储数据真正增长时,其实际存储空间才会动态增长。如管理员定义 VM1 拥有 12G 的 Image,但系统启动后这个 Image 实际只占用了 10M 的存储空间。当用户在虚拟机安装软件后,Image 实际占用的空间才会增长。这种技术允许虚拟机不需要考虑实际机器的物理存储能力,做到存储器的共享与使用效率最大化。
   Qemu 的几种存储格式都能提供这种动态伸缩能力,如 QCOW2 格式。VDSM 使用了 Qemu 的存储缩放功能,当使用的 Storage Domain 为 Logic Volume 时间,VDSM 将会监视 Qemu 所标记的写入上限位置。当发现越界时,VDSM 将会请求 SPM 扩展 Logic Volume 大小,从而完成空间的动态增长。
图 5. VDSM 对 LV 的动态扩展
使用 VDSM 创建虚拟磁盘举例   这里从 VDSM API 的角度举例说明虚拟磁盘的创建过程,用户也可以通过网页 GUI 的形式操作 Engine 完成创建的过程,Engine 最后还是会通过 VDSM API 完成最终的操作。例子语言为 Python,VDSM 提供了 vdscli 类封装 XMLRPC API 访问方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
spUUID = '5c84a9d2-be25-49a9-bcb2-2f0f5b9066c0'
sdUUID = 'b9c4821e-e9c0-4dd4-8393-c59b82c9cd29'
imgUUID = '87f5f391-5b83-4e7f-9072-7f50266559c3'
volUUID = 'ce73fdd0-2630-40ca-b2df-a0dd90674dec'
# 这里做为测试,直接写出了将使用的 UUID,实际环境中 UUID 由 Engine 或者用户给出

def vdsOK(d):
   print d
   if d['status']['code']:
       raise Exception(str(d))
   return d
# 此函数用来判断操作成功与否

def waitTask(s, taskid):
   while vdsOK(s.getTaskStatus(taskid))['taskStatus']['taskState'] != 'finished':
       time.sleep(3)
   vdsOK(s.clearTask(taskid))
#VDSM 的任务很多是异步的,每一个请求都是一个任务,此函数用来查询任务成功与否

def main():
   s = vdscli.connect()
   # 连接 VDSM,默认连接本地的 VDSM

   vdsOK(s.connectStorageServer(LOCALFS_DOMAIN,
   "my favorite pet", [dict(id=1, connection=path)]))
   # 连接到 VDSM 的一个 StorageServer

   vdsOK(s.createStorageDomain(LOCALFS_DOMAIN, sdUUID,
   "my local domain", path, DATA_DOMAIN, 0))
   # 创建 Storage Domain sdUUID

   vdsOK(s.createStoragePool(LOCALFS_DOMAIN, spUUID,
   "pool name", sdUUID, [sdUUID], masterVersion))
   # 以 sdUUID 为 master domain 创建 Storage Pool

   vdsOK(s.connectStoragePool(spUUID, hostID, "scsikey", sdUUID, masterVersion))
   # 连接到 Storage Pool 上

   tid = vdsOK(s.spmStart(spUUID, -1, -1, -1, 0))['uuid']
   waitTask(s, tid)
   # 启动这个 Storage Pool 上的 SPM,成功后会有一个 Node 充当 SPM

   sizeGiB = 10
   sectors_per_GB = 2097152
   size = sizeGiB * sectors_per_GB
   tid = vdsOK(s.createVolume(sdUUID, spUUID, imgUUID, size,
                      COW_FORMAT, SPARSE_VOL, LEAF_VOL,
                      volUUID, "volly",
                      BLANK_UUID, BLANK_UUID))['uuid']
   waitTask(s, tid)
   # 创建最终的 Volume,大小为 10GB,此 Volume 存在于前面创建的 Storage Domain 上。至此,
   #虚拟磁盘便准备好了,可以用此磁盘的 UUID 做为参数创建虚拟机了。

main()




VDSM 存储部分代码简介VDSM 中的存储部分代码主要在 ./vdsm/storage 下,下面简单介绍下几个重要的文件作用,读者可以参考以了解 VDSM 的具体实现方法。
Misc.py: 包含了帮助函数与工具以执行系统命令。
Hsm.py: Host Storage Manager 模块,存储管理的总体组织者,初试化和很多操作都是以此文件中的函数为入口点的。
sd.py: Storage Domain 模型。
sp.py: Storage Pool 模型。
image.py: Storage Image 模型。
volume.py: Storage Volume 模型。
dispatcher.py: 任务分配器。
task.py: 任务模型。
taskManager.py: 任务的监视与管理。
safeLease.py: 集群环境下的锁。
storage_mailbox.py: 和 SPM 进行 mailbox 通信的实现。
返回列表