【ASM】如何建立ASM磁碟

lhrbest發表於2015-01-14

【ASM】如何建立ASM磁碟

blog文件結構圖:

image

 

1  前言

無論是安裝單機版的asm還是rac都離不開ASM磁碟組的建立,建立ASM磁碟組的關鍵是建立好需要的asm磁碟,發現很多網友安裝grid軟體和grid例項,都在磁碟的建立這裡有很大的問題,本人又是喜歡總結的人,那麼今天我就總結了下各種建立asm磁碟的方法,以備大家查閱。

之前的2篇文章中用到了asm磁碟的建立,連線如下:

 

Oracle 單例項ASM+11gR2安裝 http://blog.itpub.net/26736162/viewspace-1205206/

vmware  workstations + rhel6.5 下 一步一步搭建oracle 11gR2 rac+dg http://blog.itpub.net/26736162/viewspace-1328156/

 

2  建立asm磁碟的各種方法

 

2.1  方法一:Faking 方式

該方法不需要新增額外的磁碟,直接在已有的磁碟上來建立,本人推薦的方法之一。

 

------------------------ 直接貼指令碼,root使用者下執行

mkdir  -p  /oracle/asmdisk

dd if=/dev/zero of=/oracle/asmdisk/disk1 bs=1024k count=1000

dd if=/dev/zero of=/oracle/asmdisk/disk2 bs=1024k count=1000

dd if=/dev/zero of=/oracle/asmdisk/disk3 bs=1024k count=1000

dd if=/dev/zero of=/oracle/asmdisk/disk4 bs=1024k count=1000

dd if=/dev/zero of=/oracle/asmdisk/disk5 bs=1024k count=1000

 

/sbin/losetup /dev/loop1 /oracle/asmdisk/disk1

/sbin/losetup /dev/loop2 /oracle/asmdisk/disk2

/sbin/losetup /dev/loop3 /oracle/asmdisk/disk3

/sbin/losetup /dev/loop4 /oracle/asmdisk/disk4

/sbin/losetup /dev/loop5 /oracle/asmdisk/disk5

 

raw /dev/raw/raw1 /dev/loop1

raw /dev/raw/raw2 /dev/loop2

raw /dev/raw/raw3 /dev/loop3

raw /dev/raw/raw4 /dev/loop4

raw /dev/raw/raw5 /dev/loop5

 

chmod 660 /dev/raw/raw1

chmod 660 /dev/raw/raw2

chmod 660 /dev/raw/raw3

chmod 660 /dev/raw/raw4

chmod 660 /dev/raw/raw5

chown oracle:dba /dev/raw/raw1

chown oracle:dba /dev/raw/raw2

chown oracle:dba /dev/raw/raw3

chown oracle:dba /dev/raw/raw4

chown oracle:dba /dev/raw/raw5

 

------ 將以下內容新增到檔案/etc/rc.local檔案中

/sbin/losetup /dev/loop1 /oracle/asmdisk/disk1

/sbin/losetup /dev/loop2 /oracle/asmdisk/disk2

/sbin/losetup /dev/loop3 /oracle/asmdisk/disk3

/sbin/losetup /dev/loop4 /oracle/asmdisk/disk4

/sbin/losetup /dev/loop5 /oracle/asmdisk/disk5

 

raw /dev/raw/raw1 /dev/loop1

raw /dev/raw/raw2 /dev/loop2

raw /dev/raw/raw3 /dev/loop3

raw /dev/raw/raw4 /dev/loop4

raw /dev/raw/raw5 /dev/loop5

 

chmod 660 /dev/raw/raw1

chmod 660 /dev/raw/raw2

chmod 660 /dev/raw/raw3

chmod 660 /dev/raw/raw4

chmod 660 /dev/raw/raw5

chown oracle:dba /dev/raw/raw1

chown oracle:dba /dev/raw/raw2

chown oracle:dba /dev/raw/raw3

chown oracle:dba /dev/raw/raw4

chown oracle:dba /dev/raw/raw5

 

 

 

 

檢視結果:

 

wps757D.tmp 

 

 

2.2  方法二:直接修改/etc/sysconfig/rawdevices配置rawrhel6之後不支援)

採用下面的方式來增加磁碟,即直接修改/etc/sysconfig/rawdevices  (root帳戶)

Redhat平臺對raw裝置的配置在redhat 5之後有了變化。在redhat 5之前,直接配置/etc/sysconfig/rawdevices件,通過/etc/init.d/rawdevices來管理raw裝置的啟動和關 閉。在Redhat 5之後,原來的raw裝置介面已經取消了,redhat 5中通過udev規則進行配置。 要配置,需要編輯/etc/udev/rules.d/60-raw.rules這個檔案。

 

[root@oradb ~]# vi /etc/sysconfig/rawdevices

[root@oradb ~]# cat /etc/sysconfig/rawdevices --檢視增加的內容為raw6,raw7

/dev/raw/raw2 /dev/sdb6

/dev/raw/raw3 /dev/sdb7

chown oracle:dba /dev/raw/raw[6-7]  --修改屬主,否則建立磁碟組時提示許可權不夠

[root@rhel5 ~]# chown oracle:dba /dev/raw/raw6

[root@rhel5 ~]# chown oracle:dba /dev/raw/raw7

[root@rhel5 ~]# ll /dev/raw/

total 0

crw-rw---- 1 oracle dba 162, 1 Dec 30 14:47 raw1

crw-rw---- 1 oracle dba 162, 2 Dec 30 14:47 raw2

crw-rw---- 1 oracle dba 162, 3 Dec 30 14:36 raw3

crw-rw---- 1 oracle dba 162, 4 Dec 30 14:36 raw4

crw-rw---- 1 oracle dba 162, 5 Dec 30 14:36 raw5

crw------- 1 oracle dba 162, 6 Dec 30 14:36 raw6

