如何回收Xenserver 删除虚拟机快照后释放的空间

概要

本文介绍了如何在删除快照或克隆虚拟机后,使用离线合并(Off-line Coalesce)工具回收磁盘空间。

背景资料

在基于LVM的Local EXT和NFS SR上删除快照或克隆虚拟机后,通过释放未使用的数据,XenServer可自动回收磁盘空间,此过程称之为合并(coalescing)。XenServer可在虚拟机运行的同时合并磁盘空间(即在线合并)。

但是,XenServer 5.5的合并部署有一个已知的限制条件。在虚拟机磁盘上删除所有快照或克隆虚拟机后,一些磁盘空间可能仍然处于分配状态。尽管NFS和基于ext的SR的已删除快照或克隆虚拟机所消耗的空间非常少,但对于iSCSI FC和本地SR来说,消耗的空间量是非常巨大的。

为了消除这一局限性,XenServer 5.5 Update 1和更高版本引进了一个离线合并工具。该工具可在虚拟机暂时关闭或暂停使用(离线)时,回收之前分配给已删除快照或克隆的所有磁盘空间。下面介绍了离线合并工具及其使用。

警告!

  • ? 运行此脚本会导致虚拟机暂时无法使用,因为执行了暂停/恢复操作。

    ? 运行此工具前,您必须使用XenCenter或XenServer CLI删除与虚拟机相关的所有快照和克隆。否则,脚本就会失败,工具就会显示错误信息,然后退出。

    ? 所有虚拟机磁盘必须在单个主机的共享存储或本地存储上。带有这两种存储类型的磁盘的虚拟机无法合并。

步骤 - 适用于XenServer 5.5 Update 1和更高版本

思杰建议对将运行空间回收工具的虚拟机进行备份,可使用XenCenter导出选项进行备份。 
您必须知道虚拟机的UUID。

获取UUID

  • 1. 在XenCenter中,启用隐藏目标(View menu > Hidden Objects)。

    1. 在Resource窗格中,选择所需UUID对应的虚拟机。UUID将显示在General项中。

回收磁盘空间

  • 1. 在XenServer CLI中运行以下命令:
    coalesce-leaf –u <uuid of VM>


    例如,如果虚拟机的UUID是2a8d2815-c97e-245b-efe2-389ba456bd7p,您需要运行以下命令:
    coalesce-leaf –u 2a8d2815-c97e-245b-efe2-389ba456bd7p

    1. 此命令会暂时中止虚拟机的运行(除非其已经关机),启动回收进程,然后恢复虚拟机运行。

根据上次快照后写入磁盘的数据量的大小,所需的时间也不同。最小的虚拟机(10GB或更低)只需不到1分钟。

步骤 - 适用于XenServer 5.6

思杰建议对将运行空间回收工具的虚拟机进行备份,可使用XenCenter导出选项进行备份。
您需要知道虚拟机和主机UUID。

获取UUID

  • 1. 在XenCenter中,启用隐藏目标(View menu > Hidden Objects)。

    1. 在Resource窗格中,选择所需UUID对应的虚拟机。UUID将显示在General项中。

    1. 在Resource窗格中,选择资源池主机(列表中的第一台主机)。UUID将显示在General项中。如果您没有使用资源池,选择虚拟机所在的主机。

回收磁盘空间

  • 1. 在XenServer CLI中运行以下命令:
    xe host-call-plugin host-uuid=<host-UUID> plugin=coalesce-leaf fn=leaf-coalesce args:vm_uuid=<VM-UUID>


    例如,如果虚拟机的UUID是9bad4022-2c2d-dee6-abf5-1b6195b1dad5,主机UUID是b8722062-de95-4d95-9baa-a5fe343898ea,您需要运行以下命令:
    xe host-call-plugin host-uuid=b8722062-de95-4d95-9baa-a5fe343898ea plugin=coalesce-leaf fn=leaf-coalesce args:vm_uuid=9bad4022-2c2d-dee6-abf5-1b6195b1dad5

    1. 此命令会暂时中止虚拟机的运行(除非其已经关机),启动回收进程,然后恢复虚拟机运行。

