【ASM】如何创建ASM磁盘

blog文档结构图:

 前言

无论是安装单机版的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/

 创建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

查看结果:

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  -->   /dev/sdb6

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

/dev/raw/raw7  -->   /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就是一行,不能换行的,我之前就是犯了这个错误的

添加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"

注意:这里的GROUP="asmadmin", 最好修改成 GROUP="asmdba",不然最后可能用dbca创建数据库实例的时候找不见磁盘组。

三、 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

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里的自动对应一个非缓存字符设备。

major和minor 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 搜索后可以直接找到

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

选择对应的版本 rhel5

去下载如下asm的三个rpm软件包(本机器下载的是标红的三个软件包,安装包一定要下载正确的版本否则导致后续配置无法进行),注意32位和64的差别

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$

 总结

本文提到的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磁盘相关推荐

  1. 多路径下使用ASMLIB创建ASM磁盘

    多路径下使用ASMLIB创建ASM磁盘 Asmlib有扫描磁盘有默认的顺序,通常为/dev/sd*,而多路径配置磁盘目录往往映射在/dev/mapper下 因此 #  egrep -v "^ ...

  2. mysql 磁盘组_AIX使用LV创建ASM磁盘组

    AIX使用LV创建ASM磁盘组 来源:互联网 作者:佚名 时间:2015-06-19 05:07 CREATE ASM ON AIX LV DEVICE OS:AIX 6100-03 ASM版本 10 ...

  3. centos7创建asm磁盘_Oracle ASM 磁盘组基础知识整理(收藏版)

    为什么要写这么一篇基础知识呢?还是有那么一点点原因的,不是胡编乱造还真是有真实存在的事件的,前两周里因一套生产环境数据库磁盘不足无法对其进行表空间扩容,需要向存储岗申请存储资源,当存储岗划好资源加完存 ...

  4. centos7创建asm磁盘_asm磁盘路径包含混合路径时的设置

    如果asm磁盘发现路径中,既有udev方式创建的磁盘,又有asmlib创建的磁盘,那么,在asm_diskstring中,需要把两种情况都设置: asm_diskstring string /dev/ ...

  5. 创建ASM With Oracle 10g

    由于后文会相关的演示操作会用到ASM实例,因此在文章的开始就先创建一个简单的ASM实例,后面再开始详细的介绍ASM. cuug每周五晚8点都有免费网络课程,详情可点击http://www.51CTO提 ...

  6. oracle修改asm参数文件,学习笔记:Oracle RAC参数文件管理 修改创建asm中的spfile文件...

    天萃荷净 Oracle rac创建修改asm中的spfile文件内容 create spfile to asm --查看sid SQL> show parameter instance_name ...

  7. oracle asm 删除diskgroup,ASM磁盘组删除DISK操作

    没想到这么简单的操作,由于不熟悉还碰到了两个小问题. [oracle@dbserver1 ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.2.0 Pr ...

  8. linux oracle流复制文件,【学习笔记】Oracle ASM linux dd命令复制asm中文件 操作磁盘或者分区...

    天萃荷净 使用dd复制asm中文件,随着数据库新版本的推广ASM肯定会越来越被重视,最近准备系统的学习下ASM,以备突发情况需要,这是asm深入学习笔记 1.查询ASM某个数据文件AU信息 SQL&g ...

  9. 建数据库oracle 01031,DBCA创建ASM数据库时遇到ORA-01031

    问题:是dbca创建ASM数据库时,图形界面缓冲条停留在86% 监控建库日志([root@rhel5 bin]# tail -f /u01/app/oracle/cfgtoollogs/dbca/or ...

  10. Oracle ASM 翻译系列第十二弹:ASM Internal amdu - ASM Metadata Dump Utility

    amdu - ASM Metadata Dump Utility ASM Metadata Dump Utility,即ASM元数据导出工具,它的简写amdu更被人所熟知,常被Oracle技术支持人员 ...

最新文章

  1. 第八节:详细讲解Java中的异常处理情况与I/O流的介绍以及类集合框架
  2. 设计模式-行为型模式-观察者模式
  3. 代码命名,代码里的命名规则:错误的和正确的对比 命名方法总结 “自我描述的源代码”用代码表达出你的思想,让其他人通过代码能明白你的意图。...
  4. MySQL计算表字段长度LENGTH
  5. 发言倒计时器_北京会议发言计时器 会议发言提醒器 赛事发言倒计时器
  6. matlab实现聚类分析的优点,MATLAB感悟(3)--聚类分析
  7. 设计模式-23种设计模式
  8. android自带下拉阻尼动画,Android 自带阻尼效果的ScrollView,仿ios效果
  9. 路普达-区块链技术的本质与未来应用趋势
  10. 基于Mysql的智慧医疗管理系统
  11. 为啥不招北大清华的?
  12. Git 不可不知的常识 (1)
  13. python随手记自动记账_随手记的5个常用功能,让你记账省心,高效,又安全
  14. 推荐一个制作ios图标的网站
  15. Dubbo-06 20190320
  16. 知识变现海哥|知识变现五大赛道,你选哪一道?
  17. 若非群玉山头见,会向瑶台月下逢
  18. text-shadow阴影文本
  19. 中科蓝讯AB536X系列芯片PWM使用说明
  20. 【ML】异常检测、PCA、混淆矩阵、调参综合实践(基于sklearn)

热门文章

  1. 【Python】利用Python拟合函数曲线
  2. 电动牙刷无线充电解决方案
  3. Android签名V1、V2、V3、V4汇总
  4. as3 greensock_GreenSock 3 Web动画:了解GSAP的新功能
  5. 学习:java设计模式—Adapter模式
  6. [数字图像处理·冈萨雷斯 ] 图像文件格式
  7. 金属表面PCB板电池电容电镀废水铜镍回收和去除工艺
  8. IT程序员编程工具利器-辅助编程神器
  9. android屏幕漂移,手机屏幕不受控制乱跳 触屏“飘逸”的解决方法
  10. opencv2.4.9 + vc2012配置过程记录