根本原因是multipathd默认将所有设备拉入黑名单,需注释devnode "*"黑名单、启用user_friendly_names、排除本地盘、启动服务并执行multipath -f && multipath -v2扫描。

为什么 multipath -ll 为空或只显示 control?
根本原因不是服务没起来,而是 multipathd 默认把所有设备拉进黑名单——/etc/multipath.conf 不存在或含 devnode "*" 就会触发这个行为。日志里明确打印 /etc/multipath.conf does not exist, blacklisting all devices,这不是警告,是直接禁用全部路径。
- 先确认内核模块已加载:
lsmod | grep dm_multipath,无输出就执行modprobe dm_multipath - 检查是否安装了工具包:
rpm -qa | grep device-mapper-multipath(RHEL系)或dpkg -l | grep multipath-tools(Debian系) - 运行
multipath -v2(不是-v3),它会逐行输出设备匹配过程,重点看有没有blacklisted或skip: no path - 如果看到多个
/dev/sdb、/dev/sdc等设备但没聚合,说明硬件链路正常,问题纯在配置层
/etc/multipath.conf 最小可用配置怎么写?
新手常被默认配置吓退,其实只需 4 行有效内容,其余全注释或删掉。关键不是堆参数,而是解除黑名单 + 启用友好名 + 匹配真实存储厂商。
- 注释掉整个
devnode_blacklist { devnode "*" }块——这是 90% 初次失败的根源 - 取消
defaults { user_friendly_names yes }的注释,否则设备名是长串 WWID,没法用 - 在
devices段里加厂商专属块,vendor和product必须和scsi_id -g -u -d /dev/sdb输出完全一致(大小写敏感) - 别填
wwid字段——那是单设备硬编码,无法泛化;靠vendor/product匹配才是可维护做法
示例(适配 NetApp):
defaults {
user_friendly_names yes
}
devices {
device {
vendor "NETAPP"
product "LUN"
path_grouping_policy multibus
failback immediate
}
}
如何让 /dev/mapper/mpathb 这种名字固定不变?
/dev/mapper/mpathb 是动态分配的,重启后可能变 mpatha 或 mpathc。真正稳定的是 WWID,但太长难记。绑定别名靠 /var/lib/multipath/bindings 文件,但必须手动干预才能生效。
- 首次运行
multipath -v2后,/var/lib/multipath/bindings会自动生成,形如mpathb 36005076b08164f4011ae88b23efb95fe - 想固定为
asm_data,需在multipaths段显式定义:multipath { wwid "36005076b08164f4011ae88b23efb95fe" alias "asm_data" } - 改完必须执行
multipath -F && multipath -v2:前者清旧映射,后者强制重发现,缺一不可 - 别依赖
mpathconf --enable生成的配置——它常带过时黑名单和冗余字段,反而干扰识别
multipath -ll 显示 paths=0 或状态为 failed 怎么办?
这不代表线缆断了或存储挂了,而是 multipathd 认为路径不可用。底层 SCSI 设备可能仍能读写,问题出在路径探活机制上。
- 检查
path_checker设置:默认tur(Test Unit Ready)要求设备响应 SCSI 命令,某些阵列(如老 IBM DS 系列)需改用readsector0 - 确认
failback策略:设为immediate才能在主路径恢复后立刻切回;设为off就永远卡在备用路径 - 查
no_path_retry:值为fail时路径失效立即报错;设为数字(如12)表示重试 12 次再标记 failed - 别忽略 ALUA 状态:用
sg_inq /dev/sdb查TPGS字段,若为01h(ALUA 支持),则path_grouping_policy group_by_prio才能正确识别 Active/Optimized 路径
最易被忽略的是:multipath.conf 语法错误(比如漏右括号)会导致服务静默失败,systemctl status multipathd 却显示 active (running) —— 必须看 journalctl -u multipathd 的实际日志。











