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 信息

感谢阅读,如需交流可通过邮件与我沟通:hczhang.cn@gmail.com