Linux上如何使用裸设备
(2011-09-29 14:59:15)
标签:
杂谈 |
分类: 技术文章 |
1.创建pv
pvcreate -M2 –metadatasize 100M /dev/sda
pvcreate -M2 –metadatasize 100M /dev/sdb1
pvcreate -M2 –metadatasize 100M /dev/sdb2
pvcreate -M2 –metadatasize 100M /dev/sdc
物理卷可以是整个硬盘(lun),也可以是硬盘上的一个分区
2.创建vg
vgcreate vg_db /dev/sda /dev/sdb1 /dev/sdb2 /dev/sdc
-s128m
3.创建lv
lvcreate -L2048m -i4 -I64k vg_db -n lv_2g_001
lvcreate -L2048m -i4 -I64k vg_db -n lv_2g_002
4.绑定
raw /dev/raw/raw1 /dev/mapper/vg_db-lv_2g_001
raw /dev/raw/raw2 /dev/mapper/vg_db-lv_2g_002
使用raw命令绑定的裸设备在重启后会失效。所以需要修改/etc/sysconfig/rawdevices配置文件,在文件中加入如下内容(每个裸设备一行):
/dev/raw/raw1 /dev/mapper/vg_db-lv_2g_001
/dev/raw/raw2 /dev/mapper/vg_db-lv_2g_002
执行 /etc/init.d/rawdevices restart 使配置文件中的裸设备生效
执行 /sbin/chkconfig rawdevices on 保证机器启动的时候裸设备能够加载
5.授权
chown -R oracle.dba /dev/mapper
修改配置文件/etc/udev/permissions.d/50-udev.permissions
注释掉raw/*:root:disk:0660
添加新行raw/*:oracle:dba:0660
6.链接(可选)
ln -s /dev/raw/raw1 /oradata/ningoo/system01.dbf
ln -s /dev/raw/raw2 /oradata/ningoo/undo01.dbf
******************************************************************************************
1、裸设备定义:
一块没有分区的硬盘,称为原始设备(RAW DEVICE)
或者是一个分区,但是没有用EXT3,OCFS等文件系统格式化,称为原始分区(RAW PARTITION)
以上两者都是裸设备
2、裸设备的绑定
有文件系统的分区是采用mount的方式挂载到某一个挂载点的(目录)
而裸设备不能mount,只能绑定到/dev/raw/下的某一个设备名
比如/dev/raw/raw1
3、裸设备的绑定方法
有两种方法,这里介绍一种,另一种可以google搜索到
修改/etc/sysconfig/rawdevices,添加以下内容,
这里sdd1和sdd2是原始分区名或者原始设备(硬盘)名,
raw1和raw2是/dev目录下的原始设备名,编号从raw1到raw255,也就是最多可以绑定255个裸设备
/dev/raw/raw1 /dev/sdd1
/dev/raw/raw2 /dev/sdd2
然后修改裸设备的属主和访问权限
chown oracle:dba /dev/raw/raw1
chown oracle:dba /dev/raw/raw2
chmod 660 /dev/raw/raw1
chmod 660 /dev/raw/raw2
由于/dev下的文件都是动态建立的,所以在OS重启后,属主仍会变成root:disk,要解决这个问题,可以把上面的命令写入到/etc/rc.local文件中:
最后使得裸设备生效,并且在机器启动的时候就自动加载
执行 /etc/init.d/rawdevices restart 使裸设备生效
执行 /sbin/chkconfig rawdevices on 保证机器启动的时候裸设备能够加载,这一步很重要
4、裸设备的读写
不能用cp等命令操作,写入内容用dd命令,可以参阅相关资料
5、清空裸设备
相当于格式化啦bs是快的大小,block size
count是快的数量,这两者相乘大于裸设备的容量即可
dd if=/dev/zero of=/dev/raw/raw1 bs=8192 count=12800
dd if=/dev/zero of=/dev/raw/raw2 bs=8192 count=12800
-------
另外
rhel4使用udev来管理设备
手动修改/dev/raw/raw1 不能永久生效
要想使得权限持久生效
需要修改文件/etc/udev/permissions.d/50-udev.permissions 的第113行
raw/*:root:disk:0660
改成
raw/*:oracle:dba:0660
重启机器
如果/dev/下没有 /raw/ 目录,可以自己手工建立
http://defoliation.iblog.cn/post/3528/78361
http://www.*****.org/viewthread.php?tid=26708
这里的*号是(C和N和O和U和G)
**********************************************************************************************
什么是裸设备及其用途
所谓裸设备(raw
device)就是一种没有经过格式化的分区,也叫原始分区,是一种不需要通过文件系统来访问的特殊字符设备。在Linux下,通过块设备“绑定”到特殊字符设备得到裸设备。因为读写裸设备不需要像访问块设备那样经过内核的块缓冲,所有的I/O读写都是直接在进程的内存空间到物理的寻址空间进行。
此外,由于避免了文件系统处理的开销,所以使用裸设备对于读写频繁的应用(如Oracle、DB2等数据库系统)来说,可以很好地提升应用的性能。然而,随着计算能力的提高,当应用存取数据的I/O瓶颈出现在存储设备的控制器或驱动器上时,通过裸设备的数据访问性能反而不比文件系统的高,同时文件系统的数据组织能力也更强。
裸设备的创建
创建裸设备方式相对创建软RAID、LVM来说就比较简单了,只需用“raw”命令把裸设备与真实的物理磁盘或分区做一个映射即可。例如,在“/dev/raw/raw1”与“/dev/sdb”之间做一个映射,如下:
# raw /dev/raw/raw1 /dev/sdb
/dev/raw/raw1: bound to major 8, minor 16
但是以上这种方式创建的裸设备,在系统重启后将不再生效,若要永久生效需要将裸设备的映射关系写到“/etc/sysconfig/rawdevices”文件中,如下:
# vi /etc/sysconfig/rawdevices
/dev/raw/raw1 /dev/sdb
/dev/raw/raw2 /dev/sdc
/dev/raw/raw3 /dev/sdd
同时还需要启动“rawdevices”这个服务,这时所绑定的裸设备才生效,如下:
# /etc/init.d/rawdevices restart
Assigning devices:
/dev/raw/raw1 –> /dev/sdb
/dev/raw/raw1: bound to major 8, minor 16
/dev/raw/raw2 –> /dev/sdc
/dev/raw/raw2: bound to major 8, minor 32
/dev/raw/raw3 –> /dev/sdd
/dev/raw/raw3: bound to major 8, minor 48
done
使用“chkconfig”可以设置该服务在开机时自动启动,即系统启动时自动映射对应关系,对于已创建好的裸设备,可以通过如下命令来查看裸设备的映射信息:
# raw -q /dev/raw/raw1
/dev/raw/raw1: bound to major 8, minor 16
“-q”指定存在的裸设备名称,而“major 8”和“minor 16”分别时真实设备的主设备号与从设备号,如果需要查看所有的裸设备信息,那么可使用“raw -qa”,如下:
# raw -qa
/dev/raw/raw1: bound to major 8, minor 16
/dev/raw/raw2: bound to major 8, minor 32
/dev/raw/raw3: bound to major 8, minor 48
*****************************************************************************************************
1、什么是Linux裸设备?字符设备?块设备?
裸设备:也叫裸分区(原始分区),是一种没有经过格式化,不被Unix/Linux通过文件系统来读取的特殊字符设备。裸设备可以绑定一个分区,也可以绑定一个磁盘。
字符设备:对字符设备的读写不需要通过OS的buffer。它不可被文件系统mount。
块设备:对块设备的读写需要通过OS的buffer,它可以被mount到文件系统中。
2、一个系统可以有多少个裸设备?
这个与linux的版本相关,在旧版本中,最多只可以有256个裸设备,Linux 4下做多可以绑定8192个裸设备。
但是在linux下,最多只能有255个分区,所以,如果用裸设备绑定分区,最多只能绑定255个裸设备。
如果是用lvm,则没有这个限制。
3、Linux下单个磁盘最多可以有多少个分区?
15个。3个主分区 + 1个扩展分区 + 11个逻辑分区。
建议的分区方法是:先分3个主分区,第四个分区为扩展分区,然后在扩展分区中再分成11个逻辑分区。
注意,裸设备不要绑定在扩展分区上。
4、linux下是否需要绑定裸设备?unix呢?
linux下如果需要使用裸设备,则需要手工进行绑定。
unix下则不用。
因为Unix中每一个块设备都会有一个对应的字符设备用于非缓存(unbuffered)I/O,这就是他对应的裸设备了。
而Linux中rawio的则实现了一套非绑定(unbound)的裸设备/dev/rawN或者/dev/raw/rawN和一个控制设备/dev/rawct用来把他们绑定到块设备上。所以当需要使用一个裸设备的时候,就需要把他和一个真实存在的块设备对应起来,这一个步骤实际上就是完成了Unix里的自动对应一个非缓存字符设备。
5、linux如何绑定裸设备?
两种方式:
1)命令绑定
raw /dev/raw/raw[n] /dev/xxx
其中n的范围是0-8191。raw目录不存在可以创建。
执行这个命令,就会在/dev/raw下生成一个对应的raw[n]文件
用命令方式绑定裸设备在系统重启后会失效。
2)修改文件
修改/etc/sysconfig/rawdevices文件如下,以开机时自动加载裸设备,如:
/dev/raw/raw1 /dev/sdb1
这种方式是通过启动服务的方式来绑定裸设备。
也可以把这个命令写在/etc/rc.local上,使每次启动都执行这些命令。
6、如何把裸设备作为oracle数据文件?有什么需要注意的?
1)绑定裸设备
参考上文
2)改变裸设备属主
两种方法:
. 把命令卸载/etc/rc.local上
chown oracle:oinstall /dev/raw/raw1
. 修改/etc/udev/permissions.d/50-udev.permissions文件
将/etc/udev/permissions.d/50-udev.permissions的113行
从
raw/*:root:disk:0660
修改为
raw/*:oracle:oinstall:0660
这个的意思是修改裸设备的默认属主为oracle:oinstall,默认的mode是0660。
如果是用lvm,也需要把逻辑卷绑定到裸设备上,过程和绑定到普通分区类似。
7、使用裸设备作为oracle数据文件有什么需要注意的?
使用裸设备作为oracle的数据文件必须注意以下几点:
1)一个裸设备只能放置一个数据文件
2)数据文件的大小不能超过裸设备的大小
如果是日志文件,则裸设备最大可用大小=裸设备对应分区大小 - 1 * 512 (保留一个redo lock)
如果是数据文件,则裸设备最大可用大小=裸设备对应分区大小 - 2 * db_block_size(保留两个block)
为了简单起见,对所有的文件设置称比裸设备小1M即可。
3)数据文件最好不要设置称自动扩展,如果设置称自动扩展,一定要把maxsize设置设置为比裸设备小
8、是否可以直接用逻辑卷作为oracle数据文件?
linux下oracle不能直接把逻辑卷作为裸设备,也要进行绑定。unix下就不需要。
9、如何知道当前绑定了什么裸设备?
raw -qa命令列出当前绑定的所有裸设备。
10、如何知道某个裸设备的大小
比较笨的办法是,找出看裸设备对应的是那个实际的块设备,然后用fdisk -l /dev/[h,s]dXN看那个块设备的大小就好了。
比较简单的办法是用blockdev命令来计算,如:
#blockdev --getsize /dev/raw/raw1
11718750
11718750表示有多少OS BLIOCK。
一般一个OS BLOCK大小是512字节,所以11718750*512/1024/1024/1024 = 5722(m)就是裸设备的大小。
2.绑定逻辑卷到裸设备: 在root用户下 #raw /dev/raw/raw1 /dev/vg01/oradta_life
3.给oracle用户赋裸设备的读写权限: #chown oracle:oinstall /dev/raw/raw1
4.建立连接以方便应用裸设备: 到oracle用户下建立连接 $ ln -s /dev/raw/raw1
/home/oracle/oradata/raw_test
5.用裸设备建立表空间: SQL> create tablespace raw_test datafile
'/home/oracle/oradata/raw_test' size 50m;
================================================================================================
裸设备概述
裸设备:也叫裸分区(原始分区),是一种没有经过格式化,不被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下就不需要。