经常有用户问到如何从xenserver的角度恢复被客户误删除的虚拟机,citrix 技术支持并不提供这种数据恢复服务,但是并不是无法恢复,过程比较繁琐,我在这里整理下如何恢复误删的虚拟机数据。

这里我新建一个测试存储和测试vm

QQ图片20140727192038    
上图中我们看到SR对应的uuid为4ec639db-6c87-b775-73d1-b54e21b3a31a    
打开xenserver命令行输入pvsan找到该存储对应的VG和PV信息

QQ截图20140727192141    
默认VG的信息保存在/etc/lvm/backup    
#dir

image    
这里为了测试,我先备份原来的VG信息,这里备份到/root目录下    
#cp VG_XenStorage-4ec639db-6c87-b775-73d1-b54e21b3a31a /root    
这个时候我们尝试去删除虚拟机并且删除磁盘文件    
删除之后我们看到存储上已经没有对应起数据,因为我们之前已经备份过VG,所以我们直接通过命令来恢复VG信息    
#vgcfgrestore VG_XenStorage-4ec639db-6c87-b775-73d1-b54e21b3a31a -f /root/ VG_XenStorage-4ec639db-6c87-b775-73d1-b54e21b3a31a    
恢复完成后我们通过lvscan去检查是否恢复    
#lvscan |grep 4ec6

image    
我们看到这里的VHD-306128a9-7138-4611-a2c6-b79823e1e58b已经恢复,但是这里看到该逻辑卷是inactive的,我们需要先激活    
#lvchange –ay /dev/ VG_XenStorage-4ec639db-6c87-b775-73d1-b54e21b3a31a/VHD-306128a9-7138-4611-a2c6-b79823e1e58b    
激活以后这个时候还要注意的是这个vhd的属性是hidden,如果这个时候你执行sr-scan以后会发现这个逻辑卷又不见了,关于vhd的属性我们可以通过命令来查看    
#vhd-util read –n /dev/ VG_XenStorage-4ec639db-6c87-b775-73d1-b54e21b3a31a/VHD-306128a9-7138-4611-a2c6-b79823e1e58b –p

image    
既然这样,我们必须将此属性改默认不隐藏,通过以下命令来完成    
#vhd-util set -n /dev/ VG_XenStorage-4ec639db-6c87-b775-73d1-b54e21b3a31a/VHD-306128a9-7138-4611-a2c6-b79823e1e58b –f hidden –v 0    
这个时候新建vm,将对应的磁盘挂载上去即可以恢复。    
但是问题的重点在这里,因为客户不可能是手动去备份VG的信息,客户在删除vm的同时xenserver上/etc/lvm/backup目录下的VG信息也对应跟着更新,所以这种情况下恢复就比较困难,但是也不是没有办法。    
先找到该VG对应的pv的信息    
#pvscan

image    
这里我们看到此VG对应的pv的信息为/dev/sdj    
#dd if=/dev/sdj count=100 |strings

image    
在以上输出中我们能看到被删除的VHD的信息(请注意,如果这里你的存储上有相当多的vhd的话就必须一个个的对了,我这里上面的vhd很少,所以很容易发现),记录下以上信息    
打开/etc/lvm/backup目录下对应的vg的备份信息    
#cat VG_XenStorage-4ec639db-6c87-b775-73d1-b54e21b3a31a |more    
我们看到正常VHD的信息在VG的备份信息中的为以下格式:

image    
根据我们从PV中查到的vhd的信息,按照上述的格式插入到对应的VG信息中并保存退出    
#vi VG_XenStorage-4ec639db-6c87-b775-73d1-b54e21b3a31a    
插入一下内容:

image    
继续执行vgcfgrestore    
#vgcfgrestore VG_XenStorage-4ec639db-6c87-b775-73d1-b54e21b3a31a –f VG_XenStorage-4ec639db-6c87-b775-73d1-b54e21b3a31a    
这个时候即可以恢复,剩下的就激活逻辑卷,更改vhd属性hidden为0,新建VM,挂磁盘,即可以完成最终数据恢复!