udev

常駐程式

udev 是Linux kernel的裝置管理器,主要管理/dev目錄底下的裝置節點。它同時也是用來接替devfshotplug的功能,這意味着它要在添加/刪除硬件時處理/dev目錄以及所有用戶空間的行為,包括載入韌體時。

udev
開發者Greg Kroah-HartmanKay Sievers
首次發佈2003年11月,​20年前​(2003-11
目前版本
  • 255 (2023年12月6日;穩定版本)[1]
編輯維基數據連結
原始碼庫 編輯維基數據連結
程式語言C
作業系統Linux內核
類型裝置節點
許可協定GPLv2
網站官方網站

udev的最新版本依賴於升級後的Linux kernel 2.6.13的uevent介面的最新版本。使用新版本udev的系統不能在2.6.13以下版本啟動,除非使用noudev參數來禁用udev並使用傳統的/dev來進行裝置讀取。

2012年4月,udev被合併至systemd

概要

在傳統的Linux系統中,/dev目錄下的裝置節點為一系列靜態存在的檔案,而udev則動態提供了在系統中實際存在的裝置節點。雖然devfs提供了類似功能,udev的支持者也給出了很多udev實現得比devfs好的理由[2]

  • udev支援裝置的固定命名,而並不依賴於裝置插入系統的順序。預設的udev設置提供了儲存裝置的固定命名。可以使用其vid(vendor)、pid(device)、裝置名稱(model)等屬性或其父裝置的對應屬性來確認某一裝置。
  • udev完全在用戶空間執行,而不是像devfs在內核空間一樣執行。結果就是udev將命名策略從內核中移走,並可以在節點建立前用任意程式在裝置屬性中為裝置命名。

執行方式

udev是一個通用的內核裝置管理器。它以守護行程的方式執行於Linux系統,並監聽在新裝置初始化或裝置從系統中移除時,內核(通過netlink socket)所發出的uevent。

系統提供了一套規則用於匹配可發現的裝置事件和屬性的匯出值。匹配規則可能命名並建立裝置節點,並執行組態程式來對裝置進行設置。udev規則可以匹配像內核子系統、內核裝置名稱、裝置的物理等屬性,或裝置序列號的屬性。規則也可以請求外部程式提供資訊來命名裝置,或指定一個永遠一樣的自訂名稱來命名裝置,而不管裝置什麼時候被系統發現。

系統架構

udev系統可以分為三個部分:

  • libudev函數庫,可以用來取得裝置的資訊。
  • udevd守護行程,處於用戶空間,用於管理虛擬/dev
  • 管理命令udevadm,用來診斷出錯情況。

系統取得內核通過netlink socket發出的資訊。早期的版本使用hotplug,並在/etc/hotplug.d/default添加一個連結到自身來達到目的。

命令格式

BUS 匯流排 KERNEL 內核名如sd* ID 裝置id 如匯流排id PLACE

SYSFS{filename} 或 ATTR{filename}

PROGRAM 呼叫外部程式 RESULT 匹配program返回的結果 NAME

SYMLINK 連接規則

編寫規則

udev設定檔是/etc/udev/udev.conf,檔案內容中很重要的一項是指定udev規則儲存的目錄,形如udev_rules=「/etc/udev/rules.d」. 指定的目錄中儲存一系列以.rules結束的規則檔案,每個檔案處理一系列規則來幫助udev分配名字給裝置檔案並保證內核可以辨識此名字。

規則檔案由系列鍵-值對組成,鍵值對分兩類:匹配鍵(使用運算子"==","!="等)和賦值鍵(使用"=","+=",":="等)。匹配鍵判斷規則是否應被應用,賦值鍵可以被分配一到多個值。

有些常用的鍵已經有了固定的含義,這裏列舉出最基本的幾個。這也是基本規則之一,更多編輯規則請參見man udev頁。

  • KERNEL - 匹配裝置的內核名字
  • SUBSYSTEM - 匹配裝置的子系統
  • DRIVER - 匹配裝置驅動名
  • NAME - 應當被採用為裝置節點的名字
  • SYMLINK - 一系列被作為裝置節點替補名字的符號連結

常用鍵舉例:KERNEL=="hdb", DRIVER=="ide-disk", NAME="my_spare_disk", SYMLINK+="sparedisk"

作者

udev由Greg Kroah-HartmanKay Sievers共同開發,並得到Dan Stekloff等人的幫助。

參見

外部連結

參考文獻

  1. ^ Release 255. 2023年12月6日 [2023年12月19日]. 
  2. ^ udev and devfs - The final word. 2003-12-30 [2008-01-13]. (原始內容存檔於2011-04-11) (英語).  Authors list列表中的|first1=缺少|last1= (幫助)