通用執行緒: 高階檔案系統實現者指南,第 4 部分(來自IBM)

tonykorn97發表於2006-11-06

介紹 devfs

伴隨著 Linux 2.4 版本的發行,出現了大量的檔案系統可能性,其中包括 ReiserFS、XFS、GFS 和其它檔案系統。這些檔案系統聽起來的確都很酷,但是它們真正能做些什麼呢,擅長在哪些方面,以及在 Linux 產品環境下如何才能安全地使用它們呢?Daniel Robbins 透過向您展示如何在 Linux 2.4 的環境下建立這些新的高階檔案系統來回答以上的問題。遵從這個方法,它提供了在實際實現過程中的有價值的建議、效能資訊和重要的技術性注意要點,以便於您在新的檔案系統中能有令人愉快的經歷。在本文中:Daniel 解釋了使用裝置管理檔案系統 devfs 的意義和好處,讓您對其有所認識以便在下一篇文章中向您展示如何最佳地在系統上安裝 devfs。

http://www-128.ibm.com/developerworks/cn/linux/filesystem/l-fs4/index.html


裝置,到處都是裝置

Devfs,也叫裝置檔案系統(Device Filesystem),設計它的唯一目的就是提供一個新的(更理性的)方式管理通常位於 /dev 的所有塊裝置和字元裝置。您也許知道,典型的 /dev 樹包含數百個塊特殊檔案和字元特殊檔案,它們全都在根檔案系統上。每個特殊檔案都可以讓使用者空間程式輕鬆地與核心裝置實現互動。舉例來說,透過對這些特殊檔案執行操作,您的 X 伺服器就能夠訪問影片硬體, fsck 可以執行檔案系統檢驗, lpd 可以透過並行埠向印表機傳送資料。

實際上,通常 Linux 和 Unix 更“酷”的方面是,裝置不是簡單地隱藏在晦澀的 API 之後,而是真正地與普通檔案、目錄和符號連結一樣存在於檔案系統上。因為字元和塊裝置是對映到普通檔案系統名稱空間的,我們通常可以用有意義的方式來與硬體互動,可以僅使用標準 Unix 命令,如 cat 和 dd。除了有趣之外,這還使我們有更強的能力,並提高生產力。

裝置管理問題

然而,雖然裝置特殊檔案本身是一件好事情,但典型的 Linux 系統以一種不太理想而且麻煩的方式管理這些特殊檔案。 如今,Linux 支援 很多不同種類的硬體。這意味著嚴格意義上我們中絕大多數在 /dev 中都有數百個特殊檔案來表示所有這些裝置。還不止這樣,這些特殊檔案中大多數甚至不會對映到系統中存在的裝置上(但需要它們存在,只是考慮到我們最終會在系統中新增新的硬體/驅動器),這讓事情變得更令人困惑。

僅從這個方面來看,我們就知道 /dev 需要徹底檢修,而建立 devfs 的明確目的就是讓 /dev 變回原形。為了很好地理解 devfs 是怎樣解決絕大多數 /dev 管理問題的,我們從裝置驅動程式的角度來看看 devfs。

裝置管理內幕


為了很好地理解 devfs ,最好是先理解從裝置驅動程式的角度來看 devfs 是怎樣改變事物的。傳統地(不使用 devfs),根據是否註冊在 塊裝置或 字元裝置,基於核心的裝置驅動程式透過呼叫 register_blkdev()或 register_chrdev() 向系統的其餘部分註冊裝置。

您必須提供一個 主裝置號(一個無符號 8 位整數)作為 register_blkdev()或 register_chrdev() 的引數;然後,在裝置註冊之後,核心就會知道這個特定的主裝置號對應於執行 register_--?dev()呼叫的特定裝置驅動程式。

那麼,裝置驅動程式開發人員為呼叫 register_--?dev() 提供的主裝置號 應該是什麼呢?如果開發人員不打算將裝置驅動程式與外界共享,那麼什麼號碼都可以,只要它與當前核心使用的其它主裝置號都不衝突即可。開發人員還可以選擇動態地分配 register_--?dev() 呼叫的裝置的主裝置號。然而,這樣的解決方案通常只是在驅動程式不會被其它人使用的情況下可行。

