0

0

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

冷漠man

冷漠man

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

|

581人浏览过

|

来源于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:

Nanonets
Nanonets

基于AI的自学习OCR文档处理,自动捕获文档数据

下载
  • 卸载所有相关挂载: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。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

193

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

19

2026.02.03

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

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

254

2023.09.22

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

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

1089

2024.03.01

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

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

254

2023.09.22

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

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

1089

2024.03.01

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

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

77

2025.09.05

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

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

40

2025.11.16

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

1

2026.03.13

热门下载

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

精品课程

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

共578课时 | 81.4万人学习

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

共12课时 | 1万人学习

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

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