crw------- 1 oracle dba 162, 7 Dec 30 14:36 raw7

[root@rhel5 ~]#

重啟裸裝置服務

[root@rhel5 ~]#  /sbin/service rawdevices restart

Assigning devices:

           /dev/raw/raw6  --&gt   /dev/sdb6

/dev/raw/raw6: bound to major 8, minor 22

           /dev/raw/raw7  --&gt   /dev/sdb7

/dev/raw/raw7: bound to major 8, minor 23

done

[root@rhel5 ~]#

 

 

將下面的內容增加到/etc/rc.local檔案(root帳戶),重新啟動主機,使得屬主變為oracle

chown oracle:dba /dev/raw/raw6

chown oracle:dba /dev/raw/raw7

chmod 660 /dev/raw/raw6

chmod 660 /dev/raw/raw7

 

 

SQL> select instance_name,status from v$instance;

 

INSTANCE_NAME    STATUS

---------------- ------------

+ASM             STARTED

 

SQL> set line 999

SQL> select name,state,free_mb,required_mirror_free_mb,usable_file_mb from v$asm_diskgroup;

 

NAME     STATE       FREE_MB REQUIRED_MIRROR_FREE_MB USABLE_FILE_MB

----------------- ----------- ---------- ----------------------- --------------

DATA       MOUNTED   941     0 941

DG1        MOUNTED 1862     0 931

 

SQL> create diskgroup DG1 normal redundancy disk '/dev/raw/raw6','/dev/raw/raw7';  --建立磁碟組DG1

 

SQL> select * from v$fixed_table where name like '%ASM%'; --檢視和asm相關的檢視

 

SQL> select name,allocation_unit_size,state,type,

  2  free_mb,required_mirror_free_mb req_mi_fr_mb,usable_file_mb

  3  from v$asm_diskgroup;

 

NAME            ALLOCATION_UNIT_SIZE STATE       TYPE      FREE_MB REQ_MI_FR_MB USABLE_FILE_MB

--------------- -------------------- ----------- ------ ---------- ------------ --------------

DG1                          1048576 MOUNTED     NORMAL        296            0            148

 

SQL> create diskgroup DG2 normal redundancy disk '/dev/raw/raw3','/dev/raw/raw4';   --建立磁碟組DG2

 

SQL> select name,state,free_mb,required_mirror_free_mb,usable_file_mb   --檢視磁碟組的狀態及資訊

  2  from v$asm_diskgroup;

 

NAME            STATE          FREE_MB REQUIRED_MIRROR_FREE_MB USABLE_FILE_MB

--------------- ----------- ---------- ----------------------- --------------

DG1             MOUNTED            296                       0            148

DG2             MOUNTED            296                       0            148

 

SQL> select disk_number,total_mb,free_mb from v$asm_disk;

 

DISK_NUMBER   TOTAL_MB    FREE_MB

----------- ---------- ----------

  1        199        148

  0        199        148

  1        199        148

  0        199        148

 

重新啟動Linux 主機後

SQL> startup    --重新啟動ASM例項,收到了磁碟組insufficient資訊

ASM instance started

ORA-15032: not all alterations performed

ORA-15063: ASM discovered an insufficient number of disks for diskgroup "DG2"

ORA-15063: ASM discovered an insufficient number of disks for diskgroup "DG1"

SQL> ho ls -hlt /dev/raw        # LINUX主機重新啟動之後屬主性質已發生變化

total 0

crw------- 1 root root 162, 4 Nov 10 20:28 raw4

crw------- 1 root root 162, 3 Nov 10 20:28 raw3

crw------- 1 root root 162, 2 Nov 10 20:28 raw2

crw------- 1 root root 162, 1 Nov 10 20:28 raw1

 

原因:原始裝置在引導時會重新對映。預設情況下,在引導時原始裝置的擁有者將更改為root 使用者

將下面的內容增加到/etc/rc.local檔案(root帳戶),重新啟動主機,使得屬主變為oracle,則不再出現類似的提示

chown oracle:dba /dev/raw/raw1

chown oracle:dba /dev/raw/raw2

chown oracle:dba /dev/raw/raw3

chown oracle:dba /dev/raw/raw4

chmod 660 /dev/raw/raw1

chmod 660 /dev/raw/raw2

chmod 660 /dev/raw/raw3

chmod 660 /dev/raw/raw4

 

SQL> drop diskgroup dg1;   --將剛才建立的兩個磁碟組刪除

 

SQL> drop diskgroup dg2;

 

使用root帳戶清除/etc/udev/rules.d/60-raw.rules /etc/sysconfig/rawdevices  以及/etc/rc.local剛剛增加的記錄

便於下面使用asmlib來建立asm磁碟

2.3  方法三:Udev方式

又可以分為2種方式,採用uuid來繫結或採用raw來繫結,採用uuid需要新增多塊磁碟,而採用raw方式不需要新增多個磁碟。

2.3.1  udev下的方法一:uuid方式

1、 RedHat 5 UDEV SCSI Rules配置

1 獲取需要繫結為ASM Disk的磁碟uuid

# /sbin/scsi_id -g -u -s /block/sdb

SATA_VBOX_HARDDISK_VBd306dbe0-df3367e3_

 

2 新建/etc/udev/rules.d/99-oracle-asmdevices.rules,增加以下內容

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"

 

3 重啟服務:

[root@rac1 ~]# start_udev

Starting udev:         [  OK  ]

 

2、 RedHat 6 UDEV SCSI Rules

1 編輯/etc/scsi_id.config檔案,如果該檔案不存在,則建立該檔案,新增如下行:

options=--whitelisted --replace-whitespace

備註:在我的測試中,此步驟可以省略

2 獲取需要繫結為ASM Disk的磁碟uuid,比如我們要使用/dev/sdc作為ASM磁碟,那麼:

