multipathd 显示 “map in use” 无法 remove 的强制 dmsetup remove

12次阅读

当 multipathd 显示“map in use”却无进程占用时,本质是内核 device-mapper refcount > 0;应先确认无挂载、LVM、fd 占用,再通过 multipath -r/-f 或重启 multipathd 优雅清理;仅在万不得已时用 dmsetup remove –force –nolockfs –retry 强制移除。

multipathd 显示 “map in use” 无法 remove 的强制 dmsetup removeapper 内核中该映射仍被持有引用(refcount > 0)。强制删除需谨慎操作,以下为安全、有效的处理步骤:

确认 map 确实无用户态占用

先排除常见误判:

  • 检查是否被挂载:findmnt -D /dev/mapper/xxxmount | grep xxx
  • 检查是否属于 LVM PV:pvs | grep xxx,若存在,先 vgchange -an 停用卷组
  • 检查是否有进程打开底层块设备:lsof +D /dev/dm-* | grep xxx(注意:lsof 对 dm 设备支持有限,更可靠的是 ls -l /proc/*/fd/ 2>/dev/NULL | grep xxx
  • 检查是否被其他 multipath map 依赖(如 alias 指向同一 wwid):multipath -ll 查看 map 关系

通知 multipathd 主动清理

不要跳过这步直接硬删。让 multipathd 主动释放是首选:

  • 尝试刷新 multipath 配置:multipath -r(重载路径,可能触发自动清理)
  • 如果 map 已失效或路径全 down,可先 multipath -f 强制 flush(注意:-f 不等于 -F,它会尝试优雅移除)
  • 若仍卡住,重启 multipathd:systemctl restart multipathd(多数情况下会清空 stale map)

强制清除 device-mapper refcount(仅限确认无业务影响)

若上述无效且确定无任何 I/O 或用户态依赖,可手动降低内核 refcount:

  • 查看当前 refcount:dmsetup info -c | grep ,第三列即 open count
  • 强制释放(绕过 refcount 检查):dmsetup remove --force --nolockfs
  • 若提示 “device is busy”,再加 --retry 参数重试:dmsetup remove --force --nolockfs --retry
  • 极端情况(如 refcount 卡死在 1):可尝试 echo 1 > /sys/block/dm-X/device/delete(X 为对应 dm 号,需从 ls -l /sys/block/ | grep 查得),但此操作风险高,仅限调试环境

预防后续再次出现

“map in use” 常源于异常退出或路径震荡未清理干净:

  • 确保 multipath.conf 中配置 flush_on_last_del yes(默认开启,确保最后一个路径删除时 flush map)
  • 避免手动 kill multipathd,应使用 systemctl 控制
  • 在存储链路不稳定时,禁用 queue_if_no_path 或调大 no_path_retry,减少 map 频繁重建
  • 定期运行 multipath -v3 -d 查看 debug 日志,定位残留 map 成因

不复杂但容易忽略的是:multipathd 的 map 生命周期管理依赖 udev 事件和内核通知,一旦事件丢失或延迟,refcount 就可能滞留。所以优先走 multipathd 自身的 flush 流程,而非直击 dmsetup。

text=ZqhQzanResources