天天看點

怎樣在Linux 5上添加裸裝置映射 在紅帽企業Linux 5上怎樣添加裸裝置映射?

解決方法:

裸裝置接口在紅帽企業linux 5上已經被去掉了。現在可以通過udev規則配置裸裝置。

為了添加裸裝置映射,在/etc/udev/rules.d/60-raw.rules 添加一行,格式和下面的一樣:

主/從号:

以需要邦定的裝置名(例如/dev/sda1)替換上面的<device name>。"a"和"b"是需要邦定的主/從号。"x"是系統将要使用的裸裝置的序号。

如果之前存在一個大的/etc/sysconfig/rawdevices檔案,可以使用下面的腳本作轉換:

as5 和as4 的方法完全不同

as5

設定重新啟動自動挂載裸裝置

vi /etc/udev/rules.d/60-raw.rules

action=="add", kernel=="sdd1", run+="/bin/raw /dev/raw/raw1 %n"

action=="add", kernel=="sde1", run+="/bin/raw /dev/raw/raw2 %n"

action=="add", kernel=="sdf1", run+="/bin/raw /dev/raw/raw3 %n"

as4 

vi /etc/sysconfig/rawdevices

/dev/raw/raw1 /dev/sdc1

/dev/raw/raw2 /dev/sdd1 

# /sbin/service rawdevices restart 

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

綁定裸裝置

raw /dev/raw/raw<n> /dev/<blockdev>

删除裸裝置

raw /dev/raw/raw<n> 0 0

如用raw /dev/raw/raw1 0 0 删除裸裝置/dev/raw/raw1

1、什麼裸裝置?字元裝置?塊裝置?

裸裝置:也叫裸分區(原始分區),是一種沒有經過格式化,不被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、如何知道目前綁定了什麼裸裝置?

rqw -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) 就是裸裝置的大小。

11、資料庫中可以同時以檔案和裸裝置作為資料檔案嗎?

可以。甚至在同一個表空間中,也可以部分資料檔案用檔案系統,部分檔案用裸裝置。

但是不建議這樣做,因為會增加管理的複雜度。

12、可以把至于裸裝置的資料檔案設成自動擴充嗎?

可以,但同時要設定maxsize,且maxsize不能超過:裸裝置大小 - 2*db_block_size

13、如何修改裸裝置的預設權限

1)要修改/etc/rc.d/rc.local檔案,加入如下:

chown root:oinstall /dev/raw/raw1

chown root:oinstall /dev/raw/raw2

chown root:oinstall /dev/raw/raw3

...

chmod 660 /dev/raw/raw1

chmod 660 /dev/raw/raw2

chmod 660 /dev/raw/raw3

2)實際上還有更簡單的方法就是,修改/etc/udev/permissions.d/50-udev.permissions檔案:

raw/*:root:oinstall:0660

這樣就可以了!

14、如何取消裸裝置的綁定

用raw把major and minor設成0就可以取消裸裝置的綁定。如:

raw /dev/raw/raw1 0 0

這個指令取消綁定裸裝置的綁定,/dev/raw/raw1會被删除

15、裸裝置可以綁定的對象可以什麼?

可以綁定整個沒有分區的硬碟、可以綁定硬碟的某個分區、可以綁定邏輯卷等。

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

如果你使用linux比較長時間了,那你就知道,在對待裝置檔案這塊,linux改變了幾次政策。在linux早期,裝置檔案僅僅是是一些帶有适當的屬性 集的普通檔案,它由mknod指令建立,檔案存放在/dev目錄下。後來,采用了devfs,一個基于核心的動态裝置檔案系統,他首次出現在2.3.46 核心中。mandrake,gentoo等linux分發版本采用了這種方式。devfs建立的裝置檔案是動态的。但是devfs有一些嚴重的限制,從 2.6.13版本後移走了。目前取代他的便是文本要提到的udev--一個使用者空間程式。

目前很多的linux分發版本采納了udev的方式,因為它在linux裝置通路,特别是那些對裝置有極端需求的站點(比如需要控制上千個硬碟)和熱插拔裝置(比如usb攝像頭和mp3播放器)上解決了幾個問題。下面我我們來看看如何管理udev裝置。

實 際上,對于那些為磁盤,終端裝置等準備的标準配置檔案而言,你不需要修改什麼。但是,你需要了解udev配置來使用新的或者外來裝置,如果不修改配置,這 些裝置可能無法通路,或者說linux可能會采用不恰當的名字,屬組或權限來建立這些裝置檔案。你可能也想知道如何修改rs-232序列槽,音頻裝置等檔案 的屬組或者權限。這點在實際的linux實施中是會遇到的。

為什麼使用udev

在此之前的裝置檔案管理方法(靜态檔案和devfs)有幾個缺點:

* 不确定的裝置映射。特别是那些動态裝置,比如usb裝置,裝置檔案到實際裝置的映射并不可靠和确定。舉一個例子:如果你有兩個usb列印機。一個可能稱為 /dev/usb/lp0,另外一個便是/dev/usb/lp1。但是到底哪個是哪個并不清楚,lp0,lp1和實際的裝置沒有一一對應的關系,因為他 可能因為發現裝置的順序,列印機本身關閉等原因而導緻這種映射并不确定。理想的方式應該是:兩個列印機應該采用基于他們的序列号或者其他辨別資訊的唯一設 備檔案來映射。但是靜态檔案和devfs都無法做到這點。

*沒有足夠的主/輔裝置号。我們知道,每一個裝置檔案是有兩個8位的數字:一個是主裝置号 ,另外一個是輔裝置号來配置設定的。這兩個8位的數字加上裝置類型(塊裝置或者字元裝置)來唯一辨別一個裝置。不幸的是,關聯這些身邊的的數字并不足夠。

*/dev目錄下檔案太多。一個系統采用靜态裝置檔案關聯的方式,那麼這個目錄下的檔案必然是足夠多。而同時你又不知道在你的系統上到底有那些裝置檔案是激活的。

*命名不夠靈活。盡管devfs解決了以前的一些問題,但是它自身又帶來了一些問題。其中一個就是命名不夠靈活;你别想非常簡單的就能修改裝置檔案的名字。預設的devfs指令機制本身也很奇怪,他需要修改大量的配置檔案和程式。;

*核心記憶體使用,devfs特有的另外一個問題是,作為核心驅動子產品,devfs需要消耗大量的記憶體,特别當系統上有大量的裝置時(比如上面我們提到的系統一個上有好幾千磁盤時)

udev的目标是想解決上面提到的這些問題,他通采用使用者空間(user-space)工具來管理/dev/目錄樹,他和檔案系統分開。知道如何改變預設配置能讓你之大如何定制自己的系統,比如建立裝置字元連接配接,改變裝置檔案屬組,權限等。

udev配置檔案

主要的udev配置檔案是/etc/udev/udev.conf。這個檔案通常很短,他可能隻是包含幾行#開頭的注釋,然後有幾行選項:

udev_root="/dev/"

udev_rules="/etc/udev/rules.d/"

udev_log="err"

上面的第二行非常重要,因為他表示udev規則存儲的目錄,這個目錄存儲的是以.rules結束的檔案。每一個檔案處理一系列規則來幫助udev配置設定名字給裝置檔案以保證能被核心識别。 

你 的/etc/udev/rules.d下面可能有好幾個udev規則檔案,這些檔案一部分是udev包安裝的,另外一部分則是可能是别的硬體或者軟體包生 成的。比如在fedora core 5系統上,sane-backends包就會安裝60-libsane.rules檔案,另外initscripts包會安裝60-net.rules文 件。這些規則檔案的檔案名通常是兩個數字開頭,它表示系統應用該規則的順序。

規則檔案裡的規則有一系列的鍵/值對組成,鍵/值對之間用逗 号(,)分割。每一個鍵或者是使用者比對鍵,或者是一個指派鍵。比對鍵确定規則是否被應用,而指派鍵表示配置設定某值給該鍵。這些值将影響udev建立的裝置文 件。指派鍵可以處理一個多值清單。比對鍵和指派鍵操作符解釋見下表:

這有點類似我們常見的程式設計語言,比如c語言。隻是這裡的鍵一次可以處理多個值。有一些鍵在udev規則檔案裡經常出現,這些鍵的值可以使用通配符(*,?,甚至範圍,比如[0-9]),這些常用鍵列舉如下:

我們給出一個列子來解釋如何使用這些鍵。下面的例子來自fedora core 5系統的标準配置檔案。

kernel=="*", owner="root" group="root", mode="0600"

kernel=="tty", name="%k", group="tty", mode="0666", options="last_rule"

kernel=="scd[0-9]*", symlink+="cdrom cdrom-%k"

kernel=="hd[a-z]", bus=="ide", sysfs{removable}=="1", sysfs{device/media}=="cdrom", symlink+="cdrom cdrom-%k"

action=="add", subsystem=="scsi_device", run+="/sbin/modprobe sg"

上面的例子給出了5個規則,每一個都是kernel或者action鍵開頭:

*第一個規則是預設的,他比對任意被核心識别到的裝置,然後設定這些裝置的屬組是root,組是root,通路權限模式是0600(-rw-------)。這也是一個安全的預設設定保證所有的裝置在預設情況下隻有root可以讀寫。

*第二個規則也是比較典型的規則了。它比對終端裝置(tty),然後設定新的權限為0600,所在的組是tty。它也設定了一個特别的裝置檔案名:%k。在這裡例子裡,%k代表裝置的核心名字。那也就意味着核心識别出這些裝置是什麼名字,就建立什麼樣的裝置檔案名。

*第三行開始的kernel=="scd[0-9]*",表示 scsi cd-rom 驅動. 它建立一對裝置符号連接配接:cdrom和cdrom-%k。

*第四行,開始的 kernel=="hd[a-z]", 表示ata cdrom驅動器。這個規則建立和上面的規則相同的符号連接配接。ata cdrom驅動器需要sysfs值以來差別别的ata裝置,因為scsi cdrom可以被核心唯一識别。. 

*第五行以 action=="add"開始,它告訴udev增加 /sbin/modprobe sg 到指令清單,當任意scsi裝置增加到系統後,這些指令将執行。其效果就是計算機應該會增加sg核心子產品來偵測新的scsi裝置。

當然,上面僅僅是一小部分例子,如果你的系統采用了udev方式,那你應該可以看到更多的規則。如果你想修改裝置的權限或者建立信的符号連接配接,那麼你需要熟讀這些規則,特别是要仔細注意你修改的那些與之相關的裝置。

修改你的udev配置

在修改udev配置之前,我們一定要仔細,通常的考慮是:你最好不要修改系統預置的那些規則,特别不要指定影響非常廣泛的配置,比如上面例子中的第一行。不正确的配置可能會導緻嚴重的系統問題或者系統根本就無法這個正确的通路裝置。

而 我們正确的做法應該是在/etc/udev/rules.d/下建立一個信的規則檔案。确定你給出的檔案的字尾是rules檔案名給出的數字序列應該比标 準配置檔案高。比如,你可以建立一個名為99-my-udev.rules的規則檔案。在你的規則檔案中,你可以指定任何你想修改的配置,比如,假設你修 改修改floppy裝置的所在組,還準備建立一個信的符号連接配接/dev/floppy,那你可以這麼寫:

kernel=="fd[0-9]*", group="users",   symlink+="floppy"

有些發行版本,比如fedora,采用了外部腳本來修改某些特定裝置的屬組,組關系和權限。是以上面的改動可能并不見得生效。如果你遇到了這個問題,你就需要跟蹤和修改這個腳本來達到你的目的。或者你可以修改program或run鍵的值來做到這點。

某些規則的修改可能需要更深的挖掘。比如,你可能想在一個裝置上使用sysfs資訊來唯一辨別一個裝置。這些資訊最好通過udevinfo指令來擷取。

$ udevinfo –a –p $(udevinfo –q path  –n /dev/hda)

上 面的指令兩次使用udevinfo:一次是傳回sysfs裝置路徑(他通常和我們看到的linux裝置檔案名所在路徑--/dev/hda--不同);第 二次才是查詢這個裝置路徑,結果将是非常常的syfs資訊彙總。你可以找到最夠的資訊來唯一标志你的裝置,你可以采用适當的替換udev配置檔案中的 sysfs選項。下面的結果就是上面的指令輸出

[root@localhost rules.d]# udevinfo -a -p $(udevinfo -q path    -n  /dev/hda1)

udevinfo starts with the device specified by the devpath and then

walks up the chain of parent devices. it prints for every device

found, all possible attributes in the udev rules key format.

a rule to match, can be composed by the attributes of the device

and the attributes from one single parent device.

 looking at device '/block/hda/hda1':

   kernel=="hda1"

   subsystem=="block"

   driver==""

   attr{stat}=="    1133     2268        2        4"

   attr{size}=="208782"

   attr{start}=="63"

   attr{dev}=="3:1"

 looking at parent device '/block/hda':

   kernels=="hda"

   subsystems=="block"

   drivers==""

   attrs{stat}=="   28905    18814  1234781   302540  

 34087   133247   849708   981336  

     0   218340  1283968"

   attrs{size}=="117210240"

   attrs{removable}=="0"

   attrs{range}=="64"

   attrs{dev}=="3:0"

 looking at parent device '/devices/pci0000:00/0000:00:1f.1/ide0/0.0':

   kernels=="0.0"

   subsystems=="ide"

   drivers=="ide-disk"

   attrs{modalias}=="ide:m-disk"

   attrs{drivename}=="hda"

   attrs{media}=="disk"

 looking at parent device '/devices/pci0000:00/0000:00:1f.1/ide0':

   kernels=="ide0"

   subsystems==""

 looking at parent device '/devices/pci0000:00/0000:00:1f.1':

   kernels=="0000:00:1f.1"

   subsystems=="pci"

   drivers=="piix_ide"

   attrs{broken_parity_status}=="0"

   attrs{enable}=="1"

   attrs{modalias}=="pci:v00008086d000024casv0000144dsd0000c009bc01sc01i8a"

   attrs{local_cpus}=="1"

   attrs{irq}=="11"

   attrs{class}=="0x01018a"

   attrs{subsystem_device}=="0xc009"

   attrs{subsystem_vendor}=="0x144d"

   attrs{device}=="0x24ca"

   attrs{vendor}=="0x8086"

 looking at parent device '/devices/pci0000:00':

   kernels=="pci0000:00"

舉 一個例子:假設你想修改usb掃描器的配置。通過一系列的嘗試,你已經為這個掃描器辨別了linux裝置檔案(每次打開掃描器時,名字都會變)。你可以使 用上面的指令替換這個正确的linux裝置檔案名,然後定位輸出的采用sysfs{idvendor}行和sysfs{idproduct}行。最後你可 以使用這些資訊來為這個掃描器建立新的選項。

sysfs{idvendor}=="0686", \

sysfs{idproduct}=="400e", \

symlink+="scanner", mode="0664", \

group="scanner"

上面的例子表示将掃描器的組設定為scanner,通路權限設定為0664,同時建立一個/dev/scanner的符号連接配接。

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

繼續閱讀