# scsi_id --whitelisted --replace-whitespace --device=/dev/sdc

1ATA_VBOX_HARDDISK_VB36a9e548-1838194a

# /sbin/scsi_id -g -u -d /dev/sdb

SATA_VBOX_HARDDISK_VBd306dbe0-df3367e3_

 

3 新建/etc/udev/rules.d/99-oracle-asmdevices.rules,增加以下內容

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=="dm-*", PROGRAM="scsi_id --page=0x83 --whitelisted --device=/dev/%k",RESULT=="3600c0ff00015c7b70253c05001000000", OWNER:="grid", GROUP:="oinstall"

KERNEL=="dm-*", PROGRAM="scsi_id --page=0x83 --whitelisted --device=/dev/%k",RESULT=="3600c0ff00015c7b72553c05001000000", OWNER:="grid", GROUP:="oinstall"

KERNEL=="dm-*", PROGRAM="scsi_id --page=0x83 --whitelisted --device=/dev/%k",RESULT=="3600c0ff00015c7b77165c05001000000", OWNER:="grid", GROUP:="oinstall"

KERNEL=="dm-*", PROGRAM="scsi_id --page=0x83 --whitelisted --device=/dev/%k",RESULT=="3600c0ff00015c7b73753c05001000000", OWNER:="grid", GROUP:="oinstall"

KERNEL=="dm-*", PROGRAM="scsi_id --page=0x83 --whitelisted --device=/dev/%k",RESULT=="3600c0ff00015c7b78065c05001000000", OWNER:="grid", GROUP:="oinstall"

KERNEL=="sd*",BUS=="scsi",PROGRAM=="/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/$name",RESULT=="3600c0ff00015c7b70253c05001000000",NAME="asmocrvote01", OWNER="grid", GROUP="asmadmin", MODE="0660"

KERNEL=="sd*",BUS=="scsi",PROGRAM=="/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/$name",RESULT=="3600c0ff00015c7b77165c05001000000",NAME="asmdata01", OWNER="grid", GROUP="asmadmin", MODE="0660"

KERNEL=="sd*",BUS=="scsi",PROGRAM=="/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/$name",RESULT=="3600c0ff00015c7b73753c05001000000",NAME="asmdata02", OWNER="grid", GROUP="asmadmin", MODE="0660"

KERNEL=="sd*",BUS=="scsi",PROGRAM=="/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/$name",RESULT=="3600c0ff00015c7b72553c05001000000",NAME="asmfra01", OWNER="grid", GROUP="asmadmin", MODE="0660"

 

4 重啟服務:

[root@rac1 ~]# start_udev

Starting udev:         [  OK  ]

 

 

 

一、 配置 udev 繫結的 scsi_id

注意以下兩點:

首先切換到root使用者下:

① 不同的作業系統,scsi_id 命令的位置不同。

[root@rhel5 ~]#  cat /etc/issue

Red Hat Enterprise Linux Server release 5.5 (Tikanga)

Kernel \r on an \m

 

[root@rhel5 ~]#  which scsi_id

/sbin/scsi_id

[root@rhel5 ~]#

② 編輯 /etc/scsi_id.config 檔案,如果該檔案不存在,則建立該檔案並新增如下行:

[root@localhost ~]# vi /etc/scsi_id.config

options=--whitelisted --replace-whitespace

[root@localhost ~]#

5.3. 如果是使用 VMware 虛擬機器,直接輸入 scsi_id 命令可能無法獲取 id,需修改 VMware 檔案引數,這一步如果在新增磁碟的時候做過這一步的話就可以跳過了,直接獲取uuid即可 

[root@localhost ~]# scsi_id --whitelisted --replace-whitespace --device=/dev/sdb

[root@localhost ~]# scsi_id --whitelisted --replace-whitespace --device=/dev/sdc

D:\VMs\Oracle Database 11gR2\Oracle Database 11gR2.vmx

使用文字編輯器編輯該檔案,在尾部新增一行引數:

disk.EnableUUID="TRUE"

儲存檔案,重新啟動虛擬機器。這裡注意修改檔案的時候一定要在關機的狀態下修改,或者   scsi_id -g -u /dev/sdc 來獲得uuid-g -u引數在rhel6以後已經不用了

[root@localhost share]#  scsi_id --whitelisted --replace-whitespace --device=/dev/sdb

36000c29fbe57659626ee89b4fba07616

[root@localhost share]#  scsi_id --whitelisted --replace-whitespace --device=/dev/sdc

36000c29384cde894e087e5f0fcaa80f4

[root@localhost share]#  scsi_id --whitelisted --replace-whitespace --device=/dev/sdd

36000c29022aee23728231ed9b1f9743d

[root@localhost share]#  scsi_id --whitelisted --replace-whitespace --device=/dev/sde

36000c2938f431664218d1d2632ff1352

二、 建立並配置 udev rules 檔案

[root@localhost ~]# vi /etc/udev/rules.d/99-oracle-asmdevices.rules

KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/$name",RESULT=="36000c29fe0fc917d7e9982742a28ce7c", NAME="asm-diskb", OWNER="grid",GROUP="asmadmin", MODE="0660"

KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/$name",RESULT=="36000c293ffc0900fd932348de4b6baf8", NAME="asm-diskc", OWNER="grid",GROUP="asmadmin", MODE="0660"

 

根據步驟 5 獲取的 ID 修改 RESULT 值

這裡需要注意,一個KERNEL就是一行,不能換行的,我之前就是犯了這個錯誤的

wps758E.tmp 

新增4塊硬碟:

KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/$name",RESULT=="36000c29346c1344ffb26f0e5603d519e", NAME="asm-diskb", OWNER="grid",GROUP="asmadmin", MODE="0660"

KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/$name",RESULT=="36000c29d08ee059a345571054517cd03", NAME="asm-diskc", OWNER="grid",GROUP="asmadmin", MODE="0660"

KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/$name",RESULT=="36000c295037a910bfb765af8f400aa07", NAME="asm-diskd", OWNER="grid",GROUP="asmadmin", MODE="0660"

KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/$name",RESULT=="36000c2982bda048f642acd3c429ec983", NAME="asm-diske", OWNER="grid",GROUP="asmadmin", MODE="0660"

wps758F.tmp 

 

 

注意:這裡的GROUP="asmadmin", 最好修改成 GROUP="asmdba",不然最後可能用dbca建立資料庫例項的時候找不見磁碟組。

wps7590.tmp 

 

三、 udevadm進行測試

用udevadm進行測試,注意udevadm命令不接受/dev/sdc這樣的掛載裝置名,必須是使用/sys/block/sdc這樣的原始裝置名。

udevadm test /sys/block/sdcudevadm info --query=all --path=/sys/block/sdcudevadm info --query=all --name=asm-disk1

在顯示中,有類似如下輸出,表示測試正確,/dev/sdc裝置在udev啟動以後將會繫結為/dev/asm-disk1:

udevadm_test: UDEV_LOG=6udevadm_test: DEVPATH=/devices/pci0000:00/0000:00:0d.0/host4/target4:0:0/4:0:0:0/block/sdcudevadm_test: MAJOR=8udevadm_test: MINOR=32udevadm_test: DEVNAME=/dev/asm-disk1udevadm_test: DEVTYPE=diskudevadm_test: ACTION=addudevadm_test: SUBSYSTEM=block

 

四、 新增完成後,重啟 udev,不同 Linux
發行版本重啟方式不一樣。

該步驟慢一點,大約可能需要30秒左右吧,等等等等。。。。。。

[root@localhost ~]# start_udev

Starting udev:                                             [  OK  ]

[root@localhost ~]#

五、 檢視繫結的 asm,如果此時還是看不到 asm disk
,請重啟作業系統後再檢視。

[root@localhost ~]# ll /dev/asm*

brw-rw---- 1 grid asmadmin 8, 17 Oct 17 14:26 /dev/asm-diskb

brw-rw---- 1 grid asmadmin 8, 33 Oct 17 14:26 /dev/asm-diskc

wps7591.tmp 

 

 

2.3.2  udev下的方法二:raw方式

 

a.配置裸裝置對映,修改/etc/udev/rules.d/60-raw.rules檔案

使用root帳戶修改/etc/udev/rules.d/60-raw.rules 按如下方式新增磁碟

[root@oradb ~]# cat /etc/udev/rules.d/60-raw.rules       --檢視新增的內容

ACTION=="add", KERNEL=="/dev/sdb8", RUN+="/bin/raw /dev/raw/raw8 %N"

ACTION=="add", ENV{MAJOR}=="8", ENV{MINOR}=="24", RUN+="/bin/raw /dev/raw/raw8 %M %m"

ACTION=="add", KERNEL=="/dev/sdb9", RUN+="/bin/raw /dev/raw/raw9 %N"

ACTION=="add", ENV{MAJOR}=="8", ENV{MINOR}=="25", RUN+="/bin/raw /dev/raw/raw9 %M %m"

 

 

ACTION=="add", KERNEL=="raw8", OWNER="grid", GROUP="asmadmin", MODE="0660"

ACTION=="add", KERNEL=="raw9", OWNER="grid", GROUP="asmadmin", MODE="0660"

 

[root@oradb ~]# start_udev    #重啟udev服務

Starting udev: [  OK  ]

[root@rhel5 ~]# raw -qa

/dev/raw/raw1: bound to major 7, minor 1

/dev/raw/raw2: bound to major 7, minor 2

/dev/raw/raw3: bound to major 7, minor 3

/dev/raw/raw4: bound to major 7, minor 4

/dev/raw/raw5: bound to major 7, minor 5

/dev/raw/raw6: bound to major 8, minor 22

/dev/raw/raw7: bound to major 8, minor 23

/dev/raw/raw8: bound to major 8, minor 24

/dev/raw/raw9: bound to major 8, minor 25

[root@rhel5 ~]# ll /dev/raw*

crw------- 1 root root 162, 0 Dec 30 14:36 /dev/rawctl

 

/dev/raw:

total 0

crw------- 1 oracle dba      162, 1 Dec 30 15:29 raw1

crw------- 1 oracle dba      162, 2 Dec 30 15:29 raw2

crw------- 1 oracle dba      162, 3 Dec 30 14:36 raw3

crw------- 1 oracle dba      162, 4 Dec 30 14:36 raw4

crw------- 1 oracle dba      162, 5 Dec 30 14:36 raw5

crw------- 1 oracle dba      162, 6 Dec 30 15:29 raw6

crw------- 1 oracle dba      162, 7 Dec 30 15:29 raw7

crw-rw---- 1 grid   asmadmin 162, 8 Dec 30 15:28 raw8

crw-rw---- 1 grid   asmadmin 162, 9 Dec 30 15:28 raw9

[root@rhel5 ~]#

 

 

SQL> create diskgroup DG2 external redundancy disk '/dev/raw/raw8';

 

Diskgroup created.

 

一、 裸裝置概述 

裸裝置:也叫裸分割槽(原始分割槽),是一種沒有經過格式化,不被Unix/Linux通過檔案系統來讀取的特殊字元裝置。裸裝置可以繫結一個分割槽,也可以繫結一個磁碟。
字元裝置:對字元裝置的讀寫不需要通過OS的buffer。它不可被檔案系統mount。
塊裝置:對塊裝置的讀寫需要通過OS的buffer,它可以被mount到檔案系統中。