獲取號碼

然而,如果開發人員想讓驅動程式與外界共享(大多數 Linux 開發人員常常採用這一方法),那麼僅僅從“真空”中抽一個主裝置號或者使用動態的主裝置號分配就不行了。相反,開發人員必須聯絡 Linux 核心開發人員,這樣他(她)的特定的裝置才能分配一個“正式”主裝置號。那麼,在整個 Linux 世界中,這個特定的裝置(也 只有這個裝置)才會被關聯到那個特定的主裝置號。

有一個“正式的”主裝置號很重要,因為要與特定的裝置互動,管理員必須在 /dev 建立一個特殊檔案。當裝置節點(特殊檔案)建立後,它使用的主裝置號必須同核心內部使用的完全相同。這樣,程式對裝置執行操作時,核心就會知道應該引用什麼裝置驅動程式。讓特殊檔案到核心驅動程式的對映成為可能的是主裝置號,而不是真實的裝置名稱(它和非 devfs 系統無關)。

一旦裝置驅動程式具備正式主裝置號,裝置就可以被公開使用了,裝置節點也就可以開始併入不同分發版的 /dev 樹,還有它們的正式 /dev/MAKEDEV 指令碼(用來幫助超級使用者用正確的主從裝置號、許可權和所有權建立裝置節點的特殊指令碼)中。

傳統的問題

不幸的是,這種方法有很多可伸縮性問題。不僅裝置驅動程式開發人員聯絡核心開發人員來獲取正式主裝置號是一件討厭的事,核心開發人員弄清他們怎樣分配所有這些主裝置號甚至更加惱人。這種任務在很多方面很象系統管理員跟蹤公司區域網靜態 IP 地址分配的工作 ― 這並不十分有趣。正如系統管理員可以利用 DHCP 來緩解這種管理負擔,如果裝置註冊有某種類似的方法就好了。

不只是這樣,Linux 還正在耗盡主裝置號和副號碼。雖然這種問題可以透過簡單地擴充套件主裝置號和副號碼使用的位數,首先維護這些主裝置號對映就很討厭了,所以我們又在考慮有沒有更好的方法來處理這些事情。幸運的是,有這樣的方法;進入 devfs。


進入 devfs


devfs_register()

這裡是對 devfs 如何一下子處理事情和解決這些問題的一個簡單明瞭的快速綱要。一旦 devfs 被正確配置(包括在核心新增 devfs 支援和對啟動指令碼進行一些稍複雜的更改),超級使用者重新啟動系統。然後核心開始啟動,裝置驅動程式開始向系統的剩餘部分註冊裝置。您會記起在非 devfs 系統上, register_blkdev()和 register_chrdev() 呼叫(連同提供的主裝置號)正是用於這一目的。然而,現在啟用了 devfs,裝置驅動程式是用一種新的、改進了的核心呼叫來註冊裝置,稱為 devfs_register()。

這裡是 devfs_register() 呼叫有趣的地方。雖然為了相容性目的指定主裝置號和副號碼作為引數是可能的,但不再需要這樣了。相反, devfs_register()呼叫接受 裝置路徑(就是它在 /dev 下可能的出現形式)作為引數。舉例來說,假設 foo 裝置驅動程式希望使用 devfs 註冊裝置。它會提供一個 foo0 的引數給 devfs_register(),從而告訴核心應該在 devfs 名稱空間的根目錄建立一個新的 foo0 裝置。相應的, devfs_register() 在 devfs 名稱空間的根目錄新增 foo0裝置節點,並記錄這個新的 foo0 節點應該對映到核心中的 foo裝置驅動程式。

執行的 Devfs

一旦所有裝置驅動程式啟動並向核心註冊適當的裝置,核心就啟動 /sbin/init 和系統初始化指令碼開始執行。在啟動過程初期(在檔案系統檢查前),rc 指令碼將 devfs 檔案系統安裝在 /dev 中,/dev 包含了 devfs 名稱空間的表達。這意味著在安裝 /dev 後,所有註冊的裝置(如上面的 /dev/foo0)都可以訪問,就象在非 devfs 上一樣。當它們被訪問時,核心 透過 devfs 裝置名稱對映到合適的裝置驅動程式,而不是透過主裝置號。

