概述:
Linux 用戶常常會很難鑑別同一類型的設備名,比如 eth0, eth1, sda, sdb 等等。通過觀察這些設備的內核設備名稱,用戶通常能知道這些是什麼類型的設備,但是不知道哪一個設備是他們想要的。例如,在一個充斥着本地磁盤和光纖磁盤的設備名清單 (/dev/sd*
) 中,用戶無法找到一個序列號爲“35000c50000a7ef67”的磁盤。在這種情況下,udev 就能動態地在 /dev
目錄裏產生自己想要的、標識性強的設備文件或者設備鏈接,以此幫助用戶方便快捷地找到所需的設備文件。
udev 簡介
什麼是 udev?
udev 是 Linux2.6 內核裏的一個功能,它替代了原來的 devfs,成爲當前 Linux 默認的設備管理工具。udev 以守護進程的形式運行,通過偵聽內核發出來的 uevent 來管理 /dev
目錄下的設備文件。不像之前的設備管理工具,udev 在用戶空間 (user space) 運行,而不在內核空間 (kernel space) 運行。
使用 udev 的好處:
我們都知道,所有的設備在 Linux 裏都是以設備文件的形式存在。在早期的 Linux 版本中,/dev
目錄包含了所有可能出現的設備的設備文件。很難想象 Linux 用戶如何在這些大量的設備文件中找到匹配條件的設備文件。現在 udev 只爲那些連接到 Linux 操作系統的設備產生設備文件。並且 udev 能通過定義一個 udev 規則 (rule) 來產生匹配設備屬性的設備文件,這些設備屬性可以是內核設備名稱、總線路徑、廠商名稱、型號、序列號或者磁盤大小等等。
動態管理:當設備添加 / 刪除時,udev 的守護進程偵聽來自內核的 uevent,以此添加或者刪除
/dev
下的設備文件,所以 udev 只爲已經連接的設備產生設備文件,而不會在/dev
下產生大量虛無的設備文件。自定義命名規則:通過 Linux 默認的規則文件,udev 在 /dev/ 裏爲所有的設備定義了內核設備名稱,比如
/dev/sda、/dev/hda、/dev/fd
等等。由於 udev 是在用戶空間 (user space) 運行,Linux 用戶可以通過自定義的規則文件,靈活地產生標識性強的設備文件名,比如/dev/boot_disk、/dev/root_disk、/dev/color_printer
等等。設定設備的權限和所有者 / 組:udev 可以按一定的條件來設置設備文件的權限和設備文件所有者 / 組。在不同的 udev 版本中,實現的方法不同,在“如何配置和使用 udev”中會詳解。
下面的流程圖顯示 udev 添加 / 刪除設備文件的過程。
圖 1. udev 工作流程圖:
udev系統可以分爲三個部分:
libudev函數庫,可以用來獲取設備的信息。
udevd守護進程,處於用戶空間,用於管理虛擬/dev
管理命令udevadm,用來診斷出錯情況。
相關術語:
設備文件:由於本文以較通俗的方式講解 udev,所以設備文件是泛指在
/dev/
下,可被應用程序用來和設備驅動交互的文件。而不會特別地區分設備文件、設備節點或者設備特殊文件。devfs:devfs是 Linux 早期的設備管理工具,已經被 udev 取代。
sysfs:sysfs是 Linux 2.6 內核裏的一個虛擬文件系統
(/sys)
。它把設備和驅動的信息從內核的設備模塊導出到用戶空間 (userspace)。從該文件系統中,Linux 用戶可以獲取很多設備的屬性。devpath:本文的 devpath是指一個設備在 sysfs文件系統
(/sys)
下的相對路徑,該路徑包含了該設備的屬性文件。udev 裏的多數命令都是針對 devpath操作的。例如:sda的 devpath是/block/sda
,sda2 的 devpath是/block/sda/sda2
。內核設備名稱:設備在 sysfs裏的名稱,是 udev 默認使用的設備文件名。