這個與linux的版本相關,在舊版本中,最多隻可以有256個裸裝置,Linux 4下做多可以繫結81Array2個裸裝置。但是在linux下,最多隻能有255個分割槽,所以,如果用裸裝置繫結分割槽,最多隻能繫結255個裸裝置。如果是用lvm,則沒有這個限制。

Linux下單個磁碟最多可以有15個分割槽。3個主分割槽 + 1個擴充套件分割槽 + 11個邏輯分割槽。
建議的分割槽方法是:先分3個主分割槽,第四個分割槽為擴充套件分割槽,然後在擴充套件分割槽中再分成11個邏輯分割槽。
注意,裸裝置不要繫結在擴充套件分割槽上。 
linux下如果需要使用裸裝置,則需要手工進行繫結,unix下則不用。
因為Unix中每一個塊裝置都會有一個對應的字元裝置用於非快取(unbuffered)I/O,這就是他對應的裸裝置了。而Linux中rawio的則 實現了一套非繫結(unbound)的裸裝置/dev/rawN或者/dev/raw/rawN和一個控制裝置/dev/rawct用來把他們繫結到塊設 備上。所以當需要使用一個裸裝置的時候,就需要把他和一個真實存在的塊裝置對應起來,這一個步驟實際上就是完成了Unix裡的自動對應一個非快取字元裝置。

majorminor device number 

在unix/linux系統中,一切都是檔案。所有硬碟、軟盤、鍵盤等裝置都用檔案來代表,對應 著/dev下面的檔案。對於應用程式來說,可以像對待普通檔案一樣開啟,關閉、讀寫這些裝置檔案。但是這種檔名,比如/dev/sda、/dev /raw/raw1都是使用者空間名稱,OS Kernel根本不知道這個名稱指的是什麼。在核心空間是通過major、minor device number 來區分裝置的。
major device number可以看作是裝置驅動程式,被同一裝置驅動程式管理的裝置有相同的major device number.這個數字實際是Kernel中device driver table 的索引,這個表儲存著不同裝置驅動程式。 而minor device number用來代表被訪問的具體裝置。也就是說Kernel根據major device number 找到裝置驅動程式,然後再從minor device number 獲得裝置位置等屬性。所有這些major device number 是已經預先分配好的。詳細資訊可以從http://www.lanana.org/docs/device-list/devices-2.6+.txt 檢視。比如裸裝置是162,scsi塊裝置是8
/etc/udev/rules.d/60-raw.rules
 

Redhat平臺對raw裝置的配置在redhat 5之後有了變化。在redhat 5之前,直接配置/etc/sysconfig/rawdevices件,通過/etc/init.d/rawdevices來管理raw裝置的啟動和關 閉。在Redhat 5之後,原來的raw裝置介面已經取消了,redhat 5中通過udev規則進行配置。 要配置,需要編輯/etc/udev/rules.d/60-raw.rules這個檔案。

cat /etc/udev/rules.d/60-raw.rules
# Enter raw device bindings here.
#
# An example would be:
#   ACTION=="add", KERNEL=="sda", RUN+="/bin/raw /dev/raw/raw1 %N"
# to bind /dev/raw/raw1 to /dev/sda, or
#   ACTION=="add", ENV{MAJOR}=="8", ENV{MINOR}=="1", RUN+="/bin/raw /dev/raw/raw2 %M %m"
# to bind /dev/raw/raw2 to the device with major 8, minor 1. 

其中
ACTION=="add", KERNEL="", RUN+="raw /dev/raw/rawX %N" 

配置裝置名稱,用你需要繫結的裝置名稱替換 (如:/dev/sda1),X為裸裝置號
主/次號碼:
ACTION=="add", ENV{MAJOR}="A", ENV{MINOR}="B", RUN+="raw /dev/raw/rawX %M %m" 
"A" 和 "B" 是裝置的主/次號碼,X是系統使用的raw裝置號碼。

個人對redhat管理raw的過程理解為: 在redhat 5中,是通過udev來管理raw裝置的,而udev是通過 MAJOR和MINOR來識別 raw裝置 。 故需要將裝置號和裸裝置號進行繫結,而主裝置號和次裝置號可以自行指定或者由系統自動分配。 根據red hat的官方文件中關於raw.rule的示例中說KERNEL==..或ENV{MAJOR}...只需要任意配置一個就可以,但有些網友經過試驗,驗證必須二者同時配置才可以。

配置 /etc/udev/rules.d/60-raw.rules檔案

檢視磁碟分割槽情況

# fdisk  -l /dev/sdb 


Disk /dev/sdb: 4880 MB, 4880072704 bytes
255 heads, 63 sectors/track, 593 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1          25      200781   83  Linux
/dev/sdb2              26          50      200812+  83  Linux
配置 /etc/udev/rules.d/60-raw.rules檔案 
# grep -v ^# /etc/udev/rules.d/60-raw.rules
ACTION=="add", KERNEL=="sdb1", RUN+="/bin/raw /dev/raw/raw1 %N"
ACTION=="add", KERNEL=="sdb2", RUN+="/bin/raw /dev/raw/raw2 %N"
ACTION=="add", ENV{MAJOR}=="3", ENV{MINOR}=="2", RUN+="/bin/raw /dev/raw/raw1 %M %m"
ACTION=="add", ENV{MAJOR}=="7", ENV{MINOR}=="2", RUN+="/bin/raw /dev/raw/raw2 %M %m"

啟動raw裝置

# start_udev
Starting udev:                                             [  OK  ] 

檢視配置情況
# raw -qa
/dev/raw/raw1:  bound to major 8, minor 17
/dev/raw/raw2:  bound to major 8, minor 18 

這裡筆者不清楚為什麼主裝置號和復裝置號並不和我在 /etc/udev/rules.d/60-raw.rules指定的一樣,望瞭解的讀者告知,系統核心資訊如下
# uname  -a
Linux rac1 2.6.18-164.el5 #1 SMP Tue Aug 18 15:51:54 EDT 2009 i686 i686 i386 GNU/Linux
# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 5.4 (Tikanga) 

