理解和認識udev

2021-06-26 14:15:15 字數 3570 閱讀 1250

因 為本身從事儲存行業,在工作中多次碰到使用者有這樣的要求:我的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的說明文件,大致猜測它的工作過程可能是這樣的。

當核心檢測到在系統中出現了新裝置後,核心會在sysfs檔案系統中為該新裝置生成一項新的記錄,一般sysfs檔案系統會被 mount到 /sys目錄中。新記錄是以乙個或多個檔案或目錄的方式來表示。每個檔案都包含有特定的資訊。(資訊是如何表述的,還要另外研究?)

udev在系統中是以守護程序的方式udevd在執行,它通過某種途徑(到底什麼途徑,目前還沒搞懂。)檢測到新裝置的出現,通過查詢裝置對應的sysfs中的記錄得到裝置的一些資訊。

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

IIC認識和理解

有關於iic硬體部分,我這裡就不多做介紹了。首先我們要知道什麼是iic協議?簡單的說iic就一種主從架構的序列通訊匯流排協議,其實這句話如果你能理解到位的話,那麼對iic的理解也就差不多了。既然是一種通訊協議那麼必然有他的一些規則和特性在裡面,下面我們就先來談一談他們的特性和規則。首先是iic的特性...

C 認識 理解和運用 BufferedStream

bufferedstream類,可在另一流上新增並讀取乙個緩衝區,繼承stream抽象類。緩衝區是記憶體中的位元組塊,用於快取資料,從而減少對作業系統的呼叫失敗次數 處理大檔案速度快 緩衝區可提高讀取和寫入效能,使用緩衝區可進行讀取或寫入操作,但不能同時進行這兩種操作。1.需要用bufferedst...

關於CRM的理解和認識

crm 專案是乙個長期的旅程,不可能一蹴而就,必須作為階段性的有組織來進行,這樣每過一段時間就能有一段時間的收益。從呼叫中心到市場營銷 銷售 服務全都要有,一次到位很難做到 實施crm 重要的是設定正確的策略,企業必須要整合自己的流程和業務操作方法來滿足這個策略。你是不是已經有了乙個以客戶為中心的遠...