虚机变更出现map in use问题解决方案

虚机变更出现map in use问题解决方案

1 发生环境

  • CentOS Linux release 7.6.1810 (AltArch)
  • SAN 存储后端
  • OpenStack Ocata

2 问题描述

  • 操作虚机进行规格变更或热迁移
    规格变更
    $ openstack server resize $instance_uuid --flavor $flavor_uuid
    		
    热迁移
    $ openstack server migrate $instance_uuid --live $dest_hostname
    		
  • 虚机规格变更或热迁移失败,虚机状态变成 error ,nova-compute.log 出现如下错误日志
    ERROR nova.compute.manager [req-7fdecdb3-904b-4c03-9e0e-0c56fdbec936 66f59526fad542af9da25bad7ca65d53 323c75f9d0cd429ca3d97a1139bf21e0 - - -] [instance: 741cf69d-80ef-4b42-8744-531be7d7c4a3] Live migration failed.: ProcessExecutionError: Unexpected error while running command.
    		ERROR nova.compute.manager [instance: 741cf69d-80ef-4b42-8744-531be7d7c4a3] Traceback (most recent call last):
    		ERROR nova.compute.manager [instance: 741cf69d-80ef-4b42-8744-531be7d7c4a3]   File "/var/lib/kolla/venv/lib/python2.7/site-packages/nova/compute/manager.py", line 5535, in _do_live_migration
    		ERROR nova.compute.manager [instance: 741cf69d-80ef-4b42-8744-531be7d7c4a3]   File "/var/lib/kolla/venv/lib/python2.7/site-packages/nova/virt/libvirt/driver.py", line 6849, in _live_migration_monitor
    		ERROR nova.compute.manager [instance: 741cf69d-80ef-4b42-8744-531be7d7c4a3]   File "/var/lib/kolla/venv/lib/python2.7/site-packages/os_brick/executor.py", line 52, in _execute
    		ERROR nova.compute.manager [instance: 741cf69d-80ef-4b42-8744-531be7d7c4a3] ProcessExecutionError: Unexpected error while running command.
    		ERROR nova.compute.manager [instance: 741cf69d-80ef-4b42-8744-531be7d7c4a3] Command: multipath -f /dev/disk/by-id/dm-uuid-mpath-36084f0a100bd2ef983572f2400000161
    		ERROR nova.compute.manager [instance: 741cf69d-80ef-4b42-8744-531be7d7c4a3] Exit code: 1
    		ERROR nova.compute.manager [instance: 741cf69d-80ef-4b42-8744-531be7d7c4a3] Stdout: u'Dec 08 15:23:25 | /dev/disk/by-id/dm-uuid-mpath-36084f0a100bd2ef983572f2400000161: map in use\nDec 08 15:23:25 | failed to remove multipath map /dev/disk/by-id/dm-uuid-mpath-36084f0a100bd2ef983572f2400000161
    		\n'
    		ERROR nova.compute.manager [instance: 741cf69d-80ef-4b42-8744-531be7d7c4a3] Stderr: u''
    		

3 解决方案

注意事项:在如下场景请不要直接使用本解决方案进行问题处理

  • Cinder 对接并使用了 LVM 存储后端
  • OpenStack 计算节点上需要使用 LVM
  1. 在计算节点上执行 lvs 命令确认哪些 logical volumes 导致了问题
    $ lvs
    		
  2. 在计算节点上执行 vgchange -an 命令解锁所有VG(Volume Group)
    $ vgchange -an
    		
  3. 修改计算节点上的 /etc/lvm/lvm.conf 文件,加入如下配置,使计算节点不再激活 LVM 设备
    global\_filter = ["r|.\*|"]
    		
  4. 重新扫描设备,确保在宿主机上没有可见的 LVM 设备
    $ pvscan --cache
    		$ lvs
    		

4 根本原因

LVM在每个物理卷头部都维护了一个metadata,每个metadata中都包含了整个VG的信息;

当Cinder将磁盘挂载给计算节点宿主机时,宿主机上的LVM将检查该磁盘上是否存在LVM信息;

如果磁盘检查到了LVM信息,该磁盘就会被宿主机上的LVM激活并纳入管理(LVM无法判断该磁盘是否属于虚机);

LVM激活磁盘后,该磁盘将被内核锁定并保持打开状态(可见磁盘Open Count数量增加);

当磁盘处于被锁定状态时,对其进行的操作都将失败(磁盘无法被卸载清理)。

5 排查步骤

  1. 在计算节点 nova-compute.log 中出现 multipath -f /dev/disk/by-id/dm-uuid-mpath-* ... map in use 报错;
  2. 使用 virsh domblklist 命令获取报错虚机磁盘信息,使用 dmsetup info 命令查看报错虚机磁盘打开数量,数据盘在虚机运行过程中获取到的 Open count 计数 > 1;
    $ virsh domblklist $instance_uuid
    		$ dmsetup info $disk_path
    		
  3. 使用 vgslvs 命令查看宿主机上是否可以看到虚机中的 LVM 信息。
© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容