multipath路径残留导致虚拟机无法重启

客户反馈一台虚拟机重启后虚拟机状态显示为错误。

检查云平台各个组件服务,未发现异常后,首先尝试重置虚拟机状态,然后硬重启看下

 

一段时间后,虚拟机状态仍然为error。检查虚拟机所在计算节点的nova-compute日志,发现如下错误



日志显示,终止虚拟机的qemu-kvm进程时失败(Failed to terminate process 2216397),有资源占用未释放(device or resource busy)。

尝试从kvm层面,用virsh destroy 命令关闭虚拟机


如上图,virsh destroy也无法终止此qemu-kvm进程(nova的硬重启其实调用的就是destroy接口)

在宿主机上面,查看此qemu-kvm进程,发现此进程已经变成僵尸进程(Z状态),用kill --9无法kill掉,用lsof 命令尝试找出进程占用的资源文件,发现输出为空。


咨询客户重启虚拟机之前对虚拟机有哪些操作,客户反馈卸载了一块商业存储类型的云硬盘(cinder对接的IBM的v7000,走的iscsi协议,使用过程中坑不断,不细述),怀疑可能存储资源未释放。

cinder查看卸载的云硬盘的状态,发现为未挂载的available可用状态。

通过virsh domblklist 命令,发现虚拟机仍显示挂载有云硬盘。

通过virsh dumpxml 命令,查看虚拟机的运行状态

如上图,从路径名分析,商业存储云硬盘,在虚拟机里面挂载为vdb。

在宿主机上面,查看此路径如下:

如上图,虚拟机的vdb对应于宿主机的/dev/dm-8设备,通过multipath -ll命令,发现dm-8设备仍存在,说明虚拟机占用此资源一直未释放,导致虚拟机进程无法关闭。

解决办法:

通过multipath -f命令释放此路径

如上图,multipath -f释放此路径后,再次执行multipath -ll,dm-8设备已经不存在,重启虚拟机也正常了。

后续工作:排查卸载云硬盘的过程中,卸载已经完成,云硬盘状态已经为未挂载可用状态时,为何multipath路径仍然占用未释放的原因,进而从源头解决此问题。

原文地址:https://www.cnblogs.com/360linux/p/13062079.html