udev 是linux kernel 2.6系列的裝置管理器。它主要的功能是管理/dev目錄底下的裝置節點。它同時也是用來接替devfs及hotplug的功能,這意味著它要在新增/刪除硬體時處理/dev目錄以及所有使用者空間的行為,包括載入firmware時。
udev系統由三個部分組成:
libudev函式庫,可以用來獲取裝置的資訊,/usr/include/libudev.h。
udevd守護程序,處於使用者空間,用於管理虛擬/dev
管理命令udevadm,用來診斷出錯情況,/usr/bin/udevadm。
udev是乙個通用的核心裝置管理器。它以守護程序的方式執行於linux系統,並監聽在新裝置初始化或裝置從系統中移除時,核心(通過netlinksocket)所發出的uevent。
系統提供了一套規則用於匹配可發現的裝置事件和屬性的匯出值。匹配規則可能命名並建立裝置節點,並執行配置程式來對裝置進行設定。udev規則可以匹配像核心子系統、核心裝置名稱、裝置的物理等屬性,或裝置序列號的屬性。規則也可以請求外部程式提供資訊來命名裝置,或指定乙個永遠一樣的自定義名稱來命名裝置,而不管裝置什麼時候被系統發現。下一部分介紹怎麼通過編寫udev規則檔案來管理udev裝置
主要的udev配置檔案是/etc/udev/udev.conf。這個檔案通常很短,可能只是包含幾行#開頭的注釋,然後有如下選項:
udev_root=「/dev/」
udev_rules=「/etc/udev/rules.d/」
udev_log=「err「
其中udev_rules非常重要,表示udev規則儲存的目錄,這個目錄儲存的是以.rules結束的檔案。每乙個檔案處理一系列規則來幫助udev分配名字給裝置檔案以保證能被核心識別。/etc/udev/rules.d下面可能有好幾個udev規則檔案,這些檔案一部分是udev包安裝的,另外一部分則是可能是別的硬體或者軟體包生成的。
下面介紹udev規則檔案的語法。
udev鍵/值對操作符
操作符匹配或賦值
解釋匹配
相等比較
匹配不等比較
賦值分配乙個特定的值給該鍵,他可以覆蓋之前的賦值。
賦值追加特定的值給已經存在的鍵
賦值分配乙個特定的值給該鍵,後面的規則不可能覆蓋它
udev常用的匹配賦值鍵
action
事件 (uevent) 的行為,例如:add( 新增裝置 )、remove( 刪除裝置 )。
kernel
核心裝置名稱,例如:sda, cdrom。
devpath
裝置的 devpath 路徑。
subsystem
裝置的子系統名稱,例如:sda 的子系統為 block。
bus裝置在 devpath 裡的匯流排名稱,例如:usb
driver
裝置在 devpath 裡的裝置驅動名稱,例如:ide-cdrom。
id裝置在 devpath 裡的識別號。
sysfs
sysfs: 裝置的 devpath 路徑下,裝置的屬性檔案「filename」裡的內容。
env環境變數。在一條規則中,可以設定最多五條環境變數的 匹配鍵。
program
呼叫外部命令。
result
外部命令 program 的返回結果
name
根據這個規則建立的裝置檔案的檔名。注意:僅僅第一行的name描述是有效的,後面的均忽略
symlink
根據規則建立的字元連線名
group
裝置檔案所在的組。
owner
裝置檔案的屬組
mode
裝置檔案的許可權,採用8進製
attrs
匹配裝置及其所有父裝置在sysfs中的屬性值。 如果指定了多個 attrs 匹配, 那麼必須在同乙個裝置上全部匹配成功,才算最終匹配成功
前面大致了解了udev相關的功能和原理,下面將描述如何通過libudev來實現相關功能。
libudev提供了在本地系統上檢測、列舉裝置的各種api函式。
libudev使用過程如下
(參考:
1. 初始化
首先呼叫udev_new,建立乙個udev library context。udev library context採用引用記數機制,建立的context預設引用記數為1,使用udev_ref和udev_unref增加或減少引用記數,如果引用記數為0,則釋放內部資源。
2. 列舉裝置
使用udev_enumrate_new建立乙個列舉器,用於掃瞄系統已接裝置。使用udev_enumrate_ref和udev_enumrate_unref增加或減少引用記數。
使用udev_enumrate_add_match/nomatch_***系列函式增加列舉的過濾器,過濾關鍵字以字元表示,如"block"裝置。
使用udev_enumrate_scan_***系列函式掃瞄/sys目錄下,所有與過濾器匹配的裝置。掃瞄完成後的資料結構是乙個鍊錶,使用udev_enumerate_get_list_entry獲取鍊錶的首個結點,使用udev_list_entry_foreach遍歷整個鍊錶。
3. 監控裝置插拔 udev的裝置插拔基於netlink實現。
使用udev_monitor_new_from_netlink建立乙個新的monitor,函式的第二個引數是事件源的名稱,可選"kernel"或"udev"。基於"kernel"的事件通知要早於"udev",但相關的裝置結點未必建立完成,所以一般應用的設計要基於"udev"進行監控。
使用udev_monitor_filter_add_match_subsystem_devtype增加乙個基於裝置型別的udev事件過濾器,例如: "block"裝置。
使用udev_monitor_enable_receiving啟動監控過程。監控可以使用udev_monitor_get_fd獲取乙個檔案描述符,基於返回的fd可以執行poll操作,簡化程式設計。
插拔事件到達後,可以使用udev_monitor_receive_device獲取產生事件的裝置對映。呼叫udev_device_get_action可以獲得乙個字串:"add"或者"remove",以及"change", "online", "offline"等,但後三個未知什麼情況下會產生。
4、獲取裝置資訊
使用udev_list_entry_get_name可以得到乙個裝置結點的sys路徑,基於這個路徑使用udev_device_new_from_syspath可以建立乙個udev裝置的對映,用於獲取裝置屬性。獲取裝置屬性使用udev_device_get_properties_list_entry,返回乙個儲存了裝置所有屬性資訊的鍊錶,使用udev_list_entry_foreach遍歷鍊錶,使用udev_list_entry_get_name和udev_list_entry_get_value獲取屬性的名稱和值。
首先得知道什麼是usb裝置的vid和pid。
據usb規範的規定,所有的usb裝置都有**商id(vid)和產品識別碼(pid),主機通過不同的vid和pid來區別不同的裝置,vid和pid都是兩個位元組長,其中,**商id(vid)由**商向usb執行論壇申請,每個**商的vid是唯一的,pid由**商自行決定,理論上來說,不同的產品、相同產品的不同型號、相同型號的不同設計的產品最好採用不同的pid,以便區別相同廠家的不同裝置。
上面提到,分別呼叫udev_new,udev_monitor_new_from_netlink,
udev_monitor_filter_add_match_subsystem_devtype,dev_monitor_enable_receiving,dev_monitor_get_fd,udev_monitor_receive_device函式來監控插入的裝置。如下圖所示
然後通過udev_device_get_sysattr_value(dev,"idvendor")判斷vid是否是該裝置的vid,通過udev_device_get_sysattr_value(dev,"idproduct")來判斷pid是否是該裝置的pid,如果都符合,那麼就能識別出這個裝置,然後進行相應的操作。
Linux udev 使用者空間裝置管理器
參考文獻 維基百科 udev官方文件 ibm developerworks 中國 本章正文 udev 是linux kernel 2.6系列的裝置管理器。它主要的功能是管理 dev目錄底下的裝置節點。它同時也是用來接替devfs及hotplug的功能,這意味著它要在新增 刪除硬體時處理 dev目錄以...
國際移動臺裝置識別碼 IMEI
國際移動客戶識別碼 imsi 為了在無線路徑和整個gsm移動通訊網上正確地識別某個移動客戶,就必須給移動客戶分配乙個特定的識別碼。這個識別碼稱為國際移動客戶識別碼 imsi 用於gsm移動通訊網所有信令中,儲存在客戶識別模組 sim hlr vlr中。imsi號碼結構為 mcc mnc msin m...
Linux無法識別移動裝置(U盤 行動硬碟)的問題
實驗室的伺服器突然不能夠自動掛載行動硬碟了。然後,就只能手動掛載了.在插入行動硬碟之前,先使用 more proc partitions 命令檢視系統的硬碟和分割槽情況。接好行動硬碟後,再用more proc partitions 命令檢視,發現了sdb 和它的四個磁碟分割槽sdb1,sdb2,sd...