asm在使用磁盘时一般不会直接使用初始的磁盘路径,asm对磁盘的权限非常敏感,一般asm磁盘权限是grid:asmadmin,且grid用户必须在asmadmin组中,特殊环境甚至oracle也需要在asmadmin组中。如何稳定磁盘权限(比如主机重启后磁盘权限不改变),稳定磁盘路径与磁盘唯一标志scsi id对应(盘符改变会导致asm无法启动)是至关重要的。这个时候就需要用到multipath和udev。
raw绑定在以前是经常使用的,绑定方式也较为简单,但是磁盘权限仍然会有变化的情况,而且技术过久,基本被udev替换了。
multipath是linux中用来生成多路径的工具,当一条链路不稳定时,可自动切换到另一条链路。multipath也可以绑定磁盘。在/etc/multipath.conf中写明这样的文件表示设备scsi id和设备路径形成绑定
multipaths {
multipath {
wwid "360050xxxxxxxxxxx00000000010cb"
alias asm01
multipath {
wwid "36005xxxxxxxxxxxxx000000010db"
alias asm17
}
}
scsi id就是wwid。alias在/dev/mapper/下。可用以下命令识别scsi id
/usr/lib/udev/scsi_id -g -u -d /dev/mapper/asm01
启动multipath
systemctl start multipathd
查看multipath
systemctl status multipathd --查看mutipath的状态,是否在运
multipath -ll --可看到multipath的详细信息
asm08 (360050768018xxxxx00010d2) dm-17 IBM ,2145
size=512G features='1 queue_if_no_path' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=50 status=active
| `- 0:0:3:7 sdac 65:192 active ready running
`-+- policy='service-time 0' prio=10 status=enabled
|- 0:0:2:7 sdm 8:192 active ready running
|- 2:0:0:7 sdas 66:192 active ready running
`- 2:0:1:7 sdbi 67:192 active ready running
比如上面的信息就是通过multipath -ll来查看。
从上面的信息可以看出,multipath生成了2个路径,一个asm08 ,一个dm-17。asm08是link,指向dm-17,dm-17是block设备。
[root@xxx ~]# ls -lrt /dev/mapper/asm08
lrwxrwxrwx 1 root root 8 Jun 15 15:15 /dev/mapper/asm08 -> ../dm-17
[root@xxx ~]# ls -lrt /dev/dm-17
brw-rw---- 1 grid asmadmin 253, 17 Jun 15 15:15 /dev/dm-17
本质上说/dev/mapper/asm08和/dev/dm-17实际上指向的同一个设备
[root@xx ~]# /usr/lib/udev/scsi_id -g -u -d /dev/mapper/asm08
360050768xxx000000010d2
[root@xx ~]# /usr/lib/udev/scsi_id -g -u -d /dev/dm-17
360050768xxx000000010d2
360050768xxx000000010d2这个设备由sdac,sdm,sdas,sdbi组成。
udev也是常见的磁盘绑定工具,需要在udev规则中写明磁盘绑定的规则,并使其生效
比如如下做法:
[root@xxx ~]# cat /etc/udev/rules.d/99-oracle-asmdevices.rules
KERNEL=="dm-*",ENV{DM_UUID}=="mpath-36005076xxx000000000010cb",SYMLINK+="asm/hdisk001",OWNER="grid",GROUP="asmadmin",MODE="0660"
KERNEL=="dm-*",ENV{DM_UUID}=="mpath-36005076xxx000000000010cc",SYMLINK+="asm/hdisk002",OWNER="grid",GROUP="asmadmin",MODE="0660"
KERNEL=="dm-*",ENV{DM_UUID}=="mpath-36005076xxx000000000010cd",SYMLINK+="asm/hdisk003",OWNER="grid",GROUP="asmadmin",MODE="0660"
udev规则中写明了绑定源路径dm-*,绑定磁盘的scsi id,绑定目标路径/dev/asm/hdisk00x,目标路径属组grid:asmadmin,目标路径权限0660
[root@ybnode01 ~]# ls -lrt /dev/asm/hdisk0*
lrwxrwxrwx 1 root root 7 Jun 15 15:31 /dev/asm/hdisk017 -> ../dm-2
lrwxrwxrwx 1 root root 8 Jun 15 15:31 /dev/asm/hdisk002 -> ../dm-13
[root@ybnode01 ~]# ls -lrt /dev/dm*
brw-rw---- 1 grid asmadmin 253, 2 Jun 15 15:34 /dev/dm-2
brw-rw---- 1 grid asmadmin 253, 13 Jun 15 15:34 /dev/dm-13
注意:udev绑定源路径权限不变,绑定目标路径/dev/asm/hdisk*的权限是root:root 777,link到dm下。在rhel7中,用udev绑定磁盘后,就算udev规则中写明了权限,但目标路径权限仍然是root:root 777。在rhel6中,其权限如udev规则中的一致,grid:asmadmin 0660。
在multipath中绑定了scsi id,在udev中再次绑定显得有些多余(但最好是这么做),在scsi id已绑定的前提下,udev可以有如下绑定方式:
[root@xxx ~]# cat /etc/udev/rules.d/12-dm-permissions.rules
ENV{DM_NAME}=="dm*",OWNER:="grid", GROUP:="asmadmin", MODE:="660"
这种绑定方式没有在udev规则中绑定磁盘路径与磁盘scsi id,没有生成额外的路径,仅修改了/dev/dm*的权限。这里的udev规则只是用来绑定磁盘权限,数据库可直接使用dm*
还有个做法是在multipath.conf 中不写明wwid和alias的对应关系,只在udev中绑定源路径dm,目标路径,scsi id,权限。
虽然这种方法有效,但是很难理解。如果multipath不生成dm,那也轮不到udev去绑定,所以udev一定在multipath之后,multipath没有绑定scsi id,那么是不是可能会multipath在启动的时候把scsi id识别错了,这个时候udev在去绑定scsi id和dm。所以我个人并不推荐这种绑定方式。
不同的工程师有不同的做法,但无论哪种绑定方式,最终的目的就把磁盘路径和scsi id绑定,且绑定asm要使用的asm_disk的path的权限。理解multipath和udev才可以处理异常状况。