對於使用ASM管理的磁盤來說,需要一種能夠用於一致性標識磁盤設備及其正確的所屬關系和權限的手段。在Linux系統中,可以使用ASMLib來執行這項任務,但是這樣做的缺點是在操作系統上增加了額外的一層,從而導致了管理的復雜性,使用ASMLib配置ASM的方式現在已經不再流行。
一種替代的解決方案是:使用Linux設備管理器“udev”來完成這項任務。自2.6內核開始,就可以使用udev協助管理系統中各設備名稱,udev能動態地在/dev目錄里產生自定義的、標識性強的設備文件或設備鏈接。本文概述了如何使用UDEV規則來配置ASM磁盤。
從本質上來說,UDEV是一種對已定義好的規則的應用,這個規則以文件的形式保存在“/etc/udev/rules.d”目錄下。規則的定義可以采用多種方式,我們需要做的是確定設備以及說明希望UDEV用它做什么。眾所周知,所有的磁盤設備才采用“/dev/sd?1”的形式命名,所以我們可以使用以下的規則參數來標識設備:
KERNEL=="sd?1",BUS=="scsi"
為每一個磁盤起一個別名,使其總是以一種一致的方式被標識,而不管Linux為它分配何種設備名。所以在此之前需要進行一項測試,以確定該磁盤是否就是配置ASM所需要的磁盤。測試的原理是:由於每個磁盤都有一個唯一的SCSI ID,可將是否匹配這個ID作為測試規則。下列規則參數解釋了如何進行這種測試匹配:
#OL5中,測試規則如下: PROGRAM=="/sbin/scsi_id -g -u -s /block/$parent", RESULT=="SATA_VBOX_HARDDISK_VBd306dbe0-df3367e3_" #在OL6中scsi_id命令稍有不同,測試規則如下: PROGRAM=="/sbin/scsi_id -g -u -d /dev/$parent", RESULT=="SATA_VBOX_HARDDISK_VBd306dbe0-df3367e3_" #在OL7中,scsi_id命令被置於不同的路徑下,測試規則如下: PROGRAM=="/usr/lib/udev/scsi_id -g -u -d /dev/$parent", RESULT=="SATA_VBOX_HARDDISK_VBd306dbe0-df3367e3_"
一旦能夠明確標識指定的磁盤后,我們就可以指示在磁盤上的執行的動作,下列的udev參數為磁盤指定了一個別名、磁盤的所屬關系以及權限:
NAME="asm-disk1", OWNER="oracle", GROUP="dba", MODE="0660"
綜上所述,對於一個磁盤來說,完整的udev規則定義如下:
#OL5 KERNEL=="sd?1", BUS=="scsi", PROGRAM=="/sbin/scsi_id -g -u -s /block/$parent", RESULT=="SATA_VBOX_HARDDISK_VBd306dbe0-df3367e3_", NAME="asm-disk1", OWNER="oracle", GROUP="dba", MODE="0660" #OL6 KERNEL=="sd?1", BUS=="scsi", PROGRAM=="/sbin/scsi_id -g -u -d /dev/$parent", RESULT=="SATA_VBOX_HARDDISK_VBd306dbe0-df3367e3_", NAME="asm-disk1", OWNER="oracle", GROUP="dba", MODE="0660" #OL7 KERNEL=="sd?1", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d /dev/$parent", RESULT=="SATA_VBOX_HARDDISK_VBd306dbe0-df3367e3_", SYMLINK+="asm-disk1", OWNER="oracle", GROUP="dba", MODE="0660"
這意味着指向磁盤“sd*1”分區與“SATA_VBOX_HARDDISK_VBd306dbe0-df3367e3_”的SCSI ID總是被稱為“/dev/asm-disk1”,不管Linux為“?”分配何種字符。此外,該設備將有正確的所屬關系和權限。
接下來需要繼續在剩下的磁盤上(注意是磁盤不是分區)使用scsi_id命令生成SCSI ID:
##OL5 /sbin/scsi_id -g -u -s /block/sdb SATA_VBOX_HARDDISK_VBd306dbe0-df3367e3_ /sbin/scsi_id -g -u -s /block/sdc SATA_VBOX_HARDDISK_VB46dec7e0-192e8000_ /sbin/scsi_id -g -u -s /block/sdd SATA_VBOX_HARDDISK_VBce8c63bb-ac67a172_ /sbin/scsi_id -g -u -s /block/sde SATA_VBOX_HARDDISK_VB7437a3b7-95b199cd_ ##OL6 /sbin/scsi_id -g -u -d /dev/sdb SATA_VBOX_HARDDISK_VBd306dbe0-df3367e3_ /sbin/scsi_id -g -u -d /dev/sdc SATA_VBOX_HARDDISK_VB46dec7e0-192e8000_ /sbin/scsi_id -g -u -d /dev/sdd SATA_VBOX_HARDDISK_VBce8c63bb-ac67a172_ /sbin/scsi_id -g -u -d /dev/sde SATA_VBOX_HARDDISK_VB7437a3b7-95b199cd_ ##OL7: /usr/lib/udev/scsi_id -g -u -d /dev/sdb SATA_VBOX_HARDDISK_VBd306dbe0-df3367e3_ /usr/lib/udev/scsi_id -g -u -d /dev/sdc SATA_VBOX_HARDDISK_VB46dec7e0-192e8000_ /usr/lib/udev/scsi_id -g -u -d /dev/sdd SATA_VBOX_HARDDISK_VBce8c63bb-ac67a172_ /usr/lib/udev/scsi_id -g -u -d /dev/sde SATA_VBOX_HARDDISK_VB7437a3b7-95b199cd_
使用vi /etc/udev/rules.d/99-oracle-asmdevices.rules命令,創建udev規則文件:
##OL5 KERNEL=="sd?1", BUS=="scsi", PROGRAM=="/sbin/scsi_id -g -u -s /block/$parent", RESULT=="SATA_VBOX_HARDDISK_VBd306dbe0-df3367e3_", NAME="asm-disk1", OWNER="oracle", GROUP="dba", MODE="0660" KERNEL=="sd?1", BUS=="scsi", PROGRAM=="/sbin/scsi_id -g -u -s /block/$parent", RESULT=="SATA_VBOX_HARDDISK_VB46dec7e0-192e8000_", NAME="asm-disk2", OWNER="oracle", GROUP="dba", MODE="0660" KERNEL=="sd?1", BUS=="scsi", PROGRAM=="/sbin/scsi_id -g -u -s /block/$parent", RESULT=="SATA_VBOX_HARDDISK_VBce8c63bb-ac67a172_", NAME="asm-disk3", OWNER="oracle", GROUP="dba", MODE="0660" KERNEL=="sd?1", BUS=="scsi", PROGRAM=="/sbin/scsi_id -g -u -s /block/$parent", RESULT=="SATA_VBOX_HARDDISK_VB7437a3b7-95b199cd_", NAME="asm-disk4", OWNER="oracle", GROUP="dba", MODE="0660" ##OL6 KERNEL=="sd?1", BUS=="scsi", PROGRAM=="/sbin/scsi_id -g -u -d /dev/$parent", RESULT=="SATA_VBOX_HARDDISK_VBd306dbe0-df3367e3_", NAME="asm-disk1", OWNER="oracle", GROUP="dba", MODE="0660" KERNEL=="sd?1", BUS=="scsi", PROGRAM=="/sbin/scsi_id -g -u -d /dev/$parent", RESULT=="SATA_VBOX_HARDDISK_VB46dec7e0-192e8000_", NAME="asm-disk2", OWNER="oracle", GROUP="dba", MODE="0660" KERNEL=="sd?1", BUS=="scsi", PROGRAM=="/sbin/scsi_id -g -u -d /dev/$parent", RESULT=="SATA_VBOX_HARDDISK_VBce8c63bb-ac67a172_", NAME="asm-disk3", OWNER="oracle", GROUP="dba", MODE="0660" KERNEL=="sd?1", BUS=="scsi", PROGRAM=="/sbin/scsi_id -g -u -d /dev/$parent", RESULT=="SATA_VBOX_HARDDISK_VB7437a3b7-95b199cd_", NAME="asm-disk4", OWNER="oracle", GROUP="dba", MODE="0660" ##OL7 KERNEL=="sd?1", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d /dev/$parent", RESULT=="SATA_VBOX_HARDDISK_VBd306dbe0-df3367e3_", SYMLINK+="asm-disk1", OWNER="oracle", GROUP="dba", MODE="0660" KERNEL=="sd?1", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d /dev/$parent", RESULT=="SATA_VBOX_HARDDISK_VB46dec7e0-192e8000_", SYMLINK+="asm-disk2", OWNER="oracle", GROUP="dba", MODE="0660" KERNEL=="sd?1", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d /dev/$parent", RESULT=="SATA_VBOX_HARDDISK_VBce8c63bb-ac67a172", SYMLINK+="asm-disk3", OWNER="oracle", GROUP="dba", MODE="0660" KERNEL=="sd?1", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d /dev/$parent", RESULT=="SATA_VBOX_HARDDISK_VB7437a3b7-95b199cd_", SYMLINK+="asm-disk4", OWNER="oracle", GROUP="dba", MODE="0660"
更新塊設備的分區(/sbin/partprobe):
/sbin/partprobe /dev/sdb1 /sbin/partprobe /dev/sdc1 /sbin/partprobe /dev/sdd1 /sbin/partprobe /dev/sde1
測試規則:
##OL5 udevtest /block/sdb/sdb1 udevtest /block/sdc/sdc1 udevtest /block/sdd/sdd1 udevtest /block/sde/sde1 ##OL6 and OL7 udevadm test /block/sdb/sdb1 udevadm test /block/sdc/sdc1 udevadm test /block/sdd/sdd1 udevadm test /block/sde/sde1
重新載入規則文件及啟動udev服務:
##OL5 /sbin/udevcontrol reload_rules ##OL6 and OL7 udevadm control --reload-rules ##OL5 and OL6,Not needed for OL7 /sbin/start_udev
檢查磁盤的所屬關系和權限:
cd /dev ls -al asm-disk* brw-rw---- 1 oracle dba 8, 17 Apr 8 22:47 asm-disk1 brw-rw---- 1 oracle dba 8, 33 Apr 8 22:47 asm-disk2 brw-rw---- 1 oracle dba 8, 49 Apr 8 22:47 asm-disk3 brw-rw---- 1 oracle dba 8, 65 Apr 8 22:47 asm-disk4
以上內容參考自:https://oracle-base.com/articles/linux/udev-scsi-rules-configuration-in-oracle-linux#scsi_id
附上一個在OL6上快速生成udev規則文件的腳本:
for i in b c d e f g; do echo "KERNEL==\"sd*\", BUS==\"scsi\", PROGRAM==\"/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/\$name\", RESULT==\"`/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/sd$i`\", NAME=\"asm-disk$i\", OWNER=\"grid\", GROUP=\"asmadmin\", MODE=\"0660\"" >> /etc/udev/rules.d/99-oracle-asmdevices.rules done