這種系統的優點是,所有需要的裝置節點(沒有別的了)都由核心自動建立。這不僅僅意味著不再需要 MAKEDEV(因為所有註冊的裝置都只“出現”在 /dev 中),還意味著 /dev 不再被成百個“無用的”裝置節點所充斥。實際上,使用 devfs,您可以只要檢視 /dev 就知道系統上有什麼裝置。所以,如果您有一臺支援熱插拔的膝上型電腦,這意味著您甚至可以在您從系統中插入和拔出 PC 卡時魔術般地讓裝置從 /dev 中出現和消失。這讓 devfs 成為對以前笨拙局面的一個非常徹底和實用的解決方案。

devfs 的優點

Devfs 讓很多事變得容易許多。請考慮一下建立一張 Linux 可引導光碟的問題,它包括一個位於 CD 上的引導裝載器、一個 initrd、一個核心和一個回送檔案系統。當 CD 引導時,引導裝載器裝載核心和 initrd,然後核心執行 initrd 上的 /linuxrc指令碼。 /linuxrc 的主要任務是安裝 CD,從而使回送檔案系統本身也可以被安裝和訪問。

沒有 devfs, linuxrc 就需要“檢視” /dev 中的很多特殊檔案,它們可能有也可能沒有表示連線到系統的真實硬體。例如, linuxrc 會需要檢測 /dev/hdc、/dev/scd0、/dev/hdb 和其它的裝置以檢測“活動的”光碟驅動器裝置。在檢測程式中,很可能命中幾個“無用的”裝置節點。

然而,使用 devfs, linuxrc 只在 /dev/cdroms 中尋找,它包含了系統中所有和 活動的光碟驅動器相關聯的特殊檔案,不管是 IDE 的還是 SCSI 的。由於這種便捷的新式 devfs 約定,再不需要猜測了;只有活動的裝置才會列出,而且裝置檢測程式碼甚至不必擔心底層的光碟驅動器的細節,比如說它使用什麼 IDE 通道或者什麼 SCSI ID。實際上,這是 devfs 的另一個主要好處;在我下一篇文章中,我們會看到 devfs 下 /dev 中的裝置有全新的預設位置。

實際上,如果您想訪問一個特定的塊裝置(如磁碟、分割槽、光碟驅動器等等),事實上有 幾個不同的特殊檔案可以引用。例如,我的伺服器只有一個 SCSI 光碟驅動器;如果啟用了 devfs,我就可以透過安裝 /dev/cdroms/cdrom0 或 /dev/scsi/host0/bus0/target4/lun0/cd 訪問它。兩種都引用同一個裝置,我可以引用我認為最方便的特殊檔案。如果願意,我還可以使用一種老式的裝置名稱(/dev/sr0)訪問光碟驅動器,這都是因為有一個非常便捷的叫 devfsd的小程式。 devfsd 是一個有功能很多的程式,它負責建立老式的“相容性”特殊檔案,還允許您以很多種方式自定義 /dev。在我的下一篇文章中,我們會詳細討論 devfsd,到時我會一直引導您啟動 devfs 並在您自己的系統上執行它。在那之前,請參考下面的參考資料以瞭解更多關於 devfs 的資訊。


參考資料

您可以參閱本文在 developerWorks 全球站點上的 英文原文.


O'Reilly 的 Linux Device Drivers,2nd Edition 通常對那些想大體上學習更多關於裝置註冊和 Linux 裝置驅動程式程式設計的人來說,的確是本很好的書和參考資料。


一定要閱讀 Richard Gooch(Linux devfs 的創始人)的 Linux Devfs FAQ。它完全、詳細並最新。您還能要求什麼?


有一個 devfs 郵件列表可以使用。如果要訂閱,請發電子郵件到 ,並在訊息正文部分註明 subscribe。Devfs 清單檔案可以在 http://oss.sgi.com/projects/devfs/archive/獲得。


您可能還想訪問 Richard Gooch 的主頁;它包含 devfs 和其它一些好東西。


Linux Weekly News 是與最新的核心發展保持同步的很好的參考資料。

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

相關文章