FlossDoc: 請協力 GPLv3 的中文翻譯工作。
udev
FlossDoc,自由中文開源知識庫
udev 是 Linux 2.6 開始使用的裝置管理程式,負責管理 /dev 目錄下的裝置檔案。它取替了 devfs 和 hotplug 的工作,在有新硬體裝置插入或被移時處理 /dev 目錄和所有使用者空間 (user space) 的行動,包括載入韌體 (firmware) 等。2009-2010 年間,udev 更擴充兼具 HAL 的功能並逐步取而代之。
目录 |
歷史
/dev 的問題
在早期的 Linux,/dev 目錄下的裝置檔案全部是靜態檔案,是在安裝 GNU/Linux 時建立的。當要支援新硬體裝置,就需要使用 mknod 命令手動在 /dev 建立新的裝置檔案。隨著硬體的增多,/dev 目錄變得越來越大,加上早其 Linux 的檔案系統並沒有支援目錄索引,令在大目錄存取特定裝置檔案越來慢。事實上 /dev 目錄中數以百計的檔案中大部份都未必有直正連接對應的裝置,它們的存在只因方便對應硬體被插入時可以使用,非常浪費。這些檔案亦未能反映相關硬體是否真的存在。[1]
devfs
Linux 在 2.4 系列使用 devfs 企圖解決以上問題,但 devfs 亦帶來其他問題。devfs 將 /dev 變成類似 /proc 的虛擬檔案系統,按硬體是否被插入,自動產生或移除對應的裝置檔案。然而,devfs 採用和傳統 Linux 不同的裝置檔案命名方式,令不少軟件需要修改來配合。新硬體的裝置檔案命名亦變成 Linux 核心開發者們的責任。devfs 亦間接限制了所有可能的裝置檔案名稱和裝置檔案命名策略要存放在核心記憶體中,而核心記憶體是不能置換磁碟中,在非有新硬體插入時就顯得浪費。隨著 Linux 支援的硬體增多,花在裝置檔案命名策略的核心記憶體亦增大。
加上越來越多可移除裝置,實際用來識別硬體裝置的 major 和 minor 編號亦開始不足以應付。個別子系統如 USB 等要使用動態分配minor 編號或借用 major 編號來暫時應付問題。這亦令應用程式和使用者難以知道要應用硬體裝的 major 和 minor 編號。[2]
更重要,傳統上如 Fireware 硬碟和 USB 印表機等可移除裝置的裝置檔案命名是依插入次序,這令一個裝置在同一系統不同時間可能會有不同的裝置檔案名稱,引起混亂。[3]例如一個 USB 硬碟成為首個被插入電腦的 USB 裝置而被指定為 /dev/sdb,另一個 MP3 播放器成為第二個 被插入電腦的 USB 裝置而被指定為 /dev/sdc。但下一次兩個 USB 裝置插入次序改變了而令裝置名稱不同。MP3 播放器某次首首先被插入電腦而指定為 /dev/sdb,USB 硬碟則變成了 /dev/sdc。這令使用者及應用程式無所適從,音樂程式可能錯誤把原本同步入 MP3 播放器的歌曲檔案存放在 USB 硬碟,而備份程式又可能錯誤把備份存放在 MP3 播放器。這使用者每次設定裝置又很麻煩,而一般桌面使用者亦未必理解 /dev/sdb 這類檔案名稱的意思。devfs 依插口命名,亦令相同 USB 裝置在插入不同 USB 插口時有不同裝置名稱,亦有同樣問題。
sysfs 和 udev 的出現
Linux 2.5 開發時,引進了 sysfs 將硬體裝置的資訊以虛擬檔案系統形式呈現使用者空間 (userspace) 程式,確立了由使用者空間程式管理裝置的基礎。[4]2001 年,Greg Kroah-Hartman 開始開發一個完全使用者空間的裝置管理系統 udev 作為解決以上問題的更具彈性方案。[5]udev 同樣以是否被插入,自動在 /dev 建立或移除對應的裝置檔案。所有工作是由一個使用者空間的服務 udevd 負責,裝置命名是依存放在 /etc/udev 的設定決定。這令系統管理員和非核心開發者可簡易地修改,令更多人可以參予。udev 在 Linux 2.6 開始被正式應用,逐步取替 devfs。
早期 udev 是和 hotplug 配合。當有新硬件插入電腦時,Linux 核心會叫用 /proc/sys/kernel/hotplug 所指定的程式 (一般為 /sbin/hotplug) 。hotplug 會依核心提供的資料載入適當的驅動模組並叫用 udev 建立對應裝置檔案。這些工作由 udev 0.59 開始全由 udev 直接處理,hotplug 亦隨即退役。[6][2]
取替 HAL
udev 一直主要負責管理裝置檔案,而較高階的應用程式和硬體裝置通訊則由 HAL 負責。HAL 使用 D-Bus 把硬體裝置呈現成抽象化物件讓應用程式可以簡易對使用。然而隨著不斷開發,HAL 變成非常冗腫而很難管理。2008 年 5 月,HAL 開發者 David Zeuthen 提出取 HAL 完全重寫成 DeviceKit。[7]DeviceKit 早期的設計是把 HAL 的功能分拆成 DeviceKit 主服務和多個子服務,包括負責管理區塊裝置的 DeviceKit-disks 和負責管理電源的 DeviceKit-power 。udev 亦開始提供一個分享程式庫 libudev,讓 DeviceKit 和其他程式輕易使用 udev 固有功能,免卻重覆開發。
然而,DeviceKit 在 2009 年 3 月終止,其功能被併入 udev,而其他 DeviceKit 程式如 DeviceKit-disks 和 DeviceKit-power 則改為使用 libudev 直接和 udev 通訊。[8][9]至同年 12 月,DeviceKit-Disks 和 DeviceKit-Power 更分別先後重新命名為 udisks 和 upower。[10]而 Ubuntu 10.04 LTS 和 Fedora 13 完成了 udev (DeviceKit) 替代 HAL 工程,完全把 HAL 移除。
原理
GNU/Linux 啟動時,會先使用 tmpfs (虛擬記憶體檔系統) 掛載至 /dev 目錄並把 /lib/udev/devices 中的靜態裝置檔案複製至 /dev。接著,udev daemon 會啟動並聆聽來自 Linux 核心的 uevent。[11]
當有新硬件如 USB 隨新碟插入電腦時,Linux 核心會透過 netlink 發出 uevent 通知 udevd。udevd 讀取 uevent 的資料並根據 /etc/udev/rules.d 中的規則建立對應的裝置檔案和連結。為加快速度,udev daemon 會把 /etc/udev/rules.d/*.rules 中的規則讀入記憶體。udev 亦會聆聽 inotify 事件,當有任何規則檔案被更改,udev 會重新讀取並更新記憶體的規則。
個別 GNU/Linux 會有 udev 規則令有新硬體插入時通知高階裝置管理系統 HAL。HAL 會由 udev、sysfs 和裝置資料檔案 (*.fdi) 取得有關硬體詳細特性並以 D-Bus 介面呈現給應用程式。
近年 udev 直接取替 HAL 功能,由 udev 規則直接提供更詳細的硬體特性給 udisks 和 upower 等子系統。再由它們以 D-Bus 介面呈現給應用程式。
監察或除錯
可以使用命令 udevadm monitor 監察 udev 的活動。
參考資料
- ↑ Streck, Philip (2002-09-24) devfs for Management and Administration. Linux Journal.
- ↑ 2.0 2.1 Rebe, Rene, Frommel, Oliver & Brendel, Jens-Christoph (2006-10) Dynamic device management in Udev Device Manager. Linux Magazine 71, 2006(10). P.34-38.
- ↑ Kroah-Hartman, Greg (2003-07) udev—A Userspace Implementationof devfs. Proceedings of the Linux Symposium, Ottawa, Ontario, Canada (July 23–26, 2003).
- ↑ Beekmans, Gerard (2010) Chapter 7. Setting Up System Bootscripts. Linux From Scratch 6.6.
- ↑ Andrews, Jeremy (2003-12-23) Linux: Debating devfs and udev. kerneltrap
- ↑ Sievers, Kay (2005-12-23) Recent state of udev. Vrfy.org.
- ↑ Zeuthen, David (2008-05-07) Update on DeviceKit. HAL Mailing List.
- ↑ Zeuthen, David (2009-03-01) DeviceKit 003 released. DeviceKit Mailing List.
- ↑ Sievers, Kay (2009-04-26) udev rules files DeviceKit Mailing Litst.
- ↑ Zeuthen, David (2009-12-01) DeviceKit-disks renamed to udisks. DeviceKit Mailing List.
- ↑ Unnikrishnan A (2009-12-18) Udev: Introduction to Device Management In Modern Linux System. Linux.com.
請參看
外部連結
- 維基百科: udev[Eng][中文] - 維基百科對 udev 的說明。
- kernel.org: udev - udev 在 Kernel.org 的主頁。
- Linux.com: Udev: Introduction to Device Management In Modern Linux System (Unnikrishnan A 2009-12-18)
- Linux From Scratch 6.6 - Chapter 7. Setting Up System Bootscripts (Gerard Beekmans 2010)
- Linux Magazine, Issue 71: Dynamic device management in Udev Device Manager (Rene Rebe, Oliver Frommel, Jens-Christoph Brendel 2006-10)
- Vrfy.org: Recent state of udev (Kay Sievers 2005-12-23) - Kay Sievers 於 2005 在其 Blog 報告 udev 的情況,包括由 udev 取替 hotplug。
- Linux.SYS-CON.com: Device Management with udev and HAL on Fedora Core 4 (Richard Petersen 2005-10-22)
- Linux Journal: Kernel Korner: udev - Persistent Device Naming in User Space (Greg Kroah-Hartman 2004-06-7)
- Linux Symposium 2003: udev - A Userspace Implementation of devfs (Greg Kroah-Hartman 2003-07)
- LWN: Porting device drivers to the 2.6 kernel - kobjects and hotplug events (Greg Kroah-Hartman 2003-10-07)
- Linux Hotpluging] - hotplug (已退役) 官方網站

