环境:Oracle Linux 8(OEL8)+ multipath-tools / systemd,两节点 fmsbzdb1 / fmsbzdb2(RAC 演练环境)
虚拟化:VirtualBox SATA 共享 VMDK,guest 侧vendor=ATA、model=VBOXHARDDISK
原始需求:给 ASM 提供两节点名字一致的共享盘路径,并保证设备属组满足OSDBA要求
结论:本环境最终采用 multipath 方案,放弃 udev 软链方案(两种方案不叠加)
0. 环境速览与盘位
0.1 共享盘(两节点 wwid 完全一致)
| 用途(alias) | 容量 | wwid(multipath -ll 显示 / udev ID_SERIAL) | db1 sd | db2 sd |
|---|---|---|---|---|
| asmocr01 | 10G | VBOX_HARDDISK_VB78f24c9c-81b5a323 | sdb | sdb |
| asmdata01 | 30G | VBOX_HARDDISK_VB9e185111-851fa9f6 | sdc | sdc |
| asmdata02 | 30G | VBOX_HARDDISK_VBfe936f89-6e4b70ac | sdd | sde |
| asmdata03 | 30G | VBOX_HARDDISK_VBc5405f15-edfbaeb7 | sde | sdd |
| asmarch01 | 20G | VBOX_HARDDISK_VBb02983a4-8d191e4f | sdf | sdf |
0.2 各节点独有盘(系统盘,必须排除)
| 节点 | wwid | 说明 |
|---|---|---|
| fmsbzdb1 | VBOX_HARDDISK_VBfd03285d-460bcb9e | 系统盘,不参与 ASM |
| fmsbzdb2 | VBOX_HARDDISK_VBbef8357d-8d2d8b87 | 系统盘,不参与 ASM |
注意:早期排查时 db2 曾出现
sda=VBOX_HARDDISK_VB78f24c9c(共享盘排到 sda),后续重新枚举后变回sda=系统盘。这类“sd 字母漂移”是本方案的直接动因。
0.3 为什么必须按 wwid 固定名
同一块盘在不同节点、不同次开机拿到的 sdx 不同:
- db1:
asmocr01 → sdb - db2 首轮:
asmocr01 → sda;末轮:asmocr01 → sdb - db2 的
asmdata02/03在两次观测中sdd/sde互换
结论:任何基于 sdx 的路径(asm_diskstring、rsp 的 diskGroup.disks、udev 的 KERNEL=="sdb")都不可靠,必须锚定 wwid。
1. 两种方案对比与选型
| 维度 | 方案 A:multipath(dm 层 + alias) | 方案 B:udev 软链 |
|---|---|---|
| 名字稳定性 | wwid → alias,两节点必然一致 | wwid → 软链名,两节点一致 |
| 是否引入 dm 层 | 是(/dev/mapper/asmocr01 → dm-N) | 否(软链直指 /dev/sdb) |
| 属主/属组控制 | multipath.conf 里 uid/gid/mode,随 map 重建自动生效 | 规则里 OWNER/GROUP/MODE,随规则生效 |
| 权限持久性 | 配置化,重装/重建 map 后仍生效 | 规则命中即生效;wwid 变了则静默失效 |
| 多路径冗余 | 有(本环境单路径,实际无冗余收益) | 无(本来就单路径) |
| 依赖 | device-mapper-multipath + 内核 dm_multipath | 仅 udev,零额外依赖 |
| 排错复杂度 | 较高(parser、wwid 形态、blacklist 优先级) | 低(udevadm test 看命中即可) |
| 与 ASM 的接口 | ASM_DISKSTRING='/dev/mapper/asm*' | ASM_DISKSTRING='/dev/asmocr*' |
| 适用场景 | 需要统一命名 + 统一权限,且不介意 dm 层;真实多路径存储必选 | 纯单路径虚拟盘、只想要软链不想加层 |
本环境选择 A 的理由
- 单路径设备 multipath 同样会建图(
find_multipaths no),命名与权限都在一份multipath.conf里闭环,不依赖任何 udev 规则文件; - 后续若换到真多路径存储(FC/iSCSI/RDM),配置结构不用重写;
- 少一处需要同步的 udev 规则(
/etc/udev/rules.d/在两节点间容易漏拷)。
两套方案不要叠加:一旦 multipath 接管了这些盘,按
sd*匹配的 udev 软链会指向被 multipathd 占用/接管的底层路径,/dev/asmxxx与/dev/mapper/asmxxx混用会让 ASM 认到两份不同的“同一块盘”。
2. 方案 A:multipath
2.1 软件包与内核模块
# 包名注意:device-mapper 只是 libdevmapper/dmsetup,
# multipath 的 /sbin/multipathd、/sbin/multipath 在 device-mapper-multipath 包里
yum install -y device-mapper device-mapper-multipath
rpm -qa | grep -i multipath
# 期望看到类似:device-mapper-multipath-0.8.x-x.el8.x86_64
# device-mapper-multipath-libs-0.8.x-x.el8.x86_64
modprobe dm-multipath # 等价于 dm_multipath
modprobe dm-round-robin # 多数发行版无独立模块,报 Module not found 属正常
lsmod | grep dm_multipath
# 期望:dm_multipath ...
dmsetup targets | grep -E 'multipath|round-robin' # 确认 target 已注册
常见现象与判断:
| 现象 | 结论 |
|---|---|
modprobe: FATAL: Module dm-round-robin not found | 正常。round-robin 路径选择器编译在 dm_multipath 内,无独立 .ko;以 multipathd show selectors 为准 |
rpm -qa | grep multipath 为空 | 只装了 device-mapper,multipath-tools 未安装 |
lsmod 无 dm_multipath | 模块未加载或系统未重启过;先 modprobe dm_multipath 再起服务 |
2.2 mpathconf --enable 的坑(重要)
mpathconf --enable 会启用服务并检查/补写 /etc/multipath.conf:缺配置就生成一份默认配置,其中包含 user_friendly_names yes 与本机设备黑名单;对有手写配置的机器,它仍可能把这些默认项补进去。
而本方案的两个关键项恰好是 find_multipaths no、user_friendly_names no。被改成 yes 的后果:
user_friendly_names yes→ 名字改由本机/etc/multipath/bindings决定,两节点mpathX编号漂移,alias 白做;find_multipaths yes→ 单路径设备可能不建图,两节点可见性不一致。
安全做法(二选一):
# 做法 1(推荐):不执行 mpathconf,直接由 systemd 启用
systemctl enable --now multipathd
systemctl status multipathd
# 做法 2:确实要执行 mpathconf,则先备份、执行后核对并回改
cp -a /etc/multipath.conf /etc/multipath.conf.bak.$(date +%F_%T)
/sbin/mpathconf --enable
multipath -t | grep -E 'find_multipaths|user_friendly_names' # 看是否被改成 yes
校验口径以
multipath -t(daemon 实际生效值)为准,不要以文件里写了什么为准。
2.3 最终版 /etc/multipath.conf(两节点逐字节一致)
# /etc/multipath.conf —— fmsbzdb1 / fmsbzdb2 完全一致
defaults {
find_multipaths no # 单路径也必须建图;集群场景靠 blacklist 决定
user_friendly_names no # 命名只认 alias/wwid,不用本机 bindings
path_grouping_policy multibus
path_selector "service-time 0"
path_checker tur # TUR 异常时改 directio
checker_timeout 15
polling_interval 10 # 单路径无需 5s 高频轮询
failback immediate
no_path_retry fail # 给 ASM:失败即报错,不挂队列
queue_without_daemon no
flush_on_last_del yes
max_fds max
detect_prio no
# 设备节点属主/属组/权限;属组必须等于安装时的 OSDBA 组
uid "500" # id -u grid 的实际值
gid "54321" # getent group asmdba 的实际 gid
mode "0660"
}
blacklist {
devnode "^(ram|zram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"
devnode "^hd[a-z]"
devnode "^vd[a-z]"
# 两节点系统盘都写上(各自多黑一个不存在的 wwid,无副作用),保证 conf 一致
wwid "VBOX_HARDDISK_VBfd03285d-460bcb9e" # db1 系统盘
wwid "VBOX_HARDDISK_VBbef8357d-8d2d8b87" # db2 系统盘
}
devices {
device {
vendor "ATA"
product "VBOXHARDDISK"
path_grouping_policy multibus
path_checker tur
no_path_retry fail
features "0"
hardware_handler "0"
}
}
multipaths {
multipath {
wwid "VBOX_HARDDISK_VB78f24c9c-81b5a323"
alias "asmocr01"
}
multipath {
wwid "VBOX_HARDDISK_VB9e185111-851fa9f6"
alias "asmdata01"
}
multipath {
wwid "VBOX_HARDDISK_VBfe936f89-6e4b70ac"
alias "asmdata02"
}
multipath {
wwid "VBOX_HARDDISK_VBc5405f15-edfbaeb7"
alias "asmdata03"
}
multipath {
wwid "VBOX_HARDDISK_VBb02983a4-8d191e4f"
alias "asmarch01"
}
}
2.3.1 直接粘贴落地(heredoc 方式)
同一份内容也可以整段 cat > 覆盖,不用 vi 手敲。要点是定界符必须加单引号 'EOF',否则 shell 会展开 $、反引号和转义,配置被悄悄改掉:
# 1) 先备份(cat > 是整体覆盖,没有后悔余地)
cp -a /etc/multipath.conf /etc/multipath.conf.bak.$(date +%F_%T)
# 2) 整段粘贴。注意 <<'EOF' 带引号,且每行缩进按原样保留
cat > /etc/multipath.conf <<'EOF'
defaults {
find_multipaths no
user_friendly_names no
path_grouping_policy multibus
path_selector "service-time 0"
path_checker tur
checker_timeout 15
polling_interval 10
failback immediate
no_path_retry fail
queue_without_daemon no
flush_on_last_del yes
max_fds max
detect_prio no
uid "500"
gid "54321"
mode "0660"
}
blacklist {
devnode "^(ram|zram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"
devnode "^hd[a-z]"
devnode "^vd[a-z]"
wwid "VBOX_HARDDISK_VBfd03285d-460bcb9e"
wwid "VBOX_HARDDISK_VBbef8357d-8d2d8b87"
}
devices {
device {
vendor "ATA"
product "VBOXHARDDISK"
path_grouping_policy multibus
path_checker tur
no_path_retry fail
features "0"
hardware_handler "0"
}
}
multipaths {
multipath {
wwid "VBOX_HARDDISK_VB78f24c9c-81b5a323"
alias "asmocr01"
}
multipath {
wwid "VBOX_HARDDISK_VB9e185111-851fa9f6"
alias "asmdata01"
}
multipath {
wwid "VBOX_HARDDISK_VBfe936f89-6e4b70ac"
alias "asmdata02"
}
multipath {
wwid "VBOX_HARDDISK_VBc5405f15-edfbaeb7"
alias "asmdata03"
}
multipath {
wwid "VBOX_HARDDISK_VBb02983a4-8d191e4f"
alias "asmarch01"
}
}
EOF
# 3) 落地后三件事:编码/换行、语法、生效值
grep -c $'\r' /etc/multipath.conf # 期望 0,非 0 说明被 CRLF 污染
multipath -t 2>&1 | grep -iE 'invalid|missing|ignoring|unknown' # 期望空
multipath -t | grep -E 'find_multipaths|user_friendly_names|alias|uid|gid|mode'
粘贴时的四个坑:
| 坑 | 现象 | 处置 |
|---|---|---|
用了不带引号的 << EOF | $、反引号被 shell 展开,配置内容被改 | 一律用 <<'EOF' |
| 从 Windows 终端粘贴进 CRLF | ^M 混入行尾,multipathd 报 invalid keyword / 关键字后多出乱码 | sed -i 's/\r$//' /etc/multipath.conf,再 grep -c $'\r' 复核 |
| heredoc 内容被缩进/去缩进 | 行首空格变化本身无碍(conf 不敏感),但 alias 或 wwid 后多出尾随空格会匹配失败 | cat -A 看行尾,删掉多余空格 |
uid/gid 直接照抄模板数字 | 属组与 OSDBA 不符,map 建出来属组不对 | 先 id -u grid、getent group asmdba 取实际值再粘 |
cat > 与 vi 两种方式等价,区别只在:cat > 是整体覆盖(多余的历史段落会被清掉,这反而是好事,能避免“两个 defaults 块”这类残留),而 vi 容易改漏。
三条硬性书写规则
multipath { }块内每个关键字独占一行,multipath { wwid "..." alias "..." }单行写法解析器不认;- 全文件只能有一个
defaults块; - wwid 字符串必须与
multipath -ll输出完全一致(本环境不带1ATA_前缀)。
2.4 生效与校验
# 1. 解析干净
multipath -t 2>&1 | grep -iE 'invalid|missing|ignoring|unknown' # 期望输出为空
multipath -t | grep -E 'alias|uid|gid|mode'
# 2. 权限只在建 map 时写入,已有 map 需重建
for m in asmocr01 asmdata01 asmdata02 asmdata03 asmarch01; do multipath -f $m 2>/dev/null; done
systemctl restart multipathd
systemctl enable multipathd
systemctl status multipathd
# 3. 结果核对
multipath -ll
ls -l /dev/mapper/asm*
stat -Lc '%a %U %G %n' /dev/mapper/asm* # 必须解析到真实 dm 节点
ls -lL /dev/mapper/asmocr01 # 软链自身恒为 root root,要看目标
# 4. 两节点一致性(dm-N 编号不要求相同,名字+wwid 必须相同)
multipath -ll | awk '/^asm/{print $1,$2}' | sort > /tmp/mp.$(hostname)
diff /tmp/mp.fmsbzdb1 /tmp/mp.fmsbzdb2
期望形态:
asmocr01 (VBOX_HARDDISK_VB78f24c9c-81b5a323) dm-1 ATA,VBOX HARDDISK
size=10G features='0' hwhandler='0' wp=rw
`-+- policy='service-time 0' prio=1 status=active
`- 3:0:0:0 sdb 8:16 active ready running
2.5 与 ASM 对接
# 发现串必须指 alias 路径,不能再写 /dev/asm*
export ASM_DISKSTRING='/dev/mapper/asm*'
kfod ds=true disks=asm numdg=false ASM_DISKSTRING='/dev/mapper/asm*'
# grid 用户实际打开一块盘(属组验证的终局判据)
su - grid -c 'dd if=/dev/mapper/asmocr01 of=/dev/null bs=1024k count=1'
GI 静默响应文件同步修改:
oracle.install.asm.diskGroup.diskDiscoveryString=/dev/mapper/asm*
oracle.install.asm.diskGroup.disks=/dev/mapper/asmocr01,/dev/mapper/asmdata01,/dev/mapper/asmdata02,/dev/mapper/asmdata03,/dev/mapper/asmarch01
3. 方案 B:udev 软链
3.1 规则文件(现场原始版本)
cat > /etc/udev/rules.d/99-oracle-asm.rules <<'EOF'
KERNEL=="sd*",SUBSYSTEM=="block",ENV{DEVTYPE}=="disk",ENV{ID_SERIAL}=="VBOX_HARDDISK_VB78f24c9c-81b5a323",SYMLINK+="asmocr01",OWNER="grid",GROUP="asmadmin",MODE="0660"
KERNEL=="sd*",SUBSYSTEM=="block",ENV{DEVTYPE}=="disk",ENV{ID_SERIAL}=="VBOX_HARDDISK_VB9e185111-851fa9f6",SYMLINK+="asmdata01",OWNER="grid",GROUP="asmadmin",MODE="0660"
KERNEL=="sd*",SUBSYSTEM=="block",ENV{DEVTYPE}=="disk",ENV{ID_SERIAL}=="VBOX_HARDDISK_VBfe936f89-6e4b70ac",SYMLINK+="asmdata02",OWNER="grid",GROUP="asmadmin",MODE="0660"
KERNEL=="sd*",SUBSYSTEM=="block",ENV{DEVTYPE}=="disk",ENV{ID_SERIAL}=="VBOX_HARDDISK_VBc5405f15-edfbaeb7",SYMLINK+="asmdata03",OWNER="grid",GROUP="asmadmin",MODE="0660"
KERNEL=="sd*",SUBSYSTEM=="block",ENV{DEVTYPE}=="disk",ENV{ID_SERIAL}=="VBOX_HARDDISK_VBb02983a4-8d191e4f",SYMLINK+="asmarch01",OWNER="grid",GROUP="asmadmin",MODE="0660"
EOF
cat /etc/udev/rules.d/99-oracle-asm.rules
规则文件同样用 heredoc 落地即可(上面就是现成命令)。定界符必须写
<<'EOF';粘贴后先grep -c $'\r' /etc/udev/rules.d/99-oracle-asm.rules应为 0,否则规则里的ID_SERIAL尾随 CR 后永不命中,表现为”软链死活不出现、udevadm test也看不出错”。
3.2 生效与校验
udevadm control --reload-rules
udevadm trigger --type=devices --action=change
udevadm settle
ls -l /dev/asm* # 软链存在且指向对应 sd
ls -lL /dev/asmocr01 # 属主属组要看解析后的真实节点
udevadm test /sys/block/sdb # 不生成软链时,看规则是否命中
udevadm info --query=env --name=/dev/sdb | grep ID_SERIAL
3.3 三个必须知道的细节
ID_SERIAL不带1ATA_前缀udevadm info --query=env/multipath -ll里是VBOX_HARDDISK_VB78f24c9c-.../usr/lib/udev/scsi_id -g -u输出的是1ATA_VBOX_HARDDISK_VB78f24c9c-...- 写 udev 规则和写
multipath.conf的wwid都用不带前缀的那种;带1ATA_只在排查时参考。
- 必须带
ENV{DEVTYPE}=="disk"
不加会连分区(sdb1)一起匹配,软链指向分区而不是整盘,ASM 拒用。 GROUP必须是 OSDBA 组
现场片段写的是asmadmin,而本方案 multipath 用的是asmdba。二者只取其一,判定依据是安装时-OSDBA的取值:id grid | tr ',' '\n' | grep -E 'asmadmin|asmdba'对不上会在 GI 安装的 CVU 前置检查里报PRVF-9992 Group of device ... did not match the expected group,属 FATAL。
3.4 局限
- 只是软链,不提供任何冗余;单路径设备出问题没有第二条路可切;
- wwid 一变(重建/克隆 VMDK)→ 规则静默不命中,
/dev/asm*直接消失,ASM 报ORA-15031; - 与 multipath 叠加会造成“同一块盘两个入口”,
ASM_DISKSTRING混写会让同一个盘被发现两次。
4. 排错实录(按时间线)
| # | 现象 | 根因 | 处置 |
|---|---|---|---|
| 1 | multipathd 启动日志:ignoring extra data starting with 'wwid'、invalid keyword in the multipath section: multipath、missing '}' at end | multipath { wwid "..." alias "..." } 单行写法,parser 按行解析,关键字必须独占一行 | multipaths 段改为多行块 |
| 2 | 配置里出现两个 defaults 块 | 拷贝叠加,后块覆盖前块同名项,容易改错块 | 合并为一个 defaults |
| 3 | blacklist { } 为空 + find_multipaths yes | 本地 vmdk/系统盘会被建图;单路径设备可能漏建,两节点不一致 | find_multipaths no + 显式 blacklist |
| 4 | user_friendly_names yes | 名字取自本机 /etc/multipath/bindings,两节点 mpathX 编号不同 | 改 no,用 alias |
| 5 | 配了 alias 但 multipath -ll 里仍显示 VBOX_HARDDISK_VB... 长名 | multipathd 内部 wwid 不带 1ATA_ 前缀,conf 里写了 1ATA_VBOX_...,一条都匹配不上,alias 静默失效 | wwid 全部去掉 1ATA_ 前缀,与 multipath -ll 输出对齐 |
| 6 | db2 系统盘仍被建图/未排除 | blacklist 里 wwid 抄错(多了一个 b:VBbeb8357d ≠ VBbef8357d) | 按实测 scsi_id 原样粘贴,别手抄 |
| 7 | 设备节点属组是 root:disk,grid 打不开 | 未设 uid/gid/mode;直接 chown 在 map 重建后会丢;把 grid 加进 disk 组又会触发 PRVF-9992 | multipath.conf 里 uid/gid/mode 设成 grid + OSDBA 组,重建 map 生效 |
| 8 | lsof +D /dev/mapper 只有 multipathd 自己 | 5 个 map 均未被占用,可安全重建 | 直接 multipath -f + restart |
| 9 | db2 的 asmocr01 曾在 sda,后变为 sdb;asmdata02/03 的 sdd/sde 互换 | VirtualBox 端口枚举顺序在两次开机间变化 | 正是不能依赖 sdx 的证据;全部锚定 wwid |
| 10 | yum install device-mapper 后仍找不到 multipathd | 该包只提供 libdevmapper/dmsetup | 补装 device-mapper-multipath |
| 11 | modprobe dm-round-robin 报 Module not found | round-robin 选择器编在 dm_multipath 内 | 忽略,改看 lsmod | grep dm_multipath、dmsetup targets |
| 12 | 执行 mpathconf --enable 后 find_multipaths/user_friendly_names 变成 yes | 该命令会补写默认配置 | 先备份、执行后回改;或直接 systemctl enable --now multipathd |
5. 关键参数速查
| 参数 | 本环境取值 | 含义 / 选型理由 |
|---|---|---|
find_multipaths | no | 所有未被 blacklist 的设备都建图(含单路径)。集群里必须显式定死,别让它“猜” |
user_friendly_names | no | 不用本机 bindings;名字只由 alias / wwid 决定,天然两节点一致 |
alias | asmocr01 等 | 写在 multipaths 块,与 wwid 绑定;命名一旦进入 ASM 元数据就不可再改 |
path_grouping_policy | multibus | 一条 group 含所有路径;单路径环境等价于无策略 |
path_selector | service-time 0 | 按待处理 I/O 量选路;rr_weight 只对 round-robin 系列有效,配 service-time 时无效 |
path_checker | tur | SCSI Test Unit Ready;虚拟盘 TUR 异常时退 directio |
no_path_retry | fail | 给 ASM 用:立即报错,交给 ASM 做 offlining,避免内核队列挂死导致节点假死。普通文件系统场景才用 features "1 queue_if_no_path" + no_path_retry 12 |
queue_without_daemon | no | multipathd 停止时不挂队列 |
dev_loss_tmo / fast_io_fail_tmo | 未设置 | ATA 单路径无 fabric 层,这两个超时无实际作用;FC 场景才需设(fast_io_fail_tmo 5 + dev_loss_tmo 60~120,后者必须大于前者) |
uid / gid / mode | grid / asmdba gid / 0660 | 在建 map 时写入 dm 节点;已有 map 需重建才生效 |
6. 验收清单
| 检查项 | 命令 | 期望 |
|---|---|---|
| 软件包齐 | rpm -qa | grep -i multipath | 有 device-mapper-multipath |
| 模块加载 | lsmod | grep dm_multipath | 有输出 |
| target 注册 | dmsetup targets | grep multipath | 有 multipath |
| 配置无语法错 | multipath -t 2>&1 | grep -iE 'invalid|missing|ignoring' | 空 |
| 5 个 map、名字是 alias | multipath -ll | asmocr01 / asmdata01-03 / asmarch01,各 1 条 active ready running |
| 两节点一致 | multipath -ll | awk '/^asm/{print $1,$2}' | sort | 两节点逐行相同 |
| 系统盘未建图 | multipath -c /dev/sda(各自系统盘) | blacklisted |
| 属组 = OSDBA | stat -Lc '%a %U %G %n' /dev/mapper/asm* | 660 grid asmdba |
| grid 可打开 | su - grid -c 'dd if=/dev/mapper/asmocr01 of=/dev/null bs=1M count=1' | 成功读完 |
| ASM 可见 | kfod ds=true disks=asm numdg=false ASM_DISKSTRING='/dev/mapper/asm*' | 5 块盘名/容量一致 |
| 服务开机自启 | systemctl is-enabled multipathd | enabled |
7. 运维红线
- wwid 会变:VirtualBox VMDK 的序列号来自磁盘 UUID,
clonemedium、重建盘、cp后改 UUID 都会变 → alias 静默不生成、ASM 报ORA-15031。扩容/重建盘后必须重取 wwid 并同步两节点 conf。 - alias 不可改:一旦 ASM 用
/dev/mapper/asmocr01建了磁盘组,改别名等于改路径,必须走“停库 → dismount → 改配置 → 重挂”的完整流程。 - 改名前先验证占用:
lsof +D /dev/mapper、lsblk -o NAME,MOUNTPOINT、pvs -o pv_name,vg_name;被占用时先停库/卸卷组。 - 两节点 conf 必须 diff 为空:
diff /etc/multipath.conf,否则一个节点的 alias 生效、另一个不生效,最隐蔽但也最难查。 - 不要
chown手动改权限:map 一重建就丢;也不要为了省事把 grid 加进disk组,GI 前置检查PRVF-9992会挡住。 - 保留现场:变更前留
cp -a /etc/multipath.conf、multipath -ll > /tmp/multipath.$(date +%F)、lsblk -o NAME,SIZE,MODEL,SERIAL三份基线。
8. 命令速查
# 盘识别
for d in /dev/sd*[!0-9]; do printf '%-8s %s\n' "$d" "$(/usr/lib/udev/scsi_id -g -u -d $d 2>/dev/null)"; done
udevadm info --query=property --name=/dev/sdb | grep -E 'ID_SERIAL|ID_WWN'
# multipath
systemctl status|restart|enable multipathd
multipath -t # 实际生效配置
multipath -ll # map 与路径
multipath -c /dev/sdb # 该设备是否被 blacklist
multipath -f <alias> # 删除单个 map(重建权限用)
multipathd show paths format "%d %w %s" # daemon 侧的 path/wwid 状态
# 权限与占用
stat -Lc '%a %U %G %n' /dev/mapper/asm*
ls -lL /dev/mapper/asmocr01
lsof +D /dev/mapper 2>/dev/null
# ASM
export ASM_DISKSTRING='/dev/mapper/asm*'
kfod ds=true disks=asm numdg=false
8.1 盘识别脚本:两种写法的区别
脚本 A —— sysfs 直读版
for d in /dev/sd*[!0-9]; do
printf '%-7s vendor=%-12s product=%-16s wwid=%s\n' "$d" \
"$(cat /sys/block/${d#/dev/}/device/vendor 2>/dev/null)" \
"$(cat /sys/block/${d#/dev/}/device/model 2>/dev/null)" \
"$(cat /sys/block/${d#/dev/}/device/wwid 2>/dev/null)"
done
特点:完全不依赖 udev 工具链,rescue/最小化镜像也能跑;wwid 取的是内核上报的原始标识。
脚本 B —— scsi_id 版(带守卫与去空格)
for d in /dev/sd*[!0-9]; do
[ -b "$d" ] || continue
printf '%-8s vendor=%-10s model=%-14s wwid=%s\n' "$d" \
"$(cat /sys/block/${d#/dev/}/device/vendor 2>/dev/null | tr -d ' ')" \
"$(cat /sys/block/${d#/dev/}/device/model 2>/dev/null | tr -d ' ')" \
"$(/usr/lib/udev/scsi_id -g -u -d $d 2>/dev/null)"
done
差异对照
| 差异点 | 脚本 A(sysfs 版) | 脚本 B(scsi_id 版) | 影响 |
|---|---|---|---|
| wwid 来源 | 内核 sysfs device/wwid | /usr/lib/udev/scsi_id -g -u | 最关键差异,两者形态完全不同 |
| wwid 形态 | FC/iSCSI:naa.6000...;SATA:t10.ATA_____<model>___<serial> | FC/iSCSI:剥掉 naa. 的裸串;SATA:1ATA_<model>_<serial> | 都不能直接写进 multipath.conf |
| 能否写进 conf | ❌ 带 naa./t10. 前缀,一定不匹配 | ❌ 带 1ATA_ 前缀,本环境已实测失效 | 写 conf 只能取 multipath -ll / multipathd show paths 的串 |
| 依赖 | 无外部命令 | 需要 udev 包里的 scsi_id | 最小化镜像/救援模式选 A |
| vendor/model 尾随空格 | 未处理,sysfs 定长补空格会跟着 %-12s 一起打出 | tr -d ' ' 去掉 | 影响输出可读性与”复制粘贴干净度” |
| 设备存在性校验 | 无,设备消失时静默输出空行 | [ -b ] 跳过非块设备 | 采集/脚本化场景 B 更稳 |
| 列宽 | %-7s/%-12s/%-16s | %-8s/%-10s/%-14s | 纯对齐差异,无功能影响 |
同一个盘的三串 wwid(本环境实测)
| 来源 | 实测值 | 用途 |
|---|---|---|
sysfs device/wwid | 形如 t10.ATA_____VBOX_HARDDISK___VB78f24c9c-81b5a323(下划线数随 model 定长补位) | 核对”这块盘到底是谁”,跨机比对硬件标识 |
scsi_id -g -u | 1ATA_VBOX_HARDDISK_VB78f24c9c-81b5a323 | 仅作交叉参考 |
multipath -ll / udev ID_SERIAL | VBOX_HARDDISK_VB78f24c9c-81b5a323 | 写 multipath.conf 的 wwid/blacklist/alias 与 udev 规则 ENV{ID_SERIAL} 都用这串 |
口诀:sysfs 是”硬件真名”,scsi_id 是”工具别名”,multipath -ll 才是”配置口径”。 FC 环境最容易犯的错就是把 sysfs 的 naa. 串直接粘进 conf —— 100% 不匹配,且没有任何报错。
推荐合并版(排查时一条命令看全)
for d in /dev/sd*[!0-9]; do
[ -b "$d" ] || continue
k=${d#/dev/}
printf '%-6s %-9s %-16s | sysfs=%-48s | scsi_id=%s\n' \
"$d" \
"$(cat /sys/block/$k/device/vendor 2>/dev/null | tr -d ' ')" \
"$(cat /sys/block/$k/device/model 2>/dev/null | tr -d ' ')" \
"$(cat /sys/block/$k/device/wwid 2>/dev/null)" \
"$(/usr/lib/udev/scsi_id -g -u -d $d 2>/dev/null)"
done
# 权威口径:daemon 自己认的 wwid(直接抄进 conf 用这个)
multipathd -k'show paths format "%d %w %s"' 2>/dev/null || multipath -ll
取不到 wwid 时(输出为空)先怀疑三件事:设备被 blacklist、虚拟盘未开 disk.EnableUUID、或该路径已被别的多路径软件接管。

徐万新之路

