轉載,原帖地址:http://blog.chinaunix.net/u/6541/showart_396425.htmlhtml
由於自己從事存儲行業,在工做中屢次碰到用戶有這樣的要求:個人linux系統中原來有一塊SCSI硬盤,系統分配的設備文件是/dev/sda。如今新增長了一個外置的磁盤陣列,經過SCSI卡鏈接。但接上這個磁盤陣列後,/dev/sda變成了磁盤陣列的硬盤了,原來內置的SCSI硬盤變成了 /dev/sdb,我但願將設備文件固定下來。
過去,我老是對用戶說,這個比較麻煩,由於/dev/sda等文件都是linux內核自動分配的。很難固定下來,除非你更改加載SCSI卡驅動程序的順序,讓內置硬盤鏈接的SCSI卡比外接磁盤陣列鏈接的SCSI卡的驅動模塊先加載到內核,這樣就能保證/dev/sda老是指向內置的硬盤。但這種解決方法畢竟不太完美,並且對於其餘的即插即用設備,如USB設備等都不適用。
近來,經過安裝和升級linux-2.6內核,發現這個問題已經能夠經過2.6內核新的sysfs文件系統和udev程序獲得解決。下面就是我在學習了udev配置後的一點心得。我喜歡用FAQ的形式來講明。
問:什麼是udev?
答:udev是一種工具,它可以根據系統中的硬件設備的狀態動態更新設備文件,包括設備文件的建立,刪除等。設備文件一般放在/dev目錄下。使用udev後,在/dev目錄下就只包含系統中真正存在的設備。
問:udev支持什麼內核?
答:udev只支持linux-2.6內核,由於udev嚴重依賴於sysfs文件系統提供的信息,而sysfs文件系統只在linux-2.6內核中才有。
問:udev是一個內核程序仍是用戶程序?
答:udev是一個用戶程序(user-mode daemon)。
問:udev和devfs有什麼差異?
答:udev可以實現全部devfs實現的功能。但udev運行在用戶模式中,而devfs運行在內核中。據稱:devfs具備一些不太容易解決的先天缺陷。
問:udev的配置文件放在哪裏?
答:udev是一個用戶模式程序。它的配置文件是/etc/udev/udev.conf。這個文件通常缺省有這樣幾項:
linux
問:udev的工做過程是怎樣的?
答:因爲沒有研究過udev的源程序,不敢貿然就說udev的工做過程。我只是經過一些網上的資料和udev的說明文檔,大體猜想它的工做過程多是這樣的。
shell
問:udev的規則文件的語法是怎樣的?
答:udev的規則文件以行爲單位,以"#"開頭的行表明註釋行。其他的每一行表明一個規則。每一個規則分紅一個或多個「匹配」和「賦值」部分。「匹配」部分用「匹配「專用的關鍵字來表示,相應的「賦值」部分用「賦值」專用的關鍵字來表示。「匹配」關鍵字包括:ACTION,KERNEL,BUS, SYSFS等等,「賦值」關鍵字包括:NAME,SYMLINK,OWNER等等。具體詳細的描述能夠閱讀udev的man文檔。
下面舉個例子來講明一下,有這樣一條規則:
SUBSYSTEM=="net", ACTION=="add", SYSFS{address}=="00:0d:87:f6:59:f3", IMPORT="/sbin/rename_netiface %k eth0"
這個規則中的「匹配」部分有三項,分別是SUBSYSTEM,ACTION和SYSFS。而"賦值"部分有一項,是IMPORT。這個規則就是說,當系統中出現的新硬件屬於net子系統範疇,系統對該硬件採起的動做是加入這個硬件,且這個硬件在SYSFS文件系統中的「address」信息等於「00: 0d..."時,對這個硬件在udev層次施行的動做是調用外部程序/sbin/rename_netiface,傳遞的參數有兩個,一個是「%k」,表明內核對該新設備定義的名稱。另外一個是」eth0「。
從上面這個例子中能夠看出,udev的規則的寫法比較靈活的,尤爲在「匹配」部分中,能夠經過諸如」*「, 」?「,[a-c],[1-9]等shell通配符來靈活匹配多個匹配項。具體的語法能夠參考udev的man文檔。
問:udev怎樣作到無論設備鏈接的順序而維持一個統一的設備名?
答:實際上,udev是經過對內核產生的設備名增長別名的方式來達到上述目的的。前面說過,udev是用戶模式程序,不會更改內核的行爲。所以,內核依然會我行我素地產生設備名如sda,sdb等。可是,udev能夠根據設備的其餘信息如總線(bus),生產商(vendor)等不一樣來區分不一樣的設備,併產生設備文件。udev只要爲這個設備文件取一個固定的文件名就能夠解決這個問題。在後續對設備的操做中,只要引用新的設備名就能夠了。但爲了保證最大限度的兼容,通常來講,新設備名老是做爲一個對內核自動產生的設備名的符號連接(link)來使用的。
例如:內核產生了sda設備名,而根據信息,這個設備對應因而個人內置硬盤,那我就能夠制定udev規則,讓udev除了產生/dev/sda設備文件外,另外建立一個符號連接叫/dev/internalHD。這樣,我在fstab文件中,就能夠用/dev/internalHD來代替原來的 /dev/sda了。下次,因爲某些緣由,這個硬盤在內核中變成了sdb設備名了,那也不用着急,udev還會自動產生/dev/internalHD這個連接,並指向正確的/dev/sdb設備。全部其餘的文件像fstab等都不用修改。
問:怎樣才能找到這些設備信息,並把他們放到udev的規則文件中來匹配呢?
答:這個問題比較難,網上資料很少,我只找到一篇文章來介紹如何寫udev的規則。他的基本方法是經過udevinfo這個實用程序來找到那些能夠做爲規則文件裏的匹配項的項目。有這樣兩種狀況可使用這個工具:
第一種狀況是,當你把設備插入系統後,系統爲設備產生了設備名(如/dev/sda)。那樣的話,你先用udevinfo -q path -n /dev/sda,命令會產生一個該設備名對應的在sysfs下的路徑,如/block/sda。而後,你再用udevinfo -a -p /sys/block/sda,這個命令會顯示一堆信息,信息分紅不少塊。這些信息實際來自於操做系統維護的sysfs鏈表,不一樣的塊對應不一樣的路徑。你就能夠用這些信息來做爲udev規則文件中的匹配項。但須要注意的是,同一個規則只能使用同一塊中顯示的信息,不能跨塊書寫規則。
第二種狀況是,不知道系統產生的設備名,那就只有到/sys目錄下去逐個目錄查找了,反覆用udevinfo -a -p /sys/path...這個命令看信息,若是對應的信息是這個設備的,那就恭喜你。不然就再換個目錄。固然,在這種狀況下,成功的可能性比較小。
數據庫