Linux下有專門的文件系統用來對裝備進行管理,devfs和sysfs就是其中的兩種。在2.6內核之前使用的是devfs,而devfs掛載于/dev目錄下,提供了1種類似于文件的方法來管理位于/dev目錄下的所有裝備,我們知道/dev目錄下的每個文件對應的都是1個裝備,而且這些特殊文件是位于根文件系統上的,在制作文件系統的時候我們就已建立了這些裝備文件,因此通過操作這些特殊文件,可以實現與內核進行交互。
但是devfs文件系統有1些缺點:(1)比如不肯定的裝備映照,有時候1個裝備映照的裝備文件可能不同,比如我們的U盤可能對應sda也可能對應sdb。(2)比如沒有足夠的主/輔裝備號,當裝備過量的時候,這會成為1個問題。(3)/dev目錄下文件太多而且不能表示當前系統上的實際裝備。(4)命名不夠靈活,不能任意指定。
在Linux2.6以后,引入了新的文件系統sysfs,它掛載于/sys目錄下,跟devfs1樣,它也是1個虛擬文件系統,也是用來對系統的裝備進行管理的,它把實際鏈接到系統上的裝備和總線組織成1個分級的文件,用戶空間的程序一樣可以利用這些信息以實現和內核的交互,該文件系統是當前系統上實際裝備樹的1個直觀反應,他是通過kobject子系統來建立這個信息的,當1個kobject被創建的時候,對應的文件和目錄卡也就被建立了,位于/sys下的相干目錄,既然每一個裝備在sysfs中都有唯1對應的目錄,那末也就能夠被用戶空間讀寫了。
用戶空間的工具udev就是利用了sysfs提供的信息來實現所有devfs的功能的,但是不同的是udev是運行在用戶空間的,而devfs是運行在內核空間,而且udev不存在devfs那些先天的缺點。因此,sysfs是未來的發展方向。
udev是1個工具,他能夠根據系統中的硬件裝備的狀態更新裝備文件,包括裝備文件的創建、刪除等等。裝備文件通常放置在/dev目錄下,使用udev后,在/dev下面只包括系統中真實存在的裝備。它是和硬件平臺無關的,位于用戶空間,需要內核sysfs和tmpfs的支持,sysfs位udev提供裝備入口和uevent通道,而tmpfs為udev裝備文件提供寄存空間。
udev完全在用戶態工作,利用裝備加入或移除時內核所發送的hotplug事件來工作。關于裝備的詳細信息是由內核輸出到位于/sys的sysfs文件系統的。所有的裝備命名策略、權限控制和事件處理都是在用戶態下完成的。但是devfs則是位于內核的1部份工作的。
udev是用來管理/dev的,不是用來加載內核驅動的,因此udev不會在不存在的節點被打開的時候自動加載驅動。系統中所有的裝備都應當產生hotplug事件、加載適當的驅動,而udev將會注意到這1點并且為它創建對應的裝備節點,如果你我們不想讓所有的裝備驅動停留在內存當中,我們應當使用其他的東西來管理我們的模塊,它不是udev的工作。devfs使用的方法曾致使了大量無用的modprobe嘗試,以此程序探測裝備是不是存在。每一個摸索性檢測都會新建1個運行modprobe的進程,而幾近所有這些都是無用的。
devfs的命名是不被建議而且不被官方支持的,由于它所使用的簡單枚舉裝備的方式在裝備可能被隨時加入或刪除的時候確切是1個比較笨的方法。而且這些編號帶給我們的只有麻煩,而且它們其實不能用來肯定裝備。
當內核檢測到在系統中出現了新裝備以后,內核會在sysfs文件系統中為該裝備生成1項新的記錄,1般sysfs文件系統會被mount到/sys目錄中。新紀錄是以1個或多個文件或目錄的方式來表示,每一個文件都包括有特定的信息。udev在系統中是以守護進程的方式udevd在運行,它通過某種途徑檢測到新裝備的出現,通過查找裝備對應的sysfs中的記錄得到裝備的1些信息。udev會根據/etc/udev/udev.conf文件中的udev_rules指定的目錄,逐一檢查該目錄下的文件,這個目錄的文件都是針對某類或某個裝備應當實施甚么措施的規則文件。udev讀取文件是依照文件名的ASCII字母順序來讀取的,如果udev1旦找到了與新加入的裝備匹配的規則,udev就會根據規則定義的措施對新裝備進行配置。同時不再讀后續的規則文件。
至于udev不管裝備連接的順序而保持1個統1的裝備名,udev通過對內核產生的裝備名增加別名的方式來到達上述目的的。udev是用戶模式程序,不會更改內核的行動。因此,內核仍然可以產生裝備名比如sda、sdb等等。但是udev可以根據裝備的其他信息,比如總線信息也就是bus、生產商也就是vendor等不同來辨別不同的裝備,并且產生裝備文件。udev只要為這個裝備文件取1個固定的文件名就能夠解決這個問題。在后續對裝備的操作中,只要援用新的裝備名就能夠了。但是為了保證最大限度的兼容,1般淶水,新裝備總是作為1個對內核自動產生的裝備名的符號鏈接來使用的。