可以通過如下方式指定 主裝置號和復裝置號
# raw /dev/raw/raw1 1 1
/dev/raw/raw1:  bound to major 1, minor 1 

raw /dev/raw/raw[n] /dev/xxx
其中n的範圍是0-8191。raw目錄不存在的話會被自動建立。執行這個命令,就會在/dev/raw下生成一個對應的raw[n]檔案用命令方式繫結裸裝置在系統重啟後會失效。

刪除裸裝置
# raw /dev/raw/raw2 0 0
/dev/raw/raw2:  bound to major 0, minor 0 

# raw -qa
/dev/raw/raw1:  bound to major 1, minor 1 

以上設定必須同時修改 /etc/udev/rules.d/60-raw.rules才能保證重啟後生效,否則重啟後系統會重新讀取 /etc/udev/rules.d/60-raw.rules 

如需設定raw裝置的使用者和許可權資訊,可在/etc/udev/rules.d/60-raw.rules檔案裡新增如下資訊:
ACTION=="add", KERNEL=="raw1", OWNER="dave", GROUP="tianlesoftware", MODE="660" 
如果有多個raw裝置,可以寫成:
ACTION=="add", KERNEL=="raw[1-4]", OWNER="dave", GROUP="tianlesoftware", MODE="660" 
#chown oracle:oinstall /dev/raw/raw[1-4]
#chmod 775 /dev/raw/raw[1-4] 
注意:在核心2.6.9-89.5AXS2之前使用/etc/sysconfig/rawdevices和/etc/udev/permissions.d/50-udev.permissions進行raw裝置的配置和許可權管理。在核心 2.6.18-128.7AXS3以後則使用了本文介紹的 /etc/udev/rules.d/60-raw.rules進行raw裝置的管理 

確定裸裝置的大小 
比較笨的辦法是,找出看裸裝置對應的是那個實際的塊裝置,然後用fdisk -l /dev/[h,s]dXN看那個塊裝置的大小就好了。比較簡單的辦法是用blockdev命令來計算,如:
#blockdev --getsize /dev/raw/raw1
11718750 
11718750表示有多少OS BLIOCK。
一般一個OS BLOCK大小是512位元組,所以11718750*512/1024/1024= 5722(m) 就是裸裝置的大小。

使用裸裝置作為oracle的資料檔案的注意事項 
1、一個裸裝置只能放置一個資料檔案
2、資料檔案的大小不能超過裸裝置的大小
如果是日誌檔案,則裸裝置最大可用大小=裸裝置對應分割槽大小 - 1 * 512 (保留一個redo lock)
如果是資料檔案,則裸裝置最大可用大小=裸裝置對應分割槽大小 - 2 * db_block_size(保留兩個block)
為了簡單起見,對所有的檔案設定稱比裸裝置小1M即可。
3、資料檔案最好不要設定稱自動擴充套件,如果設定稱自動擴充套件,一定要把maxsize設定設定為比裸裝置小
4、linux下oracle不能直接把邏輯卷作為裸裝置,也要進行繫結。unix下就不需要。

 

 

2.4  方法四:Asmlib方式

asmlib是oracle提供的軟體,不支援rhel6 了,具體參考:http://blog.itpub.net/26736162/viewspace-1205206/

 

2.4.1  系統版本號

[root@rhel5 ~]# uname -rm

2.6.18-194.el5 x86_64

一.2.4.2  Oracle asmlib下載

1. 在官網(www.oracle.com)的搜尋中輸入 asmlib 搜尋後可以直接找到

wps75A2.tmp 

http://www.oracle.com/technetwork/server-storage/linux/asmlib/index-101839.html

wps75A3.tmp 

wps75A4.tmp 

選擇對應的版本 rhel5

 

 

去下載如下asm的三個rpm軟體包(本機器下載的是標紅的三個軟體包,安裝包一定要下載正確的版本否則導致後續配置無法進行),注意32位和64的差別

 

wps75B4.tmp 

wps75B5.tmp 

Intel EM64T (x86_64) Architecture

Library and Tools

oracleasm-support-2.1.8-1.el5.x86_64.rpm

oracleasmlib-2.0.4-1.el5.x86_64.rpm

Drivers for kernel 2.6.18-194.el5

oracleasm-2.6.18-194.el5xen-2.0.5-1.el5.x86_64.rpm

oracleasm-2.6.18-194.el5debug-2.0.5-1.el5.x86_64.rpm

oracleasm-2.6.18-194.el5-debuginfo-2.0.5-1.el5.x86_64.rpm

oracleasm-2.6.18-194.el5-2.0.5-1.el5.x86_64.rpm

 

2.4.3  上傳並安裝上述的三個rpm軟體包:

[root@rhel5 tmp]# ll oracleasm*

-rw-r--r-- 1 root root 137486 Dec 30 10:28 oracleasm-2.6.18-194.el5-2.0.5-1.el5.x86_64.rpm

-rw-r--r-- 1 root root  14176 Jun  2  2013 oracleasmlib-2.0.4-1.el5.x86_64.rpm

-rw-r--r-- 1 root root  90225 Jun  2  2013 oracleasm-support-2.1.8-1.el5.x86_64.rpm

[root@rhel5 tmp]# rpm -ivh oracleasm*.rpm

warning: oracleasm-2.6.18-194.el5-2.0.5-1.el5.x86_64.rpm: Header V3 DSA signature: NOKEY, key ID 1e5e0159

Preparing...                  ########################################### [100%]

   1:oracleasm-support       ########################################### [ 33%]

   2:oracleasm-2.6.18-194.el########################################### [ 67%]

   3:oracleasmlib             ########################################### [100%]

[root@rhel5 tmp]#

