本文描述了在OpenStack环境下的kvm虚拟机数据文件损坏后,如何找回数据非系统盘的数据


故障现象:

   在物理机非法关闭之后,虚拟机连接不上了,ssh连接是总提示超时,nova show查看实例,其中status 行是snapshoting。因为没有手动的做snapshot,因此直接reboot实例,重启之后status是active的,但是还是连接不上。

   首先查看VNC的端口:

nova list | grep  172.0.0.1(得到实例的id,name,ip信息)

nova  get-vnc-console  instance_name  novnc(得到vnc的地址)


使用VNC连接,查看到<0>Kernel panic – not syncing :Fatal exception(服务器系统盘坏了)


处理方案和操作过程:

经确认,主要的数据在额外挂在的vdb盘下面(非EBS盘,没有使用EBS技术,这里实体机显示的名称为disk.local),系统盘坏了,那么我就需要把之前实例的vdb盘数据恢复就OK了,首先尝试修改 instance的libvirt.xml文件

1、把disk挂在到一个正常的实例下面,看看能不能看到数据

2、修改毁坏的实例libvirtd.xml,将引导盘设置成一个没有毁坏的实例的disk盘(物理机显示名称是disk),看能不能启动实例

3、设置iso启动实例,以linux  rescue方式进入系统,配置IP,挂载disk.local盘,scp出数据


几个命令的介绍:

①查看实例的信息:nova list  | grep     ip或者nova show  uuid

②编辑libvirtd.xml的方法:Virsh     edit   uuid

③强制删除实例:use nova

Delete    from nova.security_group_instance_association where id=

Delete    from  nova.instance_info_caches where    id=

Delete    from  nova.instances  where uuid=

上面方案1、2的方法就不介绍了,和正常恢复了数据的方案3差不多,修改相关的路径即可,但是1、2两种方案不可行

方案3:设置iso启动实例,以linux rescue方式进入系统,配置IP,挂载disk.local盘,scp出数据。

1、edit  实例uuid

将原来的启动盘部分删除掉,在现有<disk>…</disk>标签段后再添加如下代码段,以添加光驱设备并挂载iso:

<disktype=’file’ device=’cdrom’>
<driver name=’qemu’ type=’raw’/>
<source file=’/home/openstack/rhel-server-5.3-x86_64-dvd.iso’/>
<target dev=’hdc’ bus=’ide’/>
<readonly/>
</disk>

再在<os>…</os>标签内,<bootdev=’hd’/>之前添加一行:

<boot dev=’cdrom’/>

2.   此时再将该实例destroy再start就会从光盘启动了

# destroy  old_instance_domain

# start  old_instance_domain

注:救援模式如何配置IP之类的就不再说了,网上很多。

那现在进入救援模式,fdisk –l查看现有的盘,建立新的目录,将sdb盘挂载上去,之后就可以使用scp将数据拷出去,此时sdb盘的数据便恢复了。


新建实例,将数据恢复到新的实例上面去;

1、先nova show uuid 查看毁坏的instance的详细信息,比如:flavor的类型,使用哪个p_w_picpath、在那个实体机上面等,

glance index查看镜像的信息

nova flavor-list 查看实例类型

2、之后删除原先的实例,新建实例

nova boot  --flavor 7  --p_w_picpath p_w_picpath_id   instance_name  --availability_zone nova:compute_name

3、分配floating ip

nova   add-floating-ip   uuid 172.0.0.2


SCP 备份的数据到新的实例即可