Linux udev 使用者空間裝置管理器

2021-06-06 10:41:32 字數 4236 閱讀 7422

參考文獻

維基百科:

udev官方文件:

ibm developerworks 中國:

本章正文

udev 是linux kernel 2.6系列的裝置管理器。它主要的功能是管理/dev目錄底下的裝置節點。它同時也是用來接替devfs及hotplug的功能,這意味著它要在新增/刪除硬體時處理/dev目錄以及所有使用者空間的行為,包括載入firmware時。

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

1、當裝置新增或刪除時,udev 的守護程序偵聽來自核心的 uevent,以此新增或者刪除 /dev下的裝置檔案,所以 udev 只為已經連線的裝置產生裝置檔案,而不會在 /dev下產生大量虛無的裝置檔案。

2、linux 使用者可以通過自定義的規則檔案,靈活地產生標識性強的裝置檔名,而並不依賴於裝置插入系統的順序。

3、udev 可以按一定的條件來設定裝置檔案的許可權和裝置檔案所有者和組。

[inbi@debian ~]#cat /etc/udev/udev.conf

# the initial syslog(3) priority: "err", "info", "debug" or its

# numerical equivalent. for runtime debugging, the daemons internal

# state can be changed with: "udevcontrol log_priority=".

udev_log = "err"

udev_log:syslog記錄日誌的級別,預設值是err。如果改為info或者debug的話,會有冗長的udev日誌被記錄下來。

udev_root:udev 產生的裝置所存放的目錄,預設值是 /dev/。建議不要修改該引數,也因此預設沒有顯示此選項。

規則檔案是 udev 裡最重要的部分,預設是存放在 /etc/udev/rules.d/下。所有的規則檔案必須以「.rules」為字尾名,規則檔案按第乙個字母或數字的順序執行。

在規則檔案裡,除了以「#」開頭的行(注釋),所有的非空行都被視為一條規則,但是一條規則不能擴充套件到多行。規則都是由多個鍵值對(key-value pairs)組成,並由逗號隔開,鍵值對可以分為條件匹配鍵值對( 以下簡稱「匹配鍵 」) 和賦值鍵值對( 以下簡稱「賦值鍵 」),一條規則可以有多條匹配鍵和多條賦值鍵。匹配鍵是匹配乙個裝置屬性的所有條件,當乙個裝置的屬性匹配了該規則裡所有的匹配鍵,就認為這條規則生效,然後按照賦值鍵的內容,執行該規則的賦值。下面是乙個簡單的規則:

kernel==」sdb」, name=」root_disk」, mode=」0660″

kernel 是匹配鍵,name 和 mode 是賦值鍵。這條規則的意思是:如果有乙個裝置的核心裝置名稱為 sdb,則該條件生效,執行後面的賦值:在 /dev下產生乙個名為 root_disk的裝置檔案,並把裝置檔案的許可權設為 0660。

udev 規則的所有操作符

==比較鍵、值,若等於,則該條件滿足。

!=比較鍵、值,若不等於,則該條件滿足。

=對乙個鍵賦值。

+=為乙個表示多個條目的鍵賦值。

:=對乙個鍵賦值,並拒絕之後所有對該鍵的改動。

udev 規則的匹配鍵

action

事件的行為:add( 新增裝置 )、remove( 刪除裝置 )。

kernel

核心裝置名稱,例如:sda, cdrom。

devpath

裝置的 devpath 路徑。

subsystem

裝置的子系統名稱,例如:sda 的子系統為 block。

bus裝置在 devpath 裡的匯流排名稱,例如:usb。

driver

裝置在 devpath 裡的裝置驅動名稱,例如:ide-cdrom。

id裝置在 devpath 裡的識別號。

sysfs

裝置的 devpath 路徑下,裝置的屬性檔案「filename」裡的內容。

例如:sysfs==「st936701ss」表示:如果裝置的型號為 st936701ss,則該裝置匹配該 匹配鍵。在一條規則中,可以設定最多五條 sysfs 的 匹配鍵。

env環境變數。在一條規則中,可以設定最多五條環境變數的匹配鍵。

program

呼叫外部命令

result

外部命令 program 的返回結果。

例:program==」/lib/udev/scsi_id -g -s $devpath」, result==」35000c50000a7ef67″

