共計(jì) 4919 個(gè)字符,預(yù)計(jì)需要花費(fèi) 13 分鐘才能閱讀完成。
這篇文章主要講解了“l(fā)inux raw 是原始數(shù)據(jù)格式嗎”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著丸趣 TV 小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“l(fā)inux raw 是原始數(shù)據(jù)格式嗎”吧!
linux raw 是原始數(shù)據(jù)格式,在 linux 中表示“裸設(shè)備”,也叫裸分區(qū)、原始分區(qū);linux raw 是一種沒(méi)有經(jīng)過(guò)格式化,不被 Unix/Linux 通過(guò)文件系統(tǒng)來(lái)讀取的特殊字符設(shè)備;裸設(shè)備可以綁定一個(gè)分區(qū),也可以綁定一個(gè)磁盤(pán)。
linux raw 設(shè)備詳解
裸設(shè)備概述
裸設(shè)備:也叫裸分區(qū)(原始分區(qū)),是一種沒(méi)有經(jīng)過(guò)格式化,不被 Unix/Linux 通過(guò)文件系統(tǒng)來(lái)讀取的特殊字符設(shè)備。裸設(shè)備可以綁定一個(gè)分區(qū),也可以綁定一個(gè)磁盤(pán)。
字符設(shè)備:對(duì)字符設(shè)備的讀寫(xiě)不需要通過(guò) OS 的 buffer。它不可被文件系統(tǒng) mount。
塊設(shè)備:對(duì)塊設(shè)備的讀寫(xiě)需要通過(guò) OS 的 buffer,它可以被 mount 到文件系統(tǒng)中。
這個(gè)與 linux 的版本相關(guān),在舊版本中,最多只可以有 256 個(gè)裸設(shè)備,Linux 4 下做多可以綁定 81Array2 個(gè)裸設(shè)備。但是在 linux 下,最多只能有 255 個(gè)分區(qū),所以,如果用裸設(shè)備綁定分區(qū),最多只能綁定 255 個(gè)裸設(shè)備。如果是用 lvm,則沒(méi)有這個(gè)限制。
Linux 下單個(gè)磁盤(pán)最多可以有 15 個(gè)分區(qū)。3 個(gè)主分區(qū) + 1 個(gè)擴(kuò)展分區(qū) + 11 個(gè)邏輯分區(qū)。
建議的分區(qū)方法是:先分 3 個(gè)主分區(qū),第四個(gè)分區(qū)為擴(kuò)展分區(qū),然后在擴(kuò)展分區(qū)中再分成 11 個(gè)邏輯分區(qū)。
注意,裸設(shè)備不要綁定在擴(kuò)展分區(qū)上。
linux 下如果需要使用裸設(shè)備,則需要手工進(jìn)行綁定,unix 下則不用。
因?yàn)?Unix 中每一個(gè)塊設(shè)備都會(huì)有一個(gè)對(duì)應(yīng)的字符設(shè)備用于非緩存 (unbuffered)I/O, 這就是他對(duì)應(yīng)的裸設(shè)備了。而 Linux 中 rawio 的則實(shí)現(xiàn)了一套非綁定(unbound) 的裸設(shè)備 /dev/rawN 或者 /dev/raw/rawN 和一個(gè)控制設(shè)備 /dev/rawct 用來(lái)把他們綁定到塊設(shè)備上。所以當(dāng)需要使用一個(gè)裸設(shè)備的時(shí)候,就需要把他和一個(gè)真實(shí)存在的塊設(shè)備對(duì)應(yīng)起來(lái),這一個(gè)步驟實(shí)際上就是完成了 Unix 里的自動(dòng)對(duì)應(yīng)一個(gè)非緩存字符設(shè)備。
major 和 minor device number
在 unix/linux 系統(tǒng)中,一切都是文件。所有硬盤(pán)、軟盤(pán)、鍵盤(pán)等設(shè)備都用文件來(lái)代表,對(duì)應(yīng)著 /dev 下面的文件。對(duì)于應(yīng)用程序來(lái)說(shuō),可以像對(duì)待普通文件一樣打開(kāi),關(guān)閉、讀寫(xiě)這些設(shè)備文件。但是這種文件名,比如 /dev/sda、/dev/raw/raw1 都是用戶空間名稱,OS Kernel 根本不知道這個(gè)名稱指的是什么。在內(nèi)核空間是通過(guò) major、minor device number 來(lái)區(qū)分設(shè)備的。
major device number 可以看作是設(shè)備驅(qū)動(dòng)程序,被同一設(shè)備驅(qū)動(dòng)程序管理的設(shè)備有相同的 major device number. 這個(gè)數(shù)字實(shí)際是 Kernel 中 device driver table 的索引,這個(gè)表保存著不同設(shè)備驅(qū)動(dòng)程序。而 minor device number 用來(lái)代表被訪問(wèn)的具體設(shè)備。也就是說(shuō) Kernel 根據(jù) major device number 找到設(shè)備驅(qū)動(dòng)程序,然后再?gòu)?minor device number 獲得設(shè)備位置等屬性。所有這些 major device number 是已經(jīng)預(yù)先分配好的。詳細(xì)信息可以從 http://www.lanana.org/docs/device-list/devices-2.6+.txt 查看。
比如裸設(shè)備是 162,scsi 塊設(shè)備是 8
/etc/udev/rules.d/60-raw.rules
Redhat 平臺(tái)對(duì) raw 設(shè)備的配置在 redhat 5 之后有了變化。在 redhat 5 之前,直接配置 /etc/sysconfig/rawdevices 件,通過(guò) /etc/init.d/rawdevices 來(lái)管理 raw 設(shè)備的啟動(dòng)和關(guān)閉。在 Redhat 5 之后,原來(lái)的 raw 設(shè)備接口已經(jīng)取消了,redhat 5 中通過(guò) udev 規(guī)則進(jìn)行配置。要配置,需要編輯 /etc/udev/rules.d/60-raw.rules
這個(gè)文件。
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
配置設(shè)備名稱,用你需要綁定的設(shè)備名稱替換 device name(如:/dev/sda1),X 為裸設(shè)備號(hào)
主 / 次號(hào)碼:
ACTION== add , ENV{MAJOR}= A , ENV{MINOR}= B , RUN+= raw /dev/raw/rawX %M %m
A 和 B 是設(shè)備的主 / 次號(hào)碼,X 是系統(tǒng)使用的 raw 設(shè)備號(hào)碼。
個(gè)人對(duì) redhat 管理 raw 的過(guò)程理解為:在 redhat 5 中,是通過(guò) udev 來(lái)管理 raw 設(shè)備的,而 udev 是通過(guò) MAJOR 和 MINOR 來(lái)識(shí)別 raw 設(shè)備。故需要將設(shè)備號(hào)和裸設(shè)備號(hào)進(jìn)行綁定,而主設(shè)備號(hào)和次設(shè)備號(hào)可以自行指定或者由系統(tǒng)自動(dòng)分配。根據(jù) red hat 的官方文檔中關(guān)于 raw.rule 的示例中說(shuō) KERNEL==.. 或 ENV{MAJOR}… 只需要任意配置一個(gè)就可以,但有些網(wǎng)友經(jīng)過(guò)試驗(yàn),驗(yàn)證必須二者同時(shí)配置才可以。
配置 /etc/udev/rules.d/60-raw.rules
文件
查看磁盤(pán)分區(qū)情況
# 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
啟動(dòng) raw 設(shè)備
# 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
這里筆者不清楚為什么主設(shè)備號(hào)和復(fù)設(shè)備號(hào)并不和我在 /etc/udev/rules.d/60-raw.rules
指定的一樣,望了解的讀者告知,系統(tǒng)內(nèi)核信息如下
# 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)
可以通過(guò)如下方式指定主設(shè)備號(hào)和復(fù)設(shè)備號(hào)
# 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 目錄不存在的話會(huì)被自動(dòng)創(chuàng)建。執(zhí)行這個(gè)命令,就會(huì)在 /dev/raw 下生成一個(gè)對(duì)應(yīng)的 raw[n]文件用命令方式綁定裸設(shè)備在系統(tǒng)重啟后會(huì)失效。
刪除裸設(shè)備
# 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
以上設(shè)置必須同時(shí)修改 /etc/udev/rules.d/60-raw.rules
才能保證重啟后生效,否則重啟后系統(tǒng)會(huì)重新讀取/etc/udev/rules.d/60-raw.rules
如需設(shè)置 raw 設(shè)備的用戶和權(quán)限信息,可在 /etc/udev/rules.d/60-raw.rules
文件里添加如下信息:
ACTION== add , KERNEL== raw1 , OWNER= dave , GROUP= tianlesoftware , MODE= 660
如果有多個(gè) raw 設(shè)備,可以寫(xiě)成:
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]
注意:在內(nèi)核 2.6.9-89.5AXS2 之前使用 /etc/sysconfig/rawdevices 和 /etc/udev/permissions.d/50-udev.permissions 進(jìn)行 raw 設(shè)備的配置和權(quán)限管理。在內(nèi)核 2.6.18-128.7AXS3 以后則使用了本文介紹的 /etc/udev/rules.d/60-raw.rules
進(jìn)行 raw 設(shè)備的管理
確定裸設(shè)備的大小
比較笨的辦法是,找出看裸設(shè)備對(duì)應(yīng)的是那個(gè)實(shí)際的塊設(shè)備,然后用 fdisk -l /dev/[h,s]dXN 看那個(gè)塊設(shè)備的大小就好了。比較簡(jiǎn)單的辦法是用 blockdev 命令來(lái)計(jì)算,如:
#blockdev –getsize /dev/raw/raw1
11718750
11718750 表示有多少 OS BLIOCK。
一般一個(gè) OS BLOCK 大小是 512 字節(jié),所以 11718750*512/1024/1024= 5722(m) 就是裸設(shè)備的大小。
使用裸設(shè)備作為 oracle 的數(shù)據(jù)文件的注意事項(xiàng)
1、一個(gè)裸設(shè)備只能放置一個(gè)數(shù)據(jù)文件
2、數(shù)據(jù)文件的大小不能超過(guò)裸設(shè)備的大小
如果是日志文件,則裸設(shè)備最大可用大小 = 裸設(shè)備對(duì)應(yīng)分區(qū)大小 – 1 * 512(保留一個(gè) redo lock)
如果是數(shù)據(jù)文件,則裸設(shè)備最大可用大小 = 裸設(shè)備對(duì)應(yīng)分區(qū)大小 – 2 * db_block_size(保留兩個(gè) block)
為了簡(jiǎn)單起見(jiàn),對(duì)所有的文件設(shè)置稱比裸設(shè)備小 1M 即可。
3、數(shù)據(jù)文件最好不要設(shè)置稱自動(dòng)擴(kuò)展,如果設(shè)置稱自動(dòng)擴(kuò)展,一定要把 maxsize 設(shè)置設(shè)置為比裸設(shè)備小
4、linux 下 oracle 不能直接把邏輯卷作為裸設(shè)備,也要進(jìn)行綁定。unix 下就不需要。
感謝各位的閱讀,以上就是“l(fā)inux raw 是原始數(shù)據(jù)格式嗎”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì) linux raw 是原始數(shù)據(jù)格式嗎這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是丸趣 TV,丸趣 TV 小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!