驗證安裝的包

[root@rhel5 ~]#  rpm -qa | grep asm

oracleasm-2.6.18-194.el5-2.0.5-1.el5

oracleasmlib-2.0.4-1.el5

oracleasm-support-2.1.8-1.el5

[root@rhel5 ~]#

2.4.4   配置ASM

 

[root@rhel5 tmp]# /etc/init.d/oracleasm configure

Configuring the Oracle ASM library driver.

 

This will configure the on-boot properties of the Oracle ASM library

driver.  The following questions will determine whether the driver is

loaded on boot and what permissions it will have.  The current values

will be shown in brackets ('[]').  Hitting without typing an

answer will keep that current value.  Ctrl-C will abort.

 

Default user to own the driver interface []: grid

Default group to own the driver interface []: asmadmin

Start Oracle ASM library driver on boot (y/n) [n]: y

Scan for Oracle ASM disks on boot (y/n) [y]: y

Writing Oracle ASM library driver configuration: done

Initializing the Oracle ASMLib driver:                     [  OK  ]

Scanning the system for Oracle ASMLib disks:               [  OK  ]

[root@rhel5 tmp]#

 

如果配置錯誤,可以重新配置:

[root@rhel5 tmp]#  /etc/init.d/oracleasm configure

Configuring the Oracle ASM library driver.

 

This will configure the on-boot properties of the Oracle ASM library

driver.  The following questions will determine whether the driver is

loaded on boot and what permissions it will have.  The current values

will be shown in brackets ('[]').  Hitting without typing an

answer will keep that current value.  Ctrl-C will abort.

 

Default user to own the driver interface [oracle]: grid

Default group to own the driver interface [oinstall]: asmadmin

Start Oracle ASM library driver on boot (y/n) [y]: y

Scan for Oracle ASM disks on boot (y/n) [y]: y

Writing Oracle ASM library driver configuration: done

Initializing the Oracle ASMLib driver:                     [  OK  ]

Scanning the system for Oracle ASMLib disks:               [  OK  ]

[root@rhel5 tmp]#

 

2.4.5  系統新增磁碟

在Vmware分配幾個空閒的磁碟用於建立ASM磁碟,建議使用不同的磁碟控制器

下面使用個磁碟來組建ASM磁碟組,分別為sdd,sde,sdf,sdg

分別對個磁碟進行分割槽,列出sdd的分割槽樣例,其餘如法炮製

[root@oradb ~]# fdisk /dev/sdd

 

Command (m for help): n

Command action

   e   extended

   p   primary partition (1-4)

p

Partition number (1-4): 1

First cylinder (1-261, default 1):

Using default value 1

Last cylinder or +size or +sizeM or +sizeK (1-261, default 261):

Using default value 261

 

Command (m for help): w

The partition table has been altered!

 

Calling ioctl() to re-read partition table.

Syncing disks.

系統新增一塊硬碟sdb,然後進行分割槽 fdisk /dev/sdb ,分割槽之後:

[root@rhel5 ~]# ll /dev/sdb*

brw-r----- 1 root disk 8, 16 Dec 30 10:54 /dev/sdb

brw-r----- 1 root disk 8, 17 Dec 30 10:59 /dev/sdb1

brw-r----- 1 root disk 8, 18 Dec 30 11:00 /dev/sdb2

brw-r----- 1 root disk 8, 19 Dec 30 11:00 /dev/sdb3

brw-r----- 1 root disk 8, 20 Dec 30 11:00 /dev/sdb4

[root@rhel5 ~]#

 

 

[root@rhel5 ~]# /etc/init.d/oracleasm createdisk VOL1 /dev/sdb1

Marking disk "VOL1" as an ASM disk:                        [  OK  ]

[root@rhel5 ~]# /etc/init.d/oracleasm createdisk VOL2 /dev/sdb2

Marking disk "VOL2" as an ASM disk:                        [  OK  ]

[root@rhel5 ~]# /etc/init.d/oracleasm createdisk VOL3 /dev/sdb3

Marking disk "VOL3" as an ASM disk:                        [  OK  ]

[root@rhel5 ~]# /etc/init.d/oracleasm createdisk VOL4 /dev/sdb4

Marking disk "VOL4" as an ASM disk:                        [  OK  ]

[root@rhel5 ~]#

 

[root@rhel5 oracle]# ll /dev/oracleasm/disks/*

brw-rw---- 1 grid asmadmin 8, 17 Dec 30 10:59 /dev/oracleasm/disks/VOL1

brw-rw---- 1 grid asmadmin 8, 18 Dec 30 11:00 /dev/oracleasm/disks/VOL2

brw-rw---- 1 grid asmadmin 8, 19 Dec 30 11:00 /dev/oracleasm/disks/VOL3

brw-rw---- 1 grid asmadmin 8, 20 Dec 30 11:00 /dev/oracleasm/disks/VOL4

[root@rhel5 ~]# /etc/init.d/oracleasm listdisks

VOL1

VOL2

VOL3

VOL4

[root@rhel5 ~]#

[root@rhel5 ~]# /etc/init.d/oracleasm deletedisk VOL4

Removing ASM disk "VOL4":                                  [  OK  ]

[root@rhel5 ~]#

 

2.4.6  grid軟體安裝完畢後配置asm_diskstring 路徑

[grid@rhel5 ~]$ sqlplus / as sysasm

 

SQL*Plus: Release 11.2.0.3.0 Production on Tue Dec 30 12:09:19 2014

 

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

 

 

Connected to:

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

With the Automatic Storage Management option

 

SQL> alter system set asm_diskstring='/dev/raw/*','/dev/oracleasm/disks/VOL*';

 

System altered.

 

SQL> show parameter asm_diskstring

 

NAME      TYPE VALUE

------------------------------------ ----------- ------------------------------