udev 規則的賦值鍵

name

在 /dev下產生的裝置檔名。只有第一次對某個裝置的 name 的賦值行為生效,之後匹配的規則再對該裝置的 name 賦值行為將被忽略。如果沒有任何規則對裝置的 name 賦值,udev 將使用核心裝置名稱來產生裝置檔案。

symlink

為 /dev/下的裝置檔案產生符號鏈結。由於 udev 只能為某個裝置產生乙個裝置檔案,所以為了不覆蓋系統預設的 udev 規則所產生的檔案,推薦使用符號鏈結。

owner

預設使用者

group

預設使用者組

mode

裝置許可權

env匯入乙個環境變數。

udev 可呼叫的替換操作符

$kernel, %k

裝置的核心裝置名稱,例如:sda、cdrom。

$number, %n

裝置的核心號碼,例如:sda3 的核心號碼是 3。

$devpath, %p

裝置的 devpath路徑。

$id, %b

裝置在 devpath裡的 id 號。

$sysfs, %s

裝置的 sysfs裡 file 的內容。其實就是裝置的屬性值。

例如:$sysfs 表示該裝置 ( 磁碟 ) 的大小。

$env, %e

乙個環境變數的值。

$major, %m

裝置的 major 號。

$minor %m

裝置的 minor 號。

$result, %c

program 返回的結果。

$parent, %p

父裝置的裝置檔名。

$root, %r

udev_root的值,預設是 /dev/。

$tempnode, %n

臨時裝置名。

%%符號 % 本身。

$$符號 $ 本身。

devpath:是指乙個裝置在sysfs檔案系統 (/sys)下的相對路徑,該路徑包含了裝置的屬性檔案。udev裡的多數命令都是針對devpath操作的。例如:sda的devpath是 /block/sda,sda2的devpath是/block/sda/sda2。

kernel==」sd*」, program=」/lib/udev/scsi_id -g -s %p」, result==」35000c50000a7ef67″, symlink=」%k_%c」

該規則的執行:如果有乙個核心裝置名稱以 sd 開頭,且 scsi id 為 35000c50000a7ef67,則為裝置檔案產生乙個符號鏈結「sda_35000c50000a7ef67」。

subsystem==」net」, sysfs==」00:1e;6e:00:36:f1″, name=」public_nic」

如果存在裝置的子系統為 net,並且位址 (mac address) 為「00:1e;6e:00:36:f1」,為該裝置產生乙個名為 public_nic 的裝置檔案。

subsystem==」block」, sysfs==」71096640″, symlink =」my_disk」

如果存在裝置的子系統為 block,並且大小為 71096640(block),則為該裝置的裝置檔名產生乙個名為 my_disk 的符號鏈結。

查詢sysfs檔案系統

裝置 sda 的 sysfs 可以通過 cat /sys/block/sda/size 得到;

sysfs 資訊可以通過 cat /sys/block/sda/device/model 得到。

查詢磁碟的 scsi_id

scsi_id -g -s /block/sda

Linux udev識別移動裝置

udev 是linux kernel 2.6系列的裝置管理器。它主要的功能是管理 dev目錄底下的裝置節點。它同時也是用來接替devfs及hotplug的功能,這意味著它要在新增 刪除硬體時處理 dev目錄以及所有使用者空間的行為,包括載入firmware時。udev系統由三個部分組成 libude...

使用者空間訪問字元裝置的過程

在這裡我分析應用程式如何訪問字元裝置,了解其整個過程,通過這個分析,對字元驅動的了解會提公升很多。以下是我個人的理解,不知到這樣理解是否正確 使用者執行open,先寫系統呼叫號和引數暫存器,然後指行軟中斷,指行系統呼叫。核心讀取字元裝置檔案 dev leds,也就是讀取檔案的inode,同時建立乙個...

世界座標系空間,頁面空間,裝置空間,物理裝置空間

一 座標空間 1 win32 應用程式設計介面 api 使用四種座標空間 世界座標系空間 頁面空間 裝置空間和物理裝置空間。應用程式運用世界座標系空間對圖形輸出進行旋轉,斜切或者反射。2 win32 api 把世界座標系空間和頁面空間稱為邏輯空間,最後一種座標空間 即物理裝置空間 通常指應用程式視窗...