0

0

multipathd "map in use" 无法 remove 的 dmsetup remove --force 使用

冷漠man

冷漠man

发布时间:2026-01-24 17:53:02

|

541人浏览过

|

来源于php中文网

原创

根本原因是内核中device-mapper映射被进程、文件系统或LVM等持有引用;--force仅跳过用户态检查,不解除内核refcount>0导致的EBUSY。

multipathd \

为什么 dmsetup remove --force 仍报 “map in use”?

根本原因不是命令没加 --force,而是内核中该 device-mapper 映射仍被某个进程、文件系统或内核子系统(如 LVM、filesystem mount、open() fd)直接持有引用。强制删除只绕过用户空间检查,不解除内核级引用。

  • dmsetup remove --force 会跳过设备是否“busy”的用户态判断,但若内核 refcount > 0,ioctl(DM_REMOVE) 仍会返回 EBUSY
  • 常见持有者:已挂载的文件系统(mount | grep dm-)、LVM 逻辑卷(lvs -o +attr 看是否处于 active 状态)、正在被 dd/cat/数据库进程读写的块设备文件(lsof /dev/mapper/xxx
  • 注意:multipathd 自身不会直接 hold map,但它触发的路径切换或重映射可能让底层 dm 设备被其他组件间接依赖

如何定位谁在占用这个 multipath map?

先确认 map 名称(如 mpatha),再逐层查依赖:

  • 查挂载点:findmnt -D /dev/mapper/mpathamount | grep mpatha
  • 查 LVM 使用:pvs /dev/mapper/mpathalvs --all --options=+seg_pe_ranges | grep mpatha
  • 查打开的文件描述符:lsof +D /dev/mapper/mpatha 2>/dev/null(需 root)
  • 查内核模块引用:dmsetup info -c --noheadings mpatha | awk '{print $5}' 输出非 0 表示 refcount > 0;再用 dmsetup deps mpatha 看下层设备是否也被占用

安全移除 multipath map 的实际步骤

不能跳过清理环节直接强删,否则可能引发 I/O hang 或内核 oops:

WeShop唯象
WeShop唯象

WeShop唯象是国内首款AI商拍工具,专注电商产品图片的智能生成。

下载
  • 卸载所有相关挂载:umount /dev/mapper/mpatha(若为 LVM LV,先 lvchange -an vg/lv
  • 停用 multipath 路径:multipath -f mpatha(这会调用 dmsetup remove 并清理路径)
  • multipath -f 失败,再检查 lsoffindmnt 是否有遗漏;必要时重启依赖服务(如 systemctl restart lvm2-lvmetad
  • 最后执行:dmsetup remove mpatha(不加 --force,验证是否真空闲);仅当确认无任何上层依赖且内核 refcount=0 后,才考虑 dmsetup remove --force mpatha

dmsetup remove --force 的真实作用和风险

它只是把 device-mapper 表从内核中“标记删除”,但若仍有进程通过旧的 /dev/dm-X/dev/mapper/xxx 发起 I/O,内核会 panic 或返回不可预测错误。

  • 该 flag 不释放内存、不清理 bio、不通知上层驱动——它只是“假装删了”,适合调试或 recovery 场景
  • 生产环境应避免使用;真正要删,必须确保:无 mount、无 LVM active、无 open fd、dmsetup info mpathaopen 字段为 0
  • 如果 dmsetup remove 持续失败,大概率是某个服务(如 clvmdcorosync、数据库)仍在轮询设备,需结合 strace -p $(pgrep multipathd)systemctl status multipathd 查日志
实际中,最常被忽略的是 LVM 缓存状态和 /dev/mapper/ 下的符号链接残留——它们不会出现在 lsof 里,但会让 dmsetup 认为设备 still in use。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

185

2023.09.27

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

233

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

437

2024.03.01

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

233

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

437

2024.03.01

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

75

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

36

2025.11.16

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

60

2025.11.17

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

25

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Java 教程
Java 教程

共578课时 | 50.3万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号