1. 程式人生 > >淺析multipath與udev——磁碟繫結策略

淺析multipath與udev——磁碟繫結策略

    asm在使用磁碟時一般不會直接使用初始的磁碟路徑,asm對磁碟的許可權非常敏感,一般asm磁碟許可權是grid:asmadmin,且grid使用者必須在asmadmin組中,特殊環境甚至oracle也需要在asmadmin組中。如何穩定磁碟許可權(比如主機重啟後磁碟許可權不改變),穩定磁碟路徑與磁碟唯一標誌scsi id對應(碟符改變會導致asm無法啟動)是至關重要的。這個時候就需要用到multipath和udev。

    raw繫結在以前是經常使用的,繫結方式也較為簡單,但是磁碟許可權仍然會有變化的情況,而且技術過久,基本被udev替換了。

multipath:

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裝置。

[[email protected] ~]# ls -lrt /dev/mapper/asm08
lrwxrwxrwx 1 root root 8 Jun 15 15:15 /dev/mapper/asm08 -> ../dm-17
[[email protected] ~]# 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實際上指向的同一個裝置

[[email protected] ~]#  /usr/lib/udev/scsi_id -g -u -d /dev/mapper/asm08
360050768xxx000000010d2
[[email protected] ~]# /usr/lib/udev/scsi_id -g -u -d /dev/dm-17
360050768xxx000000010d2

360050768xxx000000010d2這個裝置由sdac,sdm,sdas,sdbi組成。

udev:

udev也是常見的磁碟繫結工具,需要在udev規則中寫明磁碟繫結的規則,並使其生效

比如如下做法:

[[email protected] ~]# 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

[[email protected] ~]# 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
[[email protected] ~]# 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可以有如下繫結方式:

[[email protected] ~]# 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才可以處理異常狀況。