茫茫網海中的冷日 - 對這文章發表回應
茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1675591 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
IMG_60D_00048.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

對這文章發表回應

發表限制: 非會員 可以發表

發表者: 冷日 發表時間: 2012/7/10 13:49:55

理解和認識udev

去論壇討論 來源: 作者: 發佈時間:2007-10-08

因為本身從事存儲行業,在工作中多次碰到用戶有這樣的要求:我的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。這個文件一般缺省有這樣幾項:


udev_root="/dev" ; udev產生的設備文件的根目錄是/dev
udev_db="/dev/.udevdb" ; 通過udev產生的設備文件形成的數據庫
udev_rules="/etc/udev/rules.d" ;用於指導udev工作的規則所在目錄。
udev_log="err" ;當出現錯誤時,用syslog記錄錯誤信息。

問:udev的工作過程是怎樣的?
答:由於沒有研究過udev的源程序,不敢貿然就說udev的工作過程。我只是通過一些網上的資料和udev的說明文檔,大致猜測它的工作過程可能是這樣的。

  1. 當內核檢測到在系統中出現了新設備後,內核會在sysfs文件系統中為該新設備生成一項新的記錄,一般sysfs文件系統會被mount到 /sys目錄中。新記錄是以一個或多個文件或目錄的方式來表示。每個文件都包含有特定的信息。(信息是如何表述的,還要另外研究?)
  2. udev在系統中是以守護進程的方式udevd在運行,它通過某種途徑(到底什麼途徑,目前還沒搞懂。)檢測到新設備的出現,通過查找設備對應的sysfs中的記錄得到設備的一些信息。
  3. udev會根據/etc/udev/udev.conf文件中的udev_rules指定的目錄,逐個檢查該目錄下的文件,這個目錄下的文件都是針對某類或某個設備應該施行什麼措施的規則文件。udev讀取文件是按照文件名的ASCII字母順序來讀取的,如果udev一旦找到了與新加入的設備匹配的規則,udev就會根據規則定義的措施對新設備進行配置。同時不再讀後續的規則文件。

問: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...這個命令看信息,如果對應的信息是這個設備的,那就恭喜你。否則就再換個目錄。當然,在這種情況下,成功的可能性比較小。


原文出處:理解和认识udev - Linux天空
內容圖示
url email imgsrc image code quote
樣本
bold italic underline linethrough   












 [詳情...]
validation picture

注意事項:
預覽不需輸入認證碼,僅真正發送文章時才會檢查驗證碼。
認證碼有效期10分鐘,若輸入資料超過10分鐘,請您備份內容後,重新整理本頁並貼回您的內容,再輸入驗證碼送出。

選項

Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|