更多信息




在XenCenter中使用命令删除XenServer虚拟机快照

在XenCenter中可以直接使用桌面化的操作方式将快照进行删除,但那样删除之后,还是存在快照占用磁盘空间的问题。在官网查找了一下文档,发现可以使用命令对快照占用的磁盘进行回收,尝试了一下,但效果不明显。

接下来介绍如何在资源池中对虚拟机快照删除之后的资源进行回收,环境描述:两台XenServer主机同时加入到了一个资源池,使用共享虚拟存储存放虚拟机,并启用了HA功能。
由于在对系统进行安全补丁更新时,为了保证系统在更新补丁之后能够正常运行,一般都会对虚拟机进行快照备份,这样即使安全补丁更新之后,造成系统不能正常运行,还是能够使用快照进行快速恢复的,采用快照方式进行备份,也是一种常用的应急恢复方案。之前都是在Windows Hyper-V的环境中对虚拟机进行快照备份和恢复,这次的环境却是XenServer。之前都没有尝试过对XenServer中的虚拟机进行备份和恢复操作,所以第一次在XenServer上进行快照备份操作,在进行快照备份时还是挺顺利的,只有一台虚拟机因为磁盘占用空间太大,未能完成快照备份。其他虚拟机均正常快照备份。在完成虚拟机系统补丁更新之后,测试发现所有系统均能正常运行,故没有做恢复操作。由于之前对虚拟机虚拟磁盘本身分配资源比较小,所以决定将快照文件进行删除,但删除之后,磁盘空间还是未能回收,处于占用状态。
获取虚拟机UUID
可以直接在XenCenter里面选中对应的虚拟机,在
General里面可以看到UUID信息,要是显示不出来,可以在View中选择Hidden Objects选项,再打开虚拟机的General选项里面查看。
另外一种方式就是在XenServer主机里面使用命令进行查看UUID,进入XenServer的console里面,输入: xe vm-list就可以看到对应的虚拟机的UUID码了。
显示所有快照的列表命令

1
xe snapshot - list

删除对应快照的命令:

1
xe snapshot - uninstall snapshot - uuid = 0ea6ccd7 - dc4e - f9c1 - 96e4 - aaad81dec0b6
1
2
3
4
5
6
The following items are about to be destroyed
VM : 0ea6ccd7 - dc4e - f9c1 - 96e4 - aaad81dec0b6 ( 2012 - 05 - 10 )
VDI : 09e3654b - b4a5 - 4637 - 8915 - 5f648a346b14 ( Windows Server 2008 R2 ( 64 - bit ) Temp 0 )
Type 'yes' to continue
yes
All objects destroyed

另一种销毁快照的命令:

1
xe snapshot - destroy snapshot - uuid = 3d36aa5e - 3124 - df1a - 0ce1 - e16a4abda2f9

回收虚拟机快照所占磁盘空间的命令:

1
xe host - call - plugin host - uuid = a021fc90 - 909b - 416d - 8a45 - 5e9662d5b1aa plugin = coalesce - leaf fn = leaf - coalesce args : vm_uuid = a7216cc6 - 3468 - 59b0 - 1bfa - d06cdc267958

说明host-uuid为主机的uuid,vm-uuid为虚拟机的uuid,host-uuid也是可以在General选项里面查看到的。
使用上面的命令,对删除快照之后的磁盘容量回收效果不是很好,大概只能回收1G左右的空间,对于FC类的存储空间来说,跟回收之前没多大区别。
官方提示:
? 思杰建议运行离线合并工具前,手动关闭或暂停虚拟机的运行(使用XenCenter或XenServer CLI)。如果您在处于运行状态的虚拟机上运行合并工具,工具会自动暂停虚拟机运行,执行所需的VDI合并操作,然后恢复虚拟机运行。
? 如果欲合并的虚拟磁盘镜像(VDI)保存在共享存储,您必须在资源池主服务器(pool master)上运行离线合并工具。
? 如果欲合并的VDI保存在本地存储,您必须在与本地存储相关联的服务器上运行离线合并工具。



XenServer在删除VM后存储空间不能释放

  这个问题一般出现的原因是因为非正常操作删除了VM的快照或者base copy
