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