共计 4919 个字符,预计需要花费 13 分钟才能阅读完成。
这篇文章主要讲解了“linux raw 是原始数据格式吗”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着丸趣 TV 小编的思路慢慢深入,一起来研究和学习“linux raw 是原始数据格式吗”吧!
linux raw 是原始数据格式,在 linux 中表示“裸设备”,也叫裸分区、原始分区;linux raw 是一种没有经过格式化,不被 Unix/Linux 通过文件系统来读取的特殊字符设备;裸设备可以绑定一个分区,也可以绑定一个磁盘。
linux raw 设备详解
裸设备概述
裸设备:也叫裸分区(原始分区),是一种没有经过格式化,不被 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= device name , RUN+= raw /dev/raw/rawX %N
配置设备名称,用你需要绑定的设备名称替换 device name(如:/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 下就不需要。
感谢各位的阅读,以上就是“linux raw 是原始数据格式吗”的内容了,经过本文的学习后,相信大家对 linux raw 是原始数据格式吗这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是丸趣 TV,丸趣 TV 小编将为大家推送更多相关知识点的文章,欢迎关注!