如果需要了解snapshot的原理您可以参考Citrix KB XenServer: Understanding Snapshotshttp://support.citrix.com/article/CTX122978
    XenServer中我们可以通过以下的三个操作彻底查出存储空间是使用在什么地方,在VM删除后空间有没有释放。
  • Xe vm-list name-label=<vm-name>
    此命令来检测这个VM的信息是否已经被XenServer删除,
  • Xe vm-disk-list name-label=<vm-name>
    此命令来查看VM对应的VDI的信息,在VM删除后,我们需要确定这个VDI有没有正常删除。
  • Lvscan | grep <vdi-uuid>
    此命令来查看在linux底层这个VDILVM卷有没有正常被删除。 
一般情况下出现空间没办法释放的问题都是在第1步和2步的都看似正常情况,第3步里面这个LVM卷还是没有被删除。问题是处在第2步,当我们执行完命令之后,通过Xe vdi-list uuid=<vdi-uuid>确实看不到这个VDI了,并且在xe sr-uuid uuid=<sr-uuid> params=all VDIs里面也找不到已经删除的VDI,但是当我们搜索/var/log/SMlog时,我们能看到以下的错误提示:
<3511> 2012-08-27 06:21:46.110090       *~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*
<3511> 2012-08-27 06:21:46.110165                ***********************
<3511> 2012-08-27 06:21:46.110234                *  E X C E P T I O N  *
<3511> 2012-08-27 06:21:46.110302                ***********************
<3511> 2012-08-27 06:21:46.110390       gc: EXCEPTION util.SMException, Parent VDI a8367eaa-138c-488d-b349-51b321a5db4e of 1670bd58-c999-49ee-8d07-67947d1baef3 not found
<3511> 2012-08-27 06:21:46.110458         File "/opt/xensource/sm/cleanup.py", line 2509, in gc
    _gc(None, srUuid, dryRun)
  File "/opt/xensource/sm/cleanup.py", line 2412, in _gc
    _gcLoop(sr, dryRun)
  File "/opt/xensource/sm/cleanup.py", line 2366, in _gcLoop
    sr.scanLocked()
  File "/opt/xensource/sm/cleanup.py", line 1283, in scanLocked
    self.scan(force)
  File "/opt/xensource/sm/cleanup.py", line 2086, in scan
    self._buildTree(force)
  File "/opt/xensource/sm/cleanup.py", line 1800, in _buildTree
    raise util.SMException("Parent VDI %s of %s not " \
 
<3511> 2012-08-27 06:21:46.110528       *~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*
<3511> 2012-08-27 06:21:46.110603       * * * * * SR d0578696-b96f-54d0-208f-20f07afbeed4: ERROR
 
    以上的信息显示的是当SR在执行扫描的时候出现了exception,因为1670bd58-c999-49ee-8d07-67947d1baef3是通过a8367eaa-138c-488d-b349-51b321a5db4e产生的,而UUIDa8367eaa-138c-488d-b349-51b321a5db4eVDI已经被删除了。所以如果要尝试处理这样的exception,就需要把所有有关联的VDI全部删除掉。你可以通过以下命令查出和a8367eaa-138c-488d-b349-51b321a5db4e有关联的VDI: 
vhd-util scan -f -m "VHD-*" -l VG_XenStorage-<sr-uuid> | grep <vdisk uuid>
    但是请注意:
  • 方法仅供测试,至于能否彻底清除SR扫描时候所产生的exception要结合用户的实际生产环境考虑, 因为后续要删除的每个VDISK都有可能是非常关键的VM数据。
  • 上面所提的uuid均为我的测试环境,请结合自己实际环境中的uuid验证。
    如果用户环境很难做以上的troubleshooting,那么我们建议用户可以考虑手工释放存储的空间。在找出想要删除的VDI后,可以使用命令lvremove /dev/VG_XenStorage-<sr-uuid>/VHD-<vdi-uuid>的方法在存储上直接删除此VDI 
    当然如果在没有还有最后一招,实在没有办法就只能备份在使用的VM数据后重新安装XenServer。
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值