溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

UDEV規(guī)則參數(shù)詳細(xì)解釋使用

發(fā)布時(shí)間:2020-08-04 18:51:47 來(lái)源:ITPUB博客 閱讀:382 作者:路途中的人2012 欄目:建站服務(wù)器

Udev 的使用--linux系統(tǒng)創(chuàng)建設(shè)備節(jié)點(diǎn)
 
Linux 里都是以設(shè)備文件的形式存在。在早期的 Linux 版本中,/dev目錄包含了所有可能出現(xiàn)的設(shè)備的設(shè)備文件。但因?yàn)檫@樣 Linux 用戶很難在這些大量的設(shè)備文件中找到匹配條件的設(shè)備文件。現(xiàn)在 udev 只為那些連接到 Linux 操作系統(tǒng)的設(shè)備產(chǎn)生設(shè)備文件。并且 udev 能通過(guò)定義一個(gè) udev 規(guī)則 (rule) 來(lái)產(chǎn)生匹配設(shè)備屬性的設(shè)備文件,這些設(shè)備屬性可以是內(nèi)核設(shè)備名稱、總線路徑、廠商名稱、型號(hào)、序列號(hào)或者磁盤大小等等。
 
動(dòng)態(tài)自動(dòng)管理設(shè)備信息:當(dāng)有設(shè)備添加 / 刪除時(shí),udev 的守護(hù)進(jìn)程偵聽到來(lái)自內(nèi)核的 uevent 的事件,用來(lái)添加或者刪除 /dev下的設(shè)備文件,所以 udev 可以只為已經(jīng)連接的設(shè)備產(chǎn)生設(shè)備文件,而不會(huì)象 2.4 內(nèi)核一樣在 /dev下產(chǎn)生大量設(shè)備文件。另外可以使用這個(gè)功能 ,當(dāng)有設(shè)備加入時(shí)運(yùn)行外部的程序,比如鼠標(biāo)加入時(shí)自動(dòng)禁用觸摸板之類
使用自定義命名和管理設(shè)備:使用 Udev 規(guī)則文件,udev 在 /dev/ 里為所有的設(shè)備定義了內(nèi)核設(shè)備名稱,比如 /dev /sda、/dev/hda、/dev/fd等等。由于 udev 是在用戶空間 (user space) 運(yùn)行,Linux 用戶可以接下來(lái)對(duì)這些信息進(jìn)行操作,比如可以通過(guò)自定義的規(guī)則文件,生成人性的設(shè)備標(biāo)識(shí),比如 /dev/my_disk、/dev/nameusb 等,還能對(duì)設(shè)置進(jìn)行參數(shù)成員用戶組權(quán)限之類的修改。
 
開始之類需要了解
  ? sysfs:sysfs是 Linux 2.6 內(nèi)核里的一個(gè)虛擬文件系統(tǒng) (/sys)。它把設(shè)備和驅(qū)動(dòng)的信息從內(nèi)核的設(shè)備模塊導(dǎo)出到用戶空間 (userspace)。從該文件系統(tǒng)中,Linux 用戶可以獲取很多設(shè)備的屬性。
  ? devpath:本文的 devpath是指一個(gè)設(shè)備在 sysfs文件系統(tǒng) (/sys)下的相對(duì)路徑,該路徑包含了該設(shè)備的屬性文件。udev 里的多數(shù)命令都是針對(duì) devpath操作的。例如:sda的 devpath是 /block/sda,sda2 的 devpath是 /block/sda/sda2。
  ? 內(nèi)核設(shè)備名稱:設(shè)備在 sysfs里的名稱,是 udev 默認(rèn)使用的設(shè)備文件名。
 
udev 主配置文件
 
主要的udev 主配置文件是 /etc/udev/udev.conf。這個(gè)文件通常很短,他可能只是包含幾行#開頭的注釋,然后有幾行選項(xiàng):
 

 


 

udev_root=/dev/  # 設(shè)置的絕對(duì)路徑,相當(dāng)于創(chuàng)建 chroot 的根。
 
udev_rules=/etc/udev/rules.d/    #規(guī)則的存放地址
 
udev_log=err      # 日志的輸入級(jí)別
 

 
 
udev 的規(guī)則配置文件實(shí)例
 
 
默認(rèn)的規(guī)則配置文件存放在 /etc/udev/rules.d/ 中,我們進(jìn)入這個(gè)可以看到 RedHat 默認(rèn)對(duì)設(shè)備建好的一些規(guī)則和一些硬件公司寫好的規(guī)則。
進(jìn)入目錄,可以見到以二位數(shù)字開頭的前綴的配置文件,可以使用 vi 進(jìn)入配置文件中查看,一行是一條規(guī)則,默認(rèn)是從小數(shù)字到大數(shù)字,這些表示生效的順序。
 