asm_diskstring      string /dev/raw/*, /dev/oracleasm/dis

ks/VOL*

SQL>set line 9999

SQL> SELECT a.group_number, disk_number,mount_status, a.name, path FROM v$asm_disk a;

 

GROUP_NUMBER DISK_NUMBER MOUNT_S NAME PATH

------------ ----------- ------- ------------------------------

   0        0 CLOSED /dev/raw/raw5

   0        1 CLOSED /dev/raw/raw4

   0        2 CLOSED /dev/raw/raw3

   0        3 CLOSED /dev/raw/raw2

   0        4 CLOSED /dev/oracleasm/disks/VOL4

   0        5 CLOSED /dev/oracleasm/disks/VOL3

   0        6 CLOSED /dev/oracleasm/disks/VOL2

   0        7 CLOSED /dev/oracleasm/disks/VOL1

   1        0 CACHED  DATA_0000 /dev/raw/raw1

 

9 rows selected.

 

SQL>

 

磁碟搜尋路徑問題

SQL> create diskgroup DG1 normal redundancy disk 'ORCL:VOL1','ORCL:VOL2';

create diskgroup DG1 normal redundancy disk 'ORCL:VOL1','ORCL:VOL2'

*

ERROR at line 1:

ORA-15018: diskgroup cannot be created

ORA-15031: disk specification 'ORCL:VOL2' matches no disks

ORA-15031: disk specification 'ORCL:VOL1' matches no disks

使用oraclasm建立磁碟後,預設會在/dev/oracleasm/disks目錄下新增剛剛建立的磁碟對映

修改asm_diskstring修改路徑之後再次建立即可

alter system set asm_diskstring='/dev/oracleasm/disks/VOL*'

 

2.4.7  測試

SQL> drop diskgroup dg1;

 

Diskgroup dropped.

 

SQL> select name,state,free_mb,required_mirror_free_mb,usable_file_mb from v$asm_diskgroup;

 

NAME        STATE       FREE_MB REQUIRED_MIRROR_FREE_MB USABLE_FILE_MB

------------------------------ ----------- ---------- ----------------------- --------------

DATA        MOUNTED   941     0 941

 

SQL> create diskgroup DG1 normal redundancy

  2  failgroup FG1 disk '/dev/oracleasm/disks/VOL1' name VOL1

  3  failgroup FG2 disk '/dev/raw/raw2' name VOL2;

 

Diskgroup created.

 

SQL> select name,state,free_mb,required_mirror_free_mb,usable_file_mb from v$asm_diskgroup;

 

NAME        STATE       FREE_MB REQUIRED_MIRROR_FREE_MB USABLE_FILE_MB

------------------------------ ----------- ---------- ----------------------- --------------

DATA        MOUNTED   941     0 941

DG1       MOUNTED 1862     0 931

 

SQL>

 

2.4.8  日誌

tail -f /var/log/oracleasm

 

2.4.9  報錯:

一、 ASM: Device is already labeled for ASM disk

 

當一塊磁碟或分割槽已經被一個DataGroup用過,此時想用這塊磁碟或分割槽重新生成Asmlib生成Oracle磁碟裝置時即會報標題的錯。

[@more@]

類似如下:

 

oracle@vvfs$ /etc/init.d/oracleasm createdisk VOL1 /dev/sda1

Marking disk "/dev/sda1" as an ASM disk: asmtool:

Device "/dev/sda1" is already labeled for ASM disk "" [FAILED]

 

oracle@vvfs$ /etc/init.d/oracleasm deletedisk VOL1

Removing ASM disk "VOL1" [FAILED]

 

解決問題其實很簡單,把磁碟頭清一下就可以了:

 

dd if=/dev/zero of= bs=1024 count=100

 

現在操作就該正常了:

 

oracle@vvfs$ dd if=/dev/zero of=/dev/sda1 bs=1024 count=100

100+0 records in

100+0 records out

 

oracle@vvfs$ /etc/init.d/oracleasm createdisk VOL /dev/sda1

Marking disk "/dev/sda1" as an ASM disk: [ OK ]

 

oracle@vvfs$

3  總結

本文提到的4種方法各有優缺點,其中方法二和方法四是rhel6之前的版本支援,方法三需要新增多塊磁碟,方法一最直接,如若網友有興趣,可以列個表格來比對他們的區別。





About Me

...............................................................................................................................

● 本文作者:小麥苗,只專注於資料庫的技術,更注重技術的運用

● 本文在itpub(http://blog.itpub.net/26736162)、部落格園(http://www.cnblogs.com/lhrbest)和個人微信公眾號(xiaomaimiaolhr)上有同步更新

● 本文itpub地址:http://blog.itpub.net/26736162/abstract/1/

● 本文部落格園地址:http://www.cnblogs.com/lhrbest

● 本文pdf版及小麥苗雲盤地址:http://blog.itpub.net/26736162/viewspace-1624453/

● 資料庫筆試面試題庫及解答:http://blog.itpub.net/26736162/viewspace-2134706/

● QQ群:230161599     微信群:私聊

● 聯絡我請加QQ好友(646634621),註明新增緣由

● 於 2017-07-01 09:00 ~ 2017-07-31 22:00 在魔都完成

● 文章內容來源於小麥苗的學習筆記,部分整理自網路,若有侵權或不當之處還請諒解

● 版權所有,歡迎分享本文,轉載請保留出處

...............................................................................................................................

拿起手機使用微信客戶端掃描下邊的左邊圖片來關注小麥苗的微信公眾號:xiaomaimiaolhr,掃描右邊的二維碼加入小麥苗的QQ群,學習最實用的資料庫技術。

【ASM】如何建立ASM磁碟
DBA筆試面試講解
歡迎與我聯絡

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26736162/viewspace-1401193/,如需轉載,請註明出處,否則將追究法律責任。

相關文章