章 33. 使用 udev 的動態裝置節點

內容目錄

33.1. 建立規則
33.2. 保留字元替換
33.3. 關鍵字的樣式比對
33.4. 關鍵字選擇
33.5. 大容量儲存裝置的一致名稱

摘要

Linux 核心 2.6 為動態裝置目錄 /dev 引進新的使用者空間解決方案,並提供一致的裝置指定:udev。它僅提供實際出現的裝置檔案。它所建立或移除的裝置節點檔案通常是位於 /dev 目錄,而且它能夠重新命名網路介面。先前以動態 /dev 搭配 devfs 的實作已由 udev 取代。

傳統上,裝置節點會儲存在 Linux 系統上的 /dev 目錄中。每個裝置的可能類型都會有一個節點,無論其是否實際存在系統中。因此,此目錄包含了數千個未使用的檔案。必須先利用特殊應用程式來建立相對應的節點,才能使用新增的子系統或核心裝置。devfs 檔案系統帶來了一個重大的加強功能,因為現在只有當裝置真正存在且核心知道有這個裝置時,才會在 /dev 中給予一個裝置節點。

udev 引進一個新的建立裝置節點的方法。核心會將它的內部狀態匯出至 sysfs,而且每當核心識別到裝置時,它就會更新 sysfs 中的資訊,並將事件傳送到使用者空間。利用 sysfs 提供的資訊,udev 就可以比對簡單的規則語法與所提供的裝置屬性,然後建立或移除相對應的裝置節點。

使用者不需要為新裝置建立任何 udev 規則。如果連結了某個裝置,則會自動建立適當的裝置節點。不過,規則讓您得以定義裝置命名原則。這不僅讓您便於用易記的名稱來取代難以理解的裝置名稱,也便於讓已連接相同類型的兩個裝置能同時有一致的裝置名稱。

假設您有兩部透過 USB 連接的印表機,一部是高品質的彩色雷射印表機,另一部是黑白噴墨印表機。它們會顯示為 /dev/usb/lpX,其中的 X 是根據其連接的順序來編號。使用 udev 建立自訂 udev 規則,將一部印表機命名為 /dev/colorlaser,而另一部命名為 /dev/inkprinter。因為這些裝置節點是由 udev 根據裝置特性而建立,所以無論連線順序或狀態為何,這些裝置節點都一定會指向正確的裝置。

33.1. 建立規則

udev/dev 中建立裝置節點之前,會按照字母順序以字尾 .rules 讀取 /etc/udev/rules.d 中的所有檔案。會先使用符合裝置的第一個規則,即使其他規則也符合條件。井字符號 (#) 代表註解。規則採用以下格式:

key, [key,...] NAME [, SYMLINK]

至少必須指定一個關鍵字,因為規則被指定至裝置時,會以這些關鍵字為基礎。也必須指定一個名稱。建立在 /dev 中的裝置節點會使用此名稱。選擇性的符號連結參數讓節點可以建立在其他地方。印表機的規則可以採用以下格式:

BUS=="usb", SYSFS{serial}=="12345", NAME="lp_hp", SYMLINK+="printers/hp"

在此範例中,有兩個關鍵字,BUSSYSFS{serial}udev 會將此序號與連結到 USB 匯流排的裝置序號相比較。若要指定 lp_hp 名稱給 /dev 目錄中的裝置,所有的關鍵字都必須一致。此外,還會建立參照裝置節點的 /dev/printers/hp 符號連結。同時還會自動建立 printers 目錄。然後,列印工作便可以傳送到 /dev/printers/hp/dev/lp_hp 中。