我們?cè)谑褂?udev 寫規(guī)則前,先來(lái)看一個(gè)例子
 

 


 KERNEL==sd*, PROGRAM=/lib/udev/scsi_id -g -s %p, RESULT==123456, SYMLINK=%k_%c
 
 

 
 
該規(guī)則的執(zhí)行:如果有一個(gè)內(nèi)核設(shè)備名稱以 sd 開頭,且 SCSI ID 為 123456,則為設(shè)備文件產(chǎn)生一個(gè)符號(hào)鏈接“sda_123456”.  %p %k %c 請(qǐng)看后面的“udev 的值和可調(diào)用的替換操作符 ”
 
 
 
 
udev 的規(guī)則配置文件
 
在規(guī)則文件里,除了以“#”開頭的行(注釋),所有的非空行都被視為一條規(guī)則,但是一條規(guī)則不能擴(kuò)展到多行。規(guī)則都是由多個(gè) 鍵值對(duì)(key-value pairs)組成,并由逗號(hào)隔開,鍵值對(duì)可以分為 條件匹配鍵值對(duì)( 以下簡(jiǎn)稱“匹配鍵 ”) 和 賦值鍵值對(duì)( 以下簡(jiǎn)稱“賦值鍵 ”),一條規(guī)則可以有多條匹配鍵和多條賦值鍵。匹配鍵是匹配一個(gè)設(shè)備屬性的所有條件,當(dāng)一個(gè)設(shè)備的屬性匹配了該規(guī)則里所有的匹配鍵,就認(rèn)為這條規(guī)則生效,然后按照賦值鍵的內(nèi)容,執(zhí)行該規(guī)則的賦值。
規(guī)則文件里的規(guī)則有一系列的鍵/值對(duì)組成,鍵/值對(duì)之間用逗號(hào)(,)分割。
 
通過(guò)上面例子中也能看出,這些配置,但我想大家可能會(huì)產(chǎn)生疑惑,為什么 KERNEL 是匹配鍵,而 NAME 和 MODE 是賦值鍵呢?這由中間的操作符 (operator) 決定。
 
僅當(dāng)操作符是“==”或者“!=”時(shí),其為匹配鍵;若為其他操作符時(shí),都是賦值鍵。

匹配鍵和賦值鍵操作符解釋見下表:
 

 


 操作符     匹配或賦值t                         解釋
----------------------------------------
==            匹配              相等比較
!=            匹配             不等比較
=            賦值              分配一個(gè)特定的值給該鍵,他可以覆蓋之前的賦值。
+=          賦值              追加特定的值給已經(jīng)存在的鍵
:=            賦值                  分配一個(gè)特定的值給該鍵,后面的規(guī)則不可能覆蓋它。
 
 

udev 規(guī)則的匹配鍵 :
 

 


 

鍵        含義
 
----------------------------------------
 
ACTION         事件 (uevent) 的行為,例如:add( 添加設(shè)備 )、remove( 刪除設(shè)備 )。
 
KERNEL         在內(nèi)核里看到的設(shè)備名字,比如sd*表示任意SCSI磁盤設(shè)備
 
DEVPATH       內(nèi)核設(shè)備錄進(jìn),比如/devices/*
 
SUBSYSTEM       子系統(tǒng)名字,例如:sda 的子系統(tǒng)為 block。
 
BUS         總線的名字,比如IDE,USB
 
DRIVER         設(shè)備驅(qū)動(dòng)的名字,比如ide-cdrom
 
ID           獨(dú)立于內(nèi)核名字的設(shè)備名字
 
SYSFS{ value}       sysfs屬性值,他可以表示任意
 
ENV{ key}       環(huán)境變量,可以表示任意
 
PROGRAM       可執(zhí)行的外部程序,如果程序返回0值,該鍵則認(rèn)為為真(true)
 
RESULT         上一個(gè)PROGRAM調(diào)用返回的標(biāo)準(zhǔn)輸出。
 
NAME         根據(jù)這個(gè)規(guī)則創(chuàng)建的設(shè)備文件的文件名。
 
注意:僅僅第一行的NAME描述是有效的,后面的均忽略。  

    如果你想使用使用兩個(gè)以上的名字來(lái)訪問(wèn)一個(gè)設(shè)備的話,可以考慮SYMLINK鍵。
 
SYMLINK       為 /dev/下的設(shè)備文件產(chǎn)生符號(hào)鏈接。由于 udev 只能為某個(gè)設(shè)備產(chǎn)生一個(gè)設(shè)備文件,
 
    所以為了不覆蓋系統(tǒng)默認(rèn)的 udev 規(guī)則所產(chǎn)生的文件,推薦使用符號(hào)鏈接。
 
OWNER         設(shè)備文件的屬組
 
GROUP         設(shè)備文件所在的組。
 
MODE         設(shè)備文件的權(quán)限,采用8進(jìn)制
 
RUN         為設(shè)備而執(zhí)行的程序列表
 
LABEL         在配置文件里為內(nèi)部控制而采用的名字標(biāo)簽(下下面的GOTO服務(wù))
 
GOTO         跳到匹配的規(guī)則(通過(guò)LABEL來(lái)標(biāo)識(shí)),有點(diǎn)類似程序語(yǔ)言中的GOTO
 
IMPORT{ type}     導(dǎo)入一個(gè)文件或者一個(gè)程序執(zhí)行后而生成的規(guī)則集到當(dāng)前文件
 
WAIT_FOR_SYSFS   等待一個(gè)特定的設(shè)備文件的創(chuàng)建。主要是用作時(shí)序和依賴問(wèn)題。
 
PTIONS         特定的選項(xiàng):

last_rule 對(duì)這類設(shè)備終端規(guī)則執(zhí)行;
 
ignore_device 忽略當(dāng)前規(guī)則;
 
ignore_remove 忽略接下來(lái)的并移走請(qǐng)求。
 
all_partitions 為所有的磁盤分區(qū)創(chuàng)建設(shè)備文件。

----------------------------------------

udev 的重要賦值鍵

引用
NAME:在 /dev下產(chǎn)生的設(shè)備文件名。只有第一次對(duì)某個(gè)設(shè)備的 NAME 的賦值行為生效,之后匹配的規(guī)則再對(duì)該設(shè)備的 NAME 賦值行為將被忽略。如果沒(méi)有任何規(guī)則對(duì)設(shè)備的 NAME 賦值,udev 將使用內(nèi)核設(shè)備名稱來(lái)產(chǎn)生設(shè)備文件。
SYMLINK:為 /dev/下的設(shè)備文件產(chǎn)生符號(hào)鏈接。由于 udev 只能為某個(gè)設(shè)備產(chǎn)生一個(gè)設(shè)備文件,所以為了不覆蓋系統(tǒng)默認(rèn)的 udev 規(guī)則所產(chǎn)生的文件,推薦使用符號(hào)鏈接。
OWNER, GROUP, MODE:為設(shè)備設(shè)定權(quán)限。
ENV{key}:導(dǎo)入一個(gè)環(huán)境變量。

----------------------------------------
 
 我們給出一個(gè)列子來(lái)解釋如何使用這些鍵。下面的例子來(lái)自Fedora Core 5系統(tǒng)的標(biāo)準(zhǔn)配置文件。

KERNEL==”*”, OWNER=”root” GROUP=”root”, MODE=”0600″
KERNEL==”tty”, NAME=”%k”, GROUP=”tty”, MODE=”0666″, OPTIONS=”last_rule”
KERNEL==”scd[0-9]*”, SYMLINK+=”cdrom cdrom-%k”
KERNEL==”hd[a-z]”, BUS==”ide”, SYSFS{removable}==”1″, SYSFS{device/media}==”cdrom”, SYMLINK+=”cdrom cdrom-%k”
ACTION==”add”, SUBSYSTEM==”scsi_device”, RUN+=”/sbin/modprobe sg”

上面的例子給出了5個(gè)規(guī)則,每一個(gè)都是KERNEL或者ACTION鍵開頭:

*第一個(gè)規(guī)則是缺省的,他匹配任意被內(nèi)核識(shí)別到的設(shè)備,然后設(shè)定這些設(shè)備的屬組是root,組是root,訪問(wèn)權(quán)限模式是0600(-rw——-)。這也是一個(gè)安全的缺省設(shè)置保證所有的設(shè)備在默認(rèn)情況下只有root可以讀寫。
*第二個(gè)規(guī)則也是比較典型的規(guī)則了。它匹配終端設(shè)備(tty),然后設(shè)置新的權(quán)限為0600,所在的組是tty。它也設(shè)置了一個(gè)特別的設(shè)備文件名:%K。在這里例子里,%k代表設(shè)備的內(nèi)核名字。那也就意味著內(nèi)核識(shí)別出這些設(shè)備是什么名字,就創(chuàng)建什么樣的設(shè)備文件名。

*第三行開始的KERNEL==”scd[0-9]*”,表示 SCSI CD-ROM 驅(qū)動(dòng). 它創(chuàng)建一對(duì)設(shè)備符號(hào)連接:cdrom和cdrom-%k。

*第四行,開始的 KERNEL==”hd[a-z]“, 表示ATA CDROM驅(qū)動(dòng)器。這個(gè)規(guī)則創(chuàng)建和上面的規(guī)則相同的符號(hào)連接。ATA CDROM驅(qū)動(dòng)器需要sysfs值以來(lái)區(qū)別別的ATA設(shè)備,因?yàn)镾CSI CDROM可以被內(nèi)核唯一識(shí)別。.

*第五行以 ACTION==”add”開始,它告訴udev增加 /sbin/modprobe sg 到命令列表,當(dāng)任意SCSI設(shè)備增加到系統(tǒng)后,這些命令將執(zhí)行。其效果就是計(jì)算機(jī)應(yīng)該會(huì)增加sg內(nèi)核模塊來(lái)偵測(cè)新的SCSI設(shè)備。

當(dāng)然,上面僅僅是一小部分例子,如果你的系統(tǒng)采用了udev方式,那你應(yīng)該可以看到更多的規(guī)則。如果你想修改設(shè)備的權(quán)限或者創(chuàng)建信的符號(hào)連接,那么你需要熟讀這些規(guī)則,特別是要仔細(xì)注意你修改的那些與之相關(guān)的設(shè)備。
 
udev 的值和可調(diào)用的替換操作符

 

 

 

在鍵值對(duì)中的鍵和操作符都介紹完了,最后是值 (value)。Linux 用戶可以隨意地定制 udev 規(guī)則文件的值。
 
例如:my_root_disk, my_printer。同時(shí)也可以引用下面的替換操作符:
 
----------------------------------------
 
$kernel, %k:設(shè)備的內(nèi)核設(shè)備名稱,例如:sda、cdrom。
 
$number, %n:設(shè)備的內(nèi)核號(hào)碼,例如:sda3 的內(nèi)核號(hào)碼是 3。
 
$devpath, %p:設(shè)備的 devpath路徑。
 
$id, %b:設(shè)備在 devpath里的 ID 號(hào)。
 
$sysfs{file}, %s{file}:設(shè)備的 sysfs里 file 的內(nèi)容。其實(shí)就是設(shè)備的屬性值。
 
例如:$sysfs{size} 表示該設(shè)備 ( 磁盤 ) 的大小。
 
$env{key}, %E{key}:一個(gè)環(huán)境變量的值。
 
$major, %M:設(shè)備的 major 號(hào)。
 
$minor %m:設(shè)備的 minor 號(hào)。
 
$result, %c:PROGRAM 返回的結(jié)果
 
$parent, %P:父設(shè)備的設(shè)備文件名。
 
$root, %r:udev_root的值,默認(rèn)是 /dev/。
 
$tempnode, %N:臨時(shí)設(shè)備名。
 
%%:符號(hào) % 本身。
 
$$:符號(hào) $ 本身。
 

 
 

 
 
udev 規(guī)則所需要信息的查詢
 
常用的查上面匹配鍵信息的命令
 

 


 

udevinfo -a -p $(udevinfo  -q path -n /dev/sda1 )
 
上面的命令兩次使用udevinfo:
 
  第一次是返回sysfs設(shè)備路徑(他通常和我們看到的Linux設(shè)備文件名所在路徑--/dev/hda--不同);
 
  第二次才是查詢這個(gè)設(shè)備路徑,結(jié)果將是非常常的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 信息的測(cè)試和生效
 
查出來(lái)后,根據(jù)上面文件中的內(nèi)容寫規(guī)則后,怎么測(cè)試
 

 


udevtest /block/sda
 
start_dev #命令重啟 udev守護(hù)進(jìn)程
 
本操作會(huì)對(duì)所有的設(shè)備重新查詢規(guī)則目錄下所有的規(guī)則文件,然后執(zhí)行所匹配的規(guī)則里的行為。
 
通常使用該命令讓新的規(guī)則文件立即生效。
 ------------------------------------   資料整理網(wǎng)絡(luò)   ---------------------------------------------

 

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI