裝置檔案系統教程(轉)

amyz發表於2007-08-10
裝置檔案系統教程(轉)[@more@]

  原文更新:2003年9月11日

  內容簡介:在本文件中,你將能瞭解到 devfs 的性質以及它的工作原理。

  1. 什麼是 devfs?

  


  在過去。。。。。。 

  在過去的 Linux 系統中提供了一個抽象化的裝置目錄,叫做 /dev。在該目錄中使用者可以找到裝置節點,這些特殊的檔案直接指向了系統中的硬體裝置。例如,/dev/hda 指向了系統中的第一個 IDE 裝置。利用這些提供給使用者的裝置檔案,他們可以編寫應用程式像訪問普通檔案一樣來訪問硬體,而不需要透過特殊的 API。

  裝置檔案分為兩類,稱作字元裝置與塊裝置,第一類包含了那些進行讀寫操作時不需要透過緩衝區的裝置。第二組自然包含了那些做讀寫操作時需要緩衝區的裝置。兩種裝置都可以在同一時間內讀取一個字元,或者一個塊。因此這意味著聲音的衝突是不可避免的。

  如果你檢視一個裝置檔案,你將會看到類似下面的內容:

程式碼 1.1: 檢視裝置檔案資訊

# ls -l /dev/hda

brw-rw----  1 root   disk    3, 0 Jul 5 2000 /dev/hda

  在上一個範例中我們看到 /dev/hda 是一個塊裝置。但是,更重要的是,它連結了兩個特殊的號碼 3,0。這對號碼稱為主-次對。它用於核心將該裝置檔案對映到真實裝置上。主編號指向了該裝置,而次編號指向了子裝置,這看起來衝突嗎?不會的。

  這裡有兩個範例為 /dev/hda4 和 /dev/tty5。第一個裝置檔案指向了第一個 IDE 裝置的第四個分割槽。它的主次對為3,4,在這裡,次編號指向了分割槽而主編號指向了裝置。第二個範例中,主次對為 3,4,在這裡,主編號指向到終端裝置,次編號指向終端編號(在這裡時第五個終端)。

  相關問題 

  如果你快速掃描一次 /dev 中的檔案,你將會發現其中不光不僅僅有你機器上的所有裝置,或者說在你機器上所有你可以看到的裝置,換句話說,你還有許多你並沒有指向該裝置的裝置檔案。至於如何管理這大量的裝置組將會在後面提到。你可以先想像一下改變你機器上所有裝置所對應的裝置檔案的許可權,然後將它們恢復過來。

  當你新增一個新裝置到你的系統中時,但是這個裝置之前並沒有對應的裝置檔案, 你應該自己建立一個,高階使用者可以很熟練地透過 /dev 中的 ./MAKEDEV 來做這件事情,但是你知道哪種裝置檔案需要你建立嗎?

  當你有了一個透過裝置檔案來訪問硬體的程式時,你不能將根目錄以只讀屬性載入,沒有其它辦法必須以可讀寫模式載入。並且你不能將 /dev 載入於任何一個單獨的分割槽上,因為 mount 命令需要 /dev 來載入分割槽。

  實際問題 

  你可以想像,核心開發者們當然找到了前面所提到的種種問題。不管怎樣,其中大多數問題能在這裡得到更詳細的描述 http://www.atnf.csiro.au/people/rgooch/linux/docs/devfs.html#faq-why。 我們現在並沒有在討論這些,但是請注意這些問題將直接關係到穩定版核心:devfs。

  devfs 就是解決方案 

  devfs 處理了所有的問題。它只是提供給使用者管理這些已有裝置的功能,當新硬體新增時的自動新增新的節點,使將根目錄以只讀屬性載入成為可能。以及解決了其它我們之前還沒有發現的問題。

  舉個例子,透過 devfs,你將可以逃離主次對管理的痛苦。它始終支援著(為了向後相容),但是不必要。它使 Linux 自動支援更多的裝置成為可能,知道沒有任何資源可以分配(數字總是有限的 :-))

  2. 裝置樹瀏覽

  


  目錄 

  首先你要注意的事情是 devs 透過裝置組目錄樹來組織裝置檔案。這種方式提高了可讀性,同事所有相關裝置都將放在其標準的目錄裡。

  舉個例子,所有的 IDE 相關裝置都在 /dev/ide/ 裝置目錄裡,而 SCSI 相關裝置在 /dev/scsi/。SCSI 和 IDE 磁碟在某種程度上有些相同點,這意味著他們可能在同一個子目錄結構裡。

  IDE 和 SCSI 磁碟透過其控制卡進行控制(可以是內建與主機板上的,也可以是單獨的控制卡),叫做控制器,每個控制卡可以有很多通道。一個通道匯流排。在每一個匯流排裡,還能有許多編號。假設某個編號控制著一個磁碟,該編號成為目標。許多 SCSI 裝置還可以有多個邏輯單元號(Logical Unit Numbers), 舉個例子某個裝置連結到多個媒體(如高階的磁帶裝置)。你通常只有一個邏輯單元號, lun0/。

  所以,當 /dev/hda4 如果已經被使用過了,我們會擁有一個 /dev/ide/host0/bus0/target0/lun0/part4。這將使管理容易很多。:)

註釋: 你同樣能使用類似 Unix 的磁碟命名方式來管理磁碟,如c0b0t0u0p2。他們能在/dev/ide/hd或者/dev/scsi/hd類似的路徑中找到。

  這裡是一個目錄範例,這是我的筆記本的目錄列表:

程式碼 2.1: /dev 目錄列表

cdroms/   cpu/    discs/     floppy/

ide/    input/   loop/      misc/

netlink/  printers/  pts/      pty/

scsi/    sg/     shm/      sound/

sr/     usb/    vc/       vcc/

  透過 devfsd 實現向後相容 

  使用新的聲音主題自然能夠增加情趣,但是許多工具和程式使用的是舊的主題。請確認你的系統執行正常,devfsd 正常執行。並且該守護程式建立了舊方式的名稱來指向裝置檔案。

程式碼 2.2: 建立連結

$ ls -l /dev/hda4

lr-xr-xr-x  1 root   root      33 Aug 25 12:08 /dev/hda4 -> ide/host0/bus0/target0/lun0/part4

  透過devfsd,你可以設定許可權,建立新的裝置檔案,定義行為動作(Actions)等。相關內容將在下一節中介紹

  3. 管理裝置樹

  


  重啟 devfsd 

  當你修改 /dev/devfsd.conf 配置檔案後,而你就想使修改在當前系統中生效,你不需要重新啟動。關於你的想法,你可以透過兩種“訊號”(Signal)中的任意一種來實現它。

  SIGHUP 將能夠使 devfsd 重新讀取配置檔案,重新讀取共享目標併為裝置樹中的子節點重新生成註冊資訊。

  SIGUSR1 也可以實現此目的,但不生成註冊資訊。

  要傳送訊號,可以簡單地透過 kill 或者 killall命令:

程式碼 3.1: 傳送 SIGHUP 訊號給devfsd

# kill -s SIGHUP `pidof devfsd`或者

# killall -s SIGHUP devfsd

  刪除相容連結 

警告: 目前,Gentoo 還無法脫離相容連結而正常執行。

  如果你想將 /dev 中凌亂的相容連結從你的 Gentoo 系統中刪除(Gentoo 是預設啟用它的),編輯你的 /etc/devfsd.conf 並刪除下面兩行:

程式碼 3.2: 透過 /etc/devfsd.conf 實現向後相容

# 註釋下面兩行以刪除符號連結

REGISTER    。* MKOLDCOMPAT

UNREGISTER   。* RMOLDCOMPAT

  你需要重新啟動以便使修改生效。

  刪除自動載入函式 

  當你載入一個核心模組時,devfs 將為它自動建立一個裝置檔案。如果你喜歡這樣,可以刪除 /etc/devfsd.conf 中的下列內容:

程式碼 3.3: /etc/devfsd.conf,自動載入函式

LOOKUP   。* MODLOAD

  4. 關於許可權

  


  透過 PAM 設定、修改許可權 

  雖然你可以在 /etc/devfsd.conf 設定許可權,但依然建議你透過可插拔驗證模組(Pluggable Authentication Module,PAM)來實現這一點。這是因為 PAM 才是最終的身份驗證方式,它可以使你在不改動 /etc/devfsd.conf 來改變裝置檔案許可權。

  PAM 使用 /etc/security/console.perms 檔案來配置許可權。該檔案包含兩部分:第一部分是組的詳細資訊,第二部分是許可權設定。

  讓我們首先來看一下組的設定。我們以聲音組來作為範例:

程式碼 4.1: /etc/security/console.perms 的聲音組許可權設定

=/dev/dsp* /dev/audio* /dev/midi*

  /dev/mixer* /dev/sequencer*

  /dev/sound/* /dev/snd/* /dev/beep

  /dev/admm*

  /dev/adsp* /dev/aload* /dev/amidi* /dev/dmfm*

  /dev/dmmidi* /dev/sndstat

  這裡的語法非常簡單:以一個組名開始,以該組中包含的裝置檔案結束。

  目前,組部分並不是非常通用在你還對其無法進行修改之前。所以在下一章中將介紹如何設定許可權。

程式碼 4.2: /etc/security/console.perms 裡聲音組的許可權配置

 0600    0600 root.audio

  第一部分是終端型別的檢查。在大多數系統中,這裡稱為“控制檯組”(console-group)。 PAM 將在每次啟動時檢查這一段。如果你在控制檯組裝置中登陸,PAM 將檢查並修改其中一些裝置檔案的許可權。

  第二部分包含了可登陸裝置檔案的許可權配置。當某人登陸進系統中時,該裝置檔案原預設的所有者/所有組,將會被 PAM 改為登陸使用者的使用者名稱和組。同時,許可權也在第二部分設定,在這裡,0600 將會被使用(所有者將對其擁有讀寫許可權,而其它使用者不行)。

  第三部分包含了裝置組中哪些裝置的許可權將被修改。在這裡,該聲音組(所有關於聲音的裝置)都將被修改。

  第四部分內容定義了了預設狀態下裝置檔案的許可權。在這裡,當這些裝置的所有者登出系統之後,PAM 將會將這些裝置檔案恢復成預設的許可權設定,而第四部分舊包含了具體的配置。

  第五部分內容定義了預設狀態下裝置檔案所有者(組)。在這裡當這些裝置的所有者登出系統之後,PAM 將會將這些裝置檔案恢復成預設的所有者,而第五部分舊包含了具體的配置。

  透過 devfsd 來設定、修改許可權 

  如果你希望透過 /etc/devfsd.conf 來修改許可權,你可以參考下列範例:

程式碼 4.3: /etc/devfsd.conf 中的許可權設定

REGISTER  ^cdroms/.* PERMISSIONS root.cdrom 0660

  第二部分內容是關於裝置組,以 /dev 開始。他是一個正規表示式,意味著你可以在一個規則裡選擇多個裝置。

  第四部分是關於裝置檔案的擁有者。不像 PAM 這裡不會改變(unless it is mentioned in console.perms since PAM always wins)。

  第五部分包含了裝置檔案的許可權設定。

  自定義許可權並透過 devfs 儲存改變後的設定 

  Gentoo 在預設情況下:當你 chown (改變所有者) 或者 chmod (修改許可權) 一些裝置檔案的許可權時,devfsd 將會在關機前自動儲存這些資訊。這是因為在 /etc/devfsd.conf 配置檔案中包含下面幾行:

程式碼 4.4: /etc/devfsd.conf 自動儲存許可權修改設定

REGISTER    ^pt[sy]/。*  IGNORE

CHANGE     ^pt[sy]/。*  IGNORE

CREATE     ^pt[sy]/。*  IGNORE

DELETE     ^pt[sy]   IGNORE

REGISTER    ^log     IGNORE

CHANGE     ^log     IGNORE

CREATE     ^log     IGNORE

DELETE     ^log     IGNORE

REGISTER    。*      COPY  /lib/dev-state/$devname $devpath

CHANGE     。*      COPY  $devpath /lib/dev-state/$devname

CREATE     。*      COPY  $devpath /lib/dev-state/$devname

DELETE     。*      CFUNCTION GLOBAL unlink

/lib/dev-state/$devname

RESTORE     /lib/dev-state

  在上面的內容中,被改變的裝置檔案將會在關機前被複製到 /lib/dev-state,並在開機時複製回 /dev。

  另一種方式時在啟動時將 /lib/dev-state 載入到 /dev,你必須確認 devfs 並沒有在開機時自動載入(這可能以為著你需要重新編譯核心),同時你的 /dev/console 存在。然後在你的開機自啟動指令碼開頭加上下面內容:

程式碼 4.5: 載入 /lib/dev-state 到 /dev

mount --bind /dev /lib/dev-state

mount -t devfs none /dev

devfsd /dev

  本文件內容按照協議釋出。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-941276/,如需轉載,請註明出處,否則將追究法律責任。

相關文章