歡迎您光臨本站 註冊首頁

Udev 的使用

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0
我常常見到的一個問題,不知大家有沒有常常發現這種問題,就是 Linux 系統中原來有一個 SCSI 的硬碟,系統分配是 /dev/sda ,後來維護又加了一個新的硬碟,接上后,新的硬碟變成了 /dev/sda ,原來的老的硬碟變成了 /dev/sdb .是否有法子固定下來啦?
這個問題在過去一直無解,直到 udev 出來,這個能完美的解決這個問題.
Linux 里都是以設備文件的形式存在.在早期的 Linux 版本中,/dev目錄包含了所有可能出現的設備的設備文件.但因為這樣 Linux 用戶很難在這些大量的設備文件中找到匹配條件的設備文件.現在 udev 只為那些連接到 Linux 操作系統的設備產生設備文件.並且 udev 能通過定義一個 udev 規則 (rule) 來產生匹配設備屬性的設備文件,這些設備屬性可以是內核設備名稱、匯流排路徑、廠商名稱、型號、序列號或者磁碟大小等等.
動態自動管理設備信息:當有設備添加 / 刪除時,udev 的守護進程偵聽到來自內核的 uevent 的事件,用來添加或者刪除 /dev下的設備文件, udev 可以只為已經連接的設備產生設備文件,而不會象 2.4 內核一樣在 /dev下產生大量設備文件.另外可以使用這個功能 ,當有設備加入時運行外部的程序,比如滑鼠加入時自動禁用觸摸板之類
使用自定義命名和管理設備:使用 Udev 規則文件,udev 在 /dev/ 里為所有的設備定義了內核設備名稱,比如 /dev /sda、/dev/hda、/dev/fd等等.由於 udev 是在用戶空間 (user space) 運行,Linux 用戶可以接下來對這些信息進行操作,比如可以通過自定義的規則文件,生成人性的設備標識,比如 /dev/my_disk、/dev/nameusb 等,還能對設置進行參數成員用戶組許可權之類的修改.
開始之類需要了解
? 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 默認使用的設備文件名.


udev 主配置文件
主要的udev 主配置文件是 /etc/udev/udev.conf.這個文件通常很短,他可能只是包含幾行#開頭的註釋,然後有幾行選項:
udev_root="/dev/" # 設置的絕對路徑,相當於創建 chroot 的根.
udev_rules="/etc/udev/rules.d/" #規則的存放地址
udev_log="err" # 日誌的輸入級別
udev 的規則配置文件實例
默認的規則配置文件存放在 /etc/udev/rules.d/ 中,我們進入這個可以看到 RedHat 默認對設備建好的一些規則和一些硬體公司寫好的規則.
進入目錄,可以見到以二位數字開頭的前綴的配置文件,可以使用 vi 進入配置文件中查看,一行是一條規則,默認是從小數字到大數字,這些表示生效的順序.
我們在使用 udev 寫規則前,先來看一個例子
KERNEL=="sd*", PROGRAM="/lib/udev/scsi_id -g -s %p", RESULT=="123456", SYMLINK="%k_%c"
該規則的執行:如果有一個內核設備名稱以 sd 開頭,且 SCSI ID 為 123456,則為設備文件產生一個符號鏈接「sda_123456」. %p %k %c 請看後面的「udev 的值和可調用的替換操作符 」
udev 的規則配置文件
在規則文件里,除了以「#」開頭的行(註釋),所有的非空行都被視為一條規則,但是一條規則不能擴展到多行.規則都是由多個 鍵值對(key-value pairs)組成,並由逗號隔開,鍵值對可以分為 條件匹配鍵值對( 以下簡稱「匹配鍵 」) 和 賦值鍵值對( 以下簡稱「賦值鍵 」),一條規則可以有多條匹配鍵和多條賦值鍵.匹配鍵是匹配一個設備屬性的所有條件,當一個設備的屬性匹配了該規則里所有的匹配鍵,就認為這條規則生效,然後按照賦值鍵的內容,執行該規則的賦值.
規則文件里的規則有一系列的鍵/值對組成,鍵/值對之間用逗號(,)分割.
通過上面例子中也能看出,這些配置,但我想大家可能會產生疑惑,為什麼 KERNEL 是匹配鍵,而 NAME 和 MODE 是賦值鍵呢?這由中間的操作符 (operator) 決定.
僅當操作符是「==」或者「!=」時,其為匹配鍵;若為其他操作符時,都是賦值鍵.
匹配鍵和賦值鍵操作符解釋見下表:
操作符 匹配或賦值t 解釋
----------------------------------------


== 匹配 相等比較
!= 匹配 不等比較
= 賦值 分配一個特定的值給該鍵,他可以覆蓋之前的賦值.
= 賦值 追加特定的值給已經存在的鍵
:= 賦值 分配一個特定的值給該鍵,後面的規則不可能覆蓋它.
udev 規則的匹配鍵 :
鍵 含義
----------------------------------------
ACTION 事件 (uevent) 的行為,例如:add( 添加設備 )、remove( 刪除設備 ).
KERNEL 在內核里看到的設備名字,比如sd*表示任意SCSI磁碟設備
DEVPATH 內核設備錄進,比如/devices/*
SUBSYSTEM 子系統名字,例如:sda 的子系統為 block.
BUS 匯流排的名字,比如IDE,USB
DRIVER 設備驅動的名字,比如ide-cdrom
ID 獨立於內核名字的設備名字
SYSFS{ value} sysfs屬性值,他可以表示任意
ENV{ key} 環境變數,可以表示任意
PROGRAM 可執行的外部程序,如果程序返回0值,該鍵則認為為真(true)
RESULT 上一個PROGRAM調用返回的標準輸出.
NAME 根據這個規則創建的設備文件的文件名.
注意:僅僅第一行的NAME描述是有效的,後面的均忽略.
如果你想使用使用兩個以上的名字來訪問一個設備的話,可以考慮SYMLINK鍵.
SYMLINK 為 /dev/下的設備文件產生符號鏈接.由於 udev 只能為某個設備產生一個設備文件,
為了不覆蓋系統默認的 udev 規則所產生的文件,推薦使用符號鏈接.
OWNER 設備文件的屬組
GROUP 設備文件所在的組.
MODE 設備文件的許可權,採用8進位
RUN 為設備而執行的程序列表
LABEL 在配置文件里為內部控制而採用的名字標籤(下下面的GOTO服務)
GOTO 跳到匹配的規則(通過LABEL來標識),有點類似程序語言中的GOTO
IMPORT{ type} 導入一個文件或者一個程序執行后而生成的規則集到當前文件
WAIT_FOR_SYSFS 等待一個特定的設備文件的創建.主要是用作時序和依賴問題.


PTIONS 特定的選項:
last_rule 對這類設備終端規則執行;
ignore_device 忽略當前規則;
ignore_remove 忽略接下來的並移走請求.
all_partitions 為所有的磁碟分區創建設備文件.
udev 的值和可調用的替換操作符
在鍵值對中的鍵和操作符都介紹完了,是值 (value).Linux 用戶可以隨意地定製 udev 規則文件的值.
例如:my_root_disk, my_printer.同時也可以引用下面的替換操作符:
----------------------------------------
$kernel, %k:設備的內核設備名稱,例如:sda、cdrom.
$number, %n:設備的內核號碼,例如:sda3 的內核號碼是 3.
$devpath, %p:設備的 devpath路徑.
$id, %b:設備在 devpath里的 ID 號.
$sysfs{file}, %s{file}:設備的 sysfs里 file 的內容.其實就是設備的屬性值.
例如:$sysfs{size} 表示該設備 ( 磁碟 ) 的大小.
$env{key}, %E{key}:一個環境變數的值.
$major, %M:設備的 major 號.
$minor %m:設備的 minor 號.
$result, %c:PROGRAM 返回的結果
$parent, %P:父設備的設備文件名.
$root, %r:udev_root的值,默認是 /dev/.
$tempnode, %N:臨時設備名.
%%:符號 % 本身.
$$:符號 $ 本身.
udev 規則所需要信息的查詢
常用的查上面匹配鍵信息的命令
udevinfo -a -p $(udevinfo -q path -n /dev/sda1 )
上面的命令兩次使用udevinfo:
第一次是返回sysfs設備路徑(他通常和我們看到的Linux設備文件名所在路徑--/dev/hda--不同);
第二次才是查詢這個設備路徑,結果將是非常常的syfs信息匯總
udevinfo -a -p /sys/class/net/eth0
scsi_id -g -s /block/sda
scsi_id -g -x -s /block/sda/sda3
ata_id /dev/hda
udev 信息的測試和生效
查出來后,根據上面文件中的內容寫規則后,怎麼測試
udevtest /block/sda
start_dev #命令重啟 udev守護進程
本操作會對所有的設備重新查詢規則目錄下所有的規則文件,然後執行所匹配的規則里的行為.
通常使用該命令讓新的規則文件立即生效.


[火星人 ] Udev 的使用已經有429次圍觀

http://coctec.com/docs/linux/show-post-50168.html