正德厚生,臻于至善

Oracle Linux 8上 Oracle ASM 共享盘命名方案 —— multipath 与 udev 两种实现

环境: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 sddb2 sd
asmocr0110GVBOX_HARDDISK_VB78f24c9c-81b5a323sdbsdb
asmdata0130GVBOX_HARDDISK_VB9e185111-851fa9f6sdcsdc
asmdata0230GVBOX_HARDDISK_VBfe936f89-6e4b70acsddsde
asmdata0330GVBOX_HARDDISK_VBc5405f15-edfbaeb7sdesdd
asmarch0120GVBOX_HARDDISK_VBb02983a4-8d191e4fsdfsdf

0.2 各节点独有盘(系统盘,必须排除)

节点wwid说明
fmsbzdb1VBOX_HARDDISK_VBfd03285d-460bcb9e系统盘,不参与 ASM
fmsbzdb2VBOX_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 的理由

  1. 单路径设备 multipath 同样会建图(find_multipaths no),命名与权限都在一份 multipath.conf 里闭环,不依赖任何 udev 规则文件;
  2. 后续若换到真多路径存储(FC/iSCSI/RDM),配置结构不用重写;
  3. 少一处需要同步的 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 容易改漏。

三条硬性书写规则

  1. multipath { } 块内每个关键字独占一行,multipath { wwid "..." alias "..." } 单行写法解析器不认;
  2. 全文件只能有一个 defaults 块;
  3. 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 三个必须知道的细节

  1. 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_ 只在排查时参考。
  2. 必须带 ENV{DEVTYPE}=="disk"
    不加会连分区(sdb1)一起匹配,软链指向分区而不是整盘,ASM 拒用。
  3. 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. 排错实录(按时间线)

#现象根因处置
1multipathd 启动日志:ignoring extra data starting with 'wwid'、invalid keyword in the multipath section: multipath、missing '}' at endmultipath { wwid "..." alias "..." } 单行写法,parser 按行解析,关键字必须独占一行multipaths 段改为多行块
2配置里出现两个 defaults 块拷贝叠加,后块覆盖前块同名项,容易改错块合并为一个 defaults
3blacklist { } 为空 + find_multipaths yes本地 vmdk/系统盘会被建图;单路径设备可能漏建,两节点不一致find_multipaths no + 显式 blacklist
4user_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 输出对齐
6db2 系统盘仍被建图/未排除blacklist 里 wwid 抄错(多了一个 b:VBbeb8357d ≠ VBbef8357d)按实测 scsi_id 原样粘贴,别手抄
7设备节点属组是 root:disk,grid 打不开未设 uid/gid/mode;直接 chown 在 map 重建后会丢;把 grid 加进 disk 组又会触发 PRVF-9992multipath.conf 里 uid/gid/mode 设成 grid + OSDBA 组,重建 map 生效
8lsof +D /dev/mapper 只有 multipathd 自己5 个 map 均未被占用,可安全重建直接 multipath -f + restart
9db2 的 asmocr01 曾在 sda,后变为 sdb;asmdata02/03 的 sdd/sde 互换VirtualBox 端口枚举顺序在两次开机间变化正是不能依赖 sdx 的证据;全部锚定 wwid
10yum install device-mapper 后仍找不到 multipathd该包只提供 libdevmapper/dmsetup补装 device-mapper-multipath
11modprobe dm-round-robin 报 Module not foundround-robin 选择器编在 dm_multipath 内忽略,改看 lsmod | grep dm_multipath、dmsetup targets
12执行 mpathconf --enable 后 find_multipaths/user_friendly_names 变成 yes该命令会补写默认配置先备份、执行后回改;或直接 systemctl enable --now multipathd

5. 关键参数速查

参数本环境取值含义 / 选型理由
find_multipathsno所有未被 blacklist 的设备都建图(含单路径)。集群里必须显式定死,别让它“猜”
user_friendly_namesno不用本机 bindings;名字只由 alias / wwid 决定,天然两节点一致
aliasasmocr01 等写在 multipaths 块,与 wwid 绑定;命名一旦进入 ASM 元数据就不可再改
path_grouping_policymultibus一条 group 含所有路径;单路径环境等价于无策略
path_selectorservice-time 0按待处理 I/O 量选路;rr_weight 只对 round-robin 系列有效,配 service-time 时无效
path_checkerturSCSI Test Unit Ready;虚拟盘 TUR 异常时退 directio
no_path_retryfail给 ASM 用:立即报错,交给 ASM 做 offlining,避免内核队列挂死导致节点假死。普通文件系统场景才用 features "1 queue_if_no_path" + no_path_retry 12
queue_without_daemonnomultipathd 停止时不挂队列
dev_loss_tmo / fast_io_fail_tmo未设置ATA 单路径无 fabric 层,这两个超时无实际作用;FC 场景才需设(fast_io_fail_tmo 5 + dev_loss_tmo 60~120,后者必须大于前者)
uid / gid / modegrid / 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、名字是 aliasmultipath -llasmocr01 / asmdata01-03 / asmarch01,各 1 条 active ready running
两节点一致multipath -ll | awk '/^asm/{print $1,$2}' | sort两节点逐行相同
系统盘未建图multipath -c /dev/sda(各自系统盘)blacklisted
属组 = OSDBAstat -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 multipathdenabled

7. 运维红线

  1. wwid 会变:VirtualBox VMDK 的序列号来自磁盘 UUID,clonemedium、重建盘、cp 后改 UUID 都会变 → alias 静默不生成、ASM 报 ORA-15031。扩容/重建盘后必须重取 wwid 并同步两节点 conf。
  2. alias 不可改:一旦 ASM 用 /dev/mapper/asmocr01 建了磁盘组,改别名等于改路径,必须走“停库 → dismount → 改配置 → 重挂”的完整流程。
  3. 改名前先验证占用:lsof +D /dev/mapper、lsblk -o NAME,MOUNTPOINT、pvs -o pv_name,vg_name;被占用时先停库/卸卷组。
  4. 两节点 conf 必须 diff 为空:diff /etc/multipath.conf,否则一个节点的 alias 生效、另一个不生效,最隐蔽但也最难查。
  5. 不要 chown 手动改权限:map 一重建就丢;也不要为了省事把 grid 加进 disk 组,GI 前置检查 PRVF-9992 会挡住。
  6. 保留现场:变更前留 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 -u1ATA_VBOX_HARDDISK_VB78f24c9c-81b5a323仅作交叉参考
multipath -ll / udev ID_SERIALVBOX_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、或该路径已被别的多路径软件接管。

赞(0) 打赏
未经允许不得转载:徐万新之路 » Oracle Linux 8上 Oracle ASM 共享盘命名方案 —— multipath 与 udev 两种实现

支持快讯、专题、百度收录推送、人机验证、多级分类筛选器,适用于垂直站点、科技博客、个人站,扁平化设计、简洁白色、超多功能配置、会员中心、直达链接、文章图片弹窗、自动缩略图等...

联系我们

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续提供更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册