前言: 因为机房服务器运行不稳定的原因导致计算节点挂掉,然后上面的Centos7
虚拟机在迁移之后开机报错。这个解决方法同样适用于其它操作系统的虚拟机。基于镜像创建的虚拟机实例。
I/O error, can't read device /dev/vda 的报错信息
首先做疏散先把虚拟实例从宿主机上面疏散到其它主机,关闭云主机。
1.找到虚拟机的ID可以通过dashboard界面或者使用openstack server list
命令,找到虚拟机的ID;然后查看虚拟机的详细信息。
比如:
nova show 8fa3d2eb-2401-48a9-850a-f800314c6950 # 与这个命令相同功能的命令还有 openstack server show ID
连接到所在的计算节点,实例名称确定是哪台主机。
注意要主机是开机状态才能看到
通过ID可以确定该虚拟机实例的数据目录,如果openstack没有对接存储的话那么在这个目录下就会存在数据文件,因为对接了ceph所以信息在libvirt.xml
的文件里面。
cat /var/lib/nova/instances/8fa3d2eb-2401-48a9-850a-f800314c6950/libvirt.xml
里面就是它的vda的ID。
2.当找到这个磁盘的ID之后,在ceph集群里面去查看这个设备
rbd ls volumes | grep 8fa3d2eb-2401-48a9-850a-f800314c6950
3.取消它原来有的一些属性
# 查看卷 rbd info volumes/0859147d-27aa-49a5-8373-7c515c4f3a02_disk #取消它原来有的一些属性;根据ceph的提示操作,因为有的属性linux不支持。 rbd feature disable exclusive-lock object-map fast-diff deep-flatten --image 8fa3d2eb-2401-48a9-850a-f800314c6950_disk -p volumes
4.把它映射到本地
rbd map 8fa3d2eb-2401-48a9-850a-f800314c6950_disk -p volumes # 如果映射不了执行下这个命令。 rbd flatten volumes/8fa3d2eb-2401-48a9-850a-f800314c6950_disk
5.使用命令修复
# 有的可能修复不了就只能做好丢失数据的准备了 xfs_repair -L /dev/rbd0p1 可以ls /dev/rbd* 查看一下,rbd0p1表示的事一个启动分区。
6.取消映射
rbd unmap 8fa3d2eb-2401-48a9-850a-f800314c6950_disk -p volumes
这个时候再重新启动就正常了。
感谢网上上传资料分享的博客,我搜集并处理了故障,终结了出来,希望更多的人看到早日跳出坑!