溫馨提示×

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

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

使用 udev 高效、動(dòng)態(tài)地管理 Linux 設(shè)備文件

發(fā)布時(shí)間:2020-08-11 22:30:24 來源:ITPUB博客 閱讀:145 作者:sqysl 欄目:建站服務(wù)器

本文轉(zhuǎn)自: https://www.ibm.com/developerworks/cn/linux/l-cn-udev/index.html

概述:

Linux 用戶常常會(huì)很難鑒別同一類型的設(shè)備名,比如 eth0, eth2, sda, sdb 等等。通過觀察這些設(shè)備的內(nèi)核設(shè)備名稱,用戶通常能知道這些是什么類型的設(shè)備,但是不知道哪一個(gè)設(shè)備是他們想要的。例如,在一個(gè)充斥著本地磁盤和光纖磁盤的設(shè)備名清單 ( /dev/sd*) 中,用戶無法找到一個(gè)序列號(hào)為“35000c50000a7ef67”的磁盤。在這種情況下,udev 就能動(dòng)態(tài)地在  /dev目錄里產(chǎn)生自己想要的、標(biāo)識(shí)性強(qiáng)的設(shè)備文件或者設(shè)備鏈接,以此幫助用戶方便快捷地找到所需的設(shè)備文件。

udev 簡(jiǎn)介

什么是 udev?

udev 是 Linux2.6 內(nèi)核里的一個(gè)功能,它替代了原來的 devfs,成為當(dāng)前 Linux 默認(rèn)的設(shè)備管理工具。udev 以守護(hù)進(jìn)程的形式運(yùn)行,通過偵聽內(nèi)核發(fā)出來的 uevent 來管理  /dev目錄下的設(shè)備文件。不像之前的設(shè)備管理工具,udev 在用戶空間 (user space) 運(yùn)行,而不在內(nèi)核空間 (kernel space) 運(yùn)行。

使用 udev 的好處:

我們都知道,所有的設(shè)備在 Linux 里都是以設(shè)備文件的形式存在。在早期的 Linux 版本中, /dev目錄包含了所有可能出現(xiàn)的設(shè)備的設(shè)備文件。很難想象 Linux 用戶如何在這些大量的設(shè)備文件中找到匹配條件的設(shè)備文件?,F(xiàn)在 udev 只為那些連接到 Linux 操作系統(tǒng)的設(shè)備產(chǎn)生設(shè)備文件。并且 udev 能通過定義一個(gè) udev 規(guī)則 (rule) 來產(chǎn)生匹配設(shè)備屬性的設(shè)備文件,這些設(shè)備屬性可以是內(nèi)核設(shè)備名稱、總線路徑、廠商名稱、型號(hào)、序列號(hào)或者磁盤大小等等。

  • 動(dòng)態(tài)管理:當(dāng)設(shè)備添加 / 刪除時(shí),udev 的守護(hù)進(jìn)程偵聽來自內(nèi)核的 uevent,以此添加或者刪除  /dev下的設(shè)備文件,所以 udev 只為已經(jīng)連接的設(shè)備產(chǎn)生設(shè)備文件,而不會(huì)在  /dev下產(chǎn)生大量虛無的設(shè)備文件。
  • 自定義命名規(guī)則:通過 Linux 默認(rèn)的規(guī)則文件,udev 在 /dev/ 里為所有的設(shè)備定義了內(nèi)核設(shè)備名稱,比如  /dev/sda、/dev/hda、/dev/fd等等。由于 udev 是在用戶空間 (user space) 運(yùn)行,Linux 用戶可以通過自定義的規(guī)則文件,靈活地產(chǎn)生標(biāo)識(shí)性強(qiáng)的設(shè)備文件名,比如  /dev/boot_disk、/dev/root_disk、/dev/color_printer等等。
  • 設(shè)定設(shè)備的權(quán)限和所有者 / 組:udev 可以按一定的條件來設(shè)置設(shè)備文件的權(quán)限和設(shè)備文件所有者 / 組。在不同的 udev 版本中,實(shí)現(xiàn)的方法不同,在“如何配置和使用 udev”中會(huì)詳解。

下面的流程圖顯示 udev 添加 / 刪除設(shè)備文件的過程。

圖 1. udev 工作流程圖:

使用 udev 高效、動(dòng)態(tài)地管理 Linux 設(shè)備文件 使用 udev 高效、動(dòng)態(tài)地管理 Linux 設(shè)備文件

相關(guān)術(shù)語:

  • 設(shè)備文件:由于本文以較通俗的方式講解 udev,所以設(shè)備文件是泛指在  /dev/下,可被應(yīng)用程序用來和設(shè)備驅(qū)動(dòng)交互的文件。而不會(huì)特別地區(qū)分設(shè)備文件、設(shè)備節(jié)點(diǎn)或者設(shè)備特殊文件。
  • devfsdevfs是 Linux 早期的設(shè)備管理工具,已經(jīng)被 udev 取代。
  • sysfssysfs是 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

下面會(huì)以 RHEL4.8 和 RHEL5.3 為平臺(tái),分別描述 udev 的配置和使用:

下載和安裝 udev

從 Fedora3 和 Red Hat Enterprise4 開始,udev 就是默認(rèn)的設(shè)備管理工具,無需另外下載安裝。

清單 1. 檢查 udev 在 RHEL4.8 里的版本和運(yùn)行情況

1

2

3

4

5

6

[root@HOST_RHEL4 dev]# rpm -qa |grep -i udev

udev-039-10.29.el4

[root@HOST_RHEL4 ~]# uname -r

2.6.9-89.ELsmp

[root@HOST_RHEL4 ~]# ps -ef |grep udev

root     21826     1  0 Dec09 ?        00:00:00 udevd

清單 2. 檢查 udev 在 RHEL5.3 里的版本和運(yùn)行情況

1

2

3

4

5

6

[root@HOST_RHEL5 ~]# rpm -qa |grep -i udev

udev-095-14.19.el5

[root@HOST_RHEL5 sysconfig]# uname -r

2.6.18-128.el5

[root@HOST_RHEL5 sysconfig]# ps -ef|grep udev

root      5466     1  0 18:32 ?      00:00:00 /sbin/udevd -d

如果 Linux 用戶想更新 udev 包,可以從  http://www.kernel.org/pub/linux/utils/kernel/hotplug/下載并安裝。

udev 的配置文件 (/etc/udev/udev.conf)

清單 3. RHEL 4 . 8下 udev 的配置文件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

[root@HOST_RHEL4 dev]# cat /etc/udev/udev.conf

# udev.conf

# The main config file for udev

#

# This file can be used to override some of udev's default values

# for where it looks for files, and where it places device nodes.

#

# WARNING: changing any value, can cause serious system breakage!

#

# udev_root - where in the filesystem to place the device nodes

udev_root="/dev/"

# udev_db - The name and location of the udev database.

udev_db="/dev/.udev.tdb"

# udev_rules - The name and location of the udev rules file

udev_rules="/etc/udev/rules.d/"

# udev_permissions - The name and location of the udev permission file

udev_permissions="/etc/udev/permissions.d/"

# default_mode - set the default mode for all nodes that have no

#                explicit match in the permissions file

default_mode="0600"

# default_owner - set the default owner for all nodes that have no

#                 explicit match in the permissions file

default_owner="root"

# default_group - set the default group for all nodes that have no

#                 explicit match in the permissions file

default_group="root"

# udev_log - set to "yes" if you want logging, else "no"

udev_log="no"

Linux 用戶可以通過該文件設(shè)置以下參數(shù):

  • u dev_root:udev 產(chǎn)生的設(shè)備所存放的目錄,默認(rèn)值是  /dev/。建議不要修改該參數(shù),因?yàn)楹芏鄳?yīng)用程序默認(rèn)會(huì)從該目錄調(diào)用設(shè)備文件。
  • udev_db:udev 信息存放的數(shù)據(jù)庫(kù)或者所在目錄,默認(rèn)值是  /dev/.udev.tdb。
  • udev_rules:udev 規(guī)則文件的名字或者所在目錄,默認(rèn)值是  /etc/udev/rules.d/。
  • udev_permissions:udev 權(quán)限文件的名字或者所在目錄,默認(rèn)值是  /etc/udev/permissions.d/。
  • defau lt_mode/ default_owner/ default_group:如果設(shè)備文件的權(quán)限沒有在權(quán)限文件里指定,就使用該參數(shù)作為默認(rèn)權(quán)限,默認(rèn)值分別是: 0600/root/root。
  • udev_log:是否需要  syslog記錄 udev 日志的開關(guān),默認(rèn)值是 no。

清單 4. RHEL5.3 下 udev 的配置文件

1

2

3

4

5

6

7

[root@HOST_RHEL5 ~]# cat /etc/udev/udev.conf

# 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=< value >".

udev_log="err"

udev_logsyslog記錄日志的級(jí)別,默認(rèn)值是 err。如果改為 info 或者 debug 的話,會(huì)有冗長(zhǎng)的 udev 日志被記錄下來。

實(shí)際上在 RHEL5.3 里,除了配置文件里列出的參數(shù)  udev_log外,Linux 用戶還可以修改參數(shù)  udev_root和  udev_rules( 請(qǐng)參考上面的“RHEL4.8 的 udev 配置文件”),只不過這 2 個(gè)參數(shù)是不建議修改的,所以沒顯示在 udev.conf 里。

可見該版本的 udev.conf 改動(dòng)不?。?syslog默認(rèn)會(huì)記錄 udev 的日志,Linux 用戶只能修改日志的級(jí)別 (err、info、degub 等 );設(shè)備的權(quán)限不能在 udev.conf 里設(shè)定,而是要在規(guī)則文件 (*.rules) 里設(shè)定。

通過 udev 設(shè)定設(shè)備文件的權(quán)限

在 RHEL4.8 的 udev,設(shè)備的權(quán)限是通過權(quán)限文件來設(shè)置。

清單 5. RHEL4.8 下 udev 的權(quán)限文件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

[root@HOST_RHEL4 ~]# cat /etc/udev/permissions.d/50-udev.permissions

……

  # disk devices

  hd*:root:disk:0660

  sd*:root:disk:0660

  dasd*:root:disk:0660

  ataraid*:root:disk:0660

  loop*:root:disk:0660

  md*:root:disk:0660

  ide/*/*/*/*/*:root:disk:0660

  discs/*/*:root:disk:0660

  loop/*:root:disk:0660

  md/*:root:disk:0660

  # tape devices

  ht*:root:disk:0660

  nht*:root:disk:0660

  pt[0-9]*:root:disk:0660

  npt*:root:disk:0660

  st*:root:disk:0660

  nst*:root:disk:0660

……

RHEL4.8 里 udev 的權(quán)限文件會(huì)為所有常用的設(shè)備設(shè)定權(quán)限和 ownership,如果有設(shè)備沒有被權(quán)限文件設(shè)置權(quán)限,udev 就按照 udev.conf 里的默認(rèn)權(quán)限值為這些設(shè)備設(shè)置權(quán)限。由于篇幅的限制,上圖只顯示了 udev 權(quán)限文件的一部分,該部分設(shè)  置了所有可能連接上的磁盤設(shè)備和磁帶設(shè)備的權(quán)限和 ownership。

而在 RHEL5.3 的 udev,已經(jīng)沒有權(quán)限文件,所有的權(quán)限都是通過規(guī)則文件  (*.rules)來設(shè)置,在下面的規(guī)則文件配置過程會(huì)介紹到。

udev 的規(guī)則和規(guī)則文件

規(guī)則文件是 udev 里最重要的部分,默認(rèn)是存放在  /etc/udev/rules.d/下。所有的規(guī)則文件必須以“ .rules”為后綴名。RHEL 有默認(rèn)的規(guī)則文件,這些默認(rèn)規(guī)則文件不僅為設(shè)備產(chǎn)生內(nèi)核設(shè)備名稱,還會(huì)產(chǎn)生標(biāo)識(shí)性強(qiáng)的符號(hào)鏈接。例如:

1

2

[root@HOST_RHEL5 ~]# ls /dev/disk/by-uuid/

16afe28a-9da0-482d-93e8-1a9474e7245c

但這些鏈接名較長(zhǎng),不易調(diào)用,所以通常需要自定義規(guī)則文件,以此產(chǎn)生易用且標(biāo)識(shí)性強(qiáng)的設(shè)備文件或符號(hào)鏈接。

此外,一些應(yīng)用程序也會(huì)在  /dev/下產(chǎn)生一些方便調(diào)用的符號(hào)鏈接。例如規(guī)則 40-multipath.rules 為磁盤產(chǎn)生下面的符號(hào)鏈接:

1

2

[root@ HOST_RHEL5 ~]# ls /dev/mpath/*

/dev/mpath/mpath0  /dev/mpath/mpath0p1  /dev/mpath/mpath0p2

udev 按照規(guī)則文件名的字母順序來查詢?nèi)恳?guī)則文件,然后為匹配規(guī)則的設(shè)備管理其設(shè)備文件或文件鏈接。雖然 udev 不會(huì)因?yàn)橐粋€(gè)設(shè)備匹配了一條規(guī)則而停止解析后面的規(guī)則文件,但是解析的順序仍然很重要。通常情況下,建議讓自己想要的規(guī)則文件最先被解析。比如,創(chuàng)建一個(gè)名為  /etc/udev/rules.d/10-myrule.rules的文件,并把你的規(guī)則寫入該文件,這樣 udev 就會(huì)在解析系統(tǒng)默認(rèn)的規(guī)則文件之前解析到你的文件。

RHEL5.3 的 udev 規(guī)則文件比 RHEL4.8 里的更完善。受篇幅的限制,同時(shí)也為了不讓大家混淆,本文將不對(duì) RHEL4.8 里的規(guī)則文件進(jìn)行詳解,下面關(guān)于規(guī)則文件的配置和實(shí)例都是在 RHEL5.3 上進(jìn)行的。如果大家需要配置 RHEL4 的 udev 規(guī)則文件,可以先參照下面 RHEL5.3 的配置過程,然后查詢 RHEL4 里的用戶手冊(cè) (man udev) 后進(jìn)行配置。

在規(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ī)則的賦值。下面是一個(gè)簡(jiǎn)單的規(guī)則:

清單 6. 簡(jiǎn)單說明鍵值對(duì)的例子

1

KERNEL=="sda", NAME="my_root_disk", MODE="0660"

KERNEL 是匹配鍵,NAME 和 MODE 是賦值鍵。這條規(guī)則的意思是:如果有一個(gè)設(shè)備的內(nèi)核設(shè)備名稱為 sda,則該條件生效,執(zhí)行后面的賦值:在  /dev下產(chǎn)生一個(gè)名為  my_root_disk的設(shè)備文件,并把設(shè)備文件的權(quán)限設(shè)為 0660。

通過這條簡(jiǎn)單的規(guī)則,大家應(yīng)該對(duì) udev 規(guī)則有直觀的了解。但可能會(huì)產(chǎn)生疑惑,為什么 KERNEL 是匹配鍵,而 NAME 和 MODE 是賦值鍵呢?這由中間的操作符 (operator) 決定。

僅當(dāng)操作符是“==”或者“!=”時(shí),其為匹配鍵;若為其他操作符時(shí),都是賦值鍵。

  • RHEL5.3 里 udev 規(guī)則的所有操作符:

    ==”:比較鍵、值,若等于,則該條件滿足;

    ! =”: 比較鍵、值,若不等于,則該條件滿足;

    =”: 對(duì)一個(gè)鍵賦值;

    +=”:為一個(gè)表示多個(gè)條目的鍵賦值。

    :=”:對(duì)一個(gè)鍵賦值,并拒絕之后所有對(duì)該鍵的改動(dòng)。目的是防止后面的規(guī)則文件對(duì)該鍵賦值。

  • RHEL5.3 里 udev 規(guī)則的匹配鍵

    ACTION: 事件 (uevent) 的行為,例如:add( 添加設(shè)備 )、remove( 刪除設(shè)備 )。

    KE RNEL: 內(nèi)核設(shè)備名稱,例如:sda, cdrom。

    DEVPATH:設(shè)備的 devpath 路徑。

    SUBSYSTEM: 設(shè)備的子系統(tǒng)名稱,例如:sda 的子系統(tǒng)為 block。

    BUS: 設(shè)備在 devpath 里的總線名稱,例如:usb。

    DRIVER: 設(shè)備在 devpath 里的設(shè)備驅(qū)動(dòng)名稱,例如:ide-cdrom。

    ID: 設(shè)備在 devpath 里的識(shí)別號(hào)。

    SYSFS{filename}: 設(shè)備的 devpath 路徑下,設(shè)備的屬性文件“filename”里的內(nèi)容。

    例如:SYSFS{model}==“ST936701SS”表示:如果設(shè)備的型號(hào)為 ST936701SS,則該設(shè)備匹配該  匹配鍵

    在一條規(guī)則中,可以設(shè)定最多五條 SYSFS 的  匹配鍵。

    ENV{key}: 環(huán)境變量。在一條規(guī)則中,可以設(shè)定最多五條環(huán)境變量的  匹配鍵。

    PROGRAM:調(diào)用外部命令。

    RESULT: 外部命令 PROGRAM 的返回結(jié)果。例如:

    1

    PROGRAM=="/lib/udev/scsi_id -g -s $devpath", RESULT=="35000c50000a7ef67"

    調(diào)用外部命令  /lib/udev/scsi_id查詢?cè)O(shè)備的 SCSI ID,如果返回結(jié)果為 35000c50000a7ef67,則該設(shè)備匹配該  匹配鍵。

  • RHEL5.3 里 udev 的重要賦值鍵

    NAME 在  /dev下產(chǎn)生的設(shè)備文件名。只有第一次對(duì)某個(gè)設(shè)備的 NAME 的賦值行為生效,之后匹配的規(guī)則再對(duì)該設(shè)備的 NAME 賦值行為將被忽略。如果沒有任何規(guī)則對(duì)設(shè)備的 NAME 賦值,udev 將使用內(nèi)核設(shè)備名稱來產(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)境變量。

  • RHEL5.3 里 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) $ 本身。

    清單 7. 說明替換操作符的規(guī)則例子

    1

    2

    KERNEL=="sd*", PROGRAM="/lib/udev/scsi_id -g -s %p", \

    RESULT=="35000c50000a7ef67", SYMLINK="%k_%c"

    該規(guī)則的執(zhí)行:如果有一個(gè)內(nèi)核設(shè)備名稱以 sd 開頭,且 SCSI ID 為  35000c50000a7ef67,則為設(shè)備文件產(chǎn)生一個(gè)符號(hào)鏈接“sda_35000c50000a7ef67”.

制定 udev 規(guī)則和查詢?cè)O(shè)備信息的實(shí)例:

如何查找設(shè)備的信息 ( 屬性 ) 來制定 udev 規(guī)則:

當(dāng)我們?yōu)橹付ǖ脑O(shè)備設(shè)定規(guī)則時(shí),首先需要知道該設(shè)備的屬性,比如設(shè)備的序列號(hào)、磁盤大小、廠商 ID、設(shè)備路徑等等。通常我們可以通過以下的方法獲得:

  • 查詢 sysfs 文件系統(tǒng):

    前面介紹過,sysfs 里包含了很多設(shè)備和驅(qū)動(dòng)的信息。

    例如:設(shè)備 sda 的 SYSFS{size} 可以通過  cat /sys/block/sda/size得到;SYSFS{model} 信息可以通過  cat /sys/block/sda/device/model得到。

  • udevinfo 命令:

    udevinfo 可以查詢 udev 數(shù)據(jù)庫(kù)里的設(shè)備信息。例如:用 udevinfo 查詢?cè)O(shè)備 sda 的 model 和 size 信息:

    清單 8. 通過 udevinfo 查詢?cè)O(shè)備屬性的例子

    1

    2

    3

    [root@HOST_RHEL5 rules.d]# udevinfo -a -p /block/sda | egrep "model|size"

        SYSFS{size}=="71096640"

        SYSFS{model}=="ST936701SS      "

  • 其他外部命令

    清單 9. 通過 scsi_id 查詢磁盤的 SCSI_ID 的例子

    1

    2

    [root@HOST_RHEL5 ~]# scsi_id -g -s /block/sda

    35000c50000a7ef67

udev 的簡(jiǎn)單規(guī)則:

清單 10. 產(chǎn)生網(wǎng)卡設(shè)備文件的規(guī)則

1

SUBSYSTEM=="net", SYSFS{address}=="AA:BB:CC:DD:EE:FF", NAME="public_NIC"

該規(guī)則表示:如果存在設(shè)備的子系統(tǒng)為 net,并且地址 (MAC address) 為“AA:BB:CC:DD:EE:FF”,為該設(shè)備產(chǎn)生一個(gè)名為 public_NIC 的設(shè)備文件。

清單 11. 為指定大小的磁盤產(chǎn)生符號(hào)鏈接的規(guī)則

1

SUBSYSTEM=="block", SYSFS{size}=="71096640", SYMLINK ="my_disk"

該規(guī)則表示:如果存在設(shè)備的子系統(tǒng)為 block,并且大小為 71096640(block),則為該設(shè)備的設(shè)備文件名產(chǎn)生一個(gè)名為 my_disk 的符號(hào)鏈接。

清單 12. 通過外部命令為指定序列號(hào)的磁盤產(chǎn)生設(shè)備文件的規(guī)則

1

2

KERNEL=="sd*[0-9]", PROGRAM=="/lib/udev/scsi_id -g -s %p", \

RESULT=="35000c50000a7ef67", NAME +="root_disk%n"

該規(guī)則表示:如果存在設(shè)備的內(nèi)核設(shè)備名稱是以 sd 開頭 ( 磁盤設(shè)備 ),以數(shù)字結(jié)尾 ( 磁盤分區(qū) ),并且通過外部命令查詢?cè)撛O(shè)備的 SCSI_ID 號(hào)為“35000c50000a7ef67”,則產(chǎn)生一個(gè)以 root_disk 開頭,內(nèi)核號(hào)碼結(jié)尾的設(shè)備文件,并替換原來的設(shè)備文件(如果存在的話)。例如:產(chǎn)生設(shè)備名  /dev/root_disk2,替換原來的設(shè)備名  /dev/sda2。

運(yùn)用這條規(guī)則,可以在  /etc/fstab里保持系統(tǒng)分區(qū)名稱的一致性,而不會(huì)受驅(qū)動(dòng)加載順序或者磁盤標(biāo)簽被破壞的影響,導(dǎo)致操作系統(tǒng)啟動(dòng)時(shí)找不到系統(tǒng)分區(qū)。

其他常用的 udev 命令:

  • udevtest:

    udevtest會(huì)針對(duì)一個(gè)設(shè)備,在不需要 uevent 觸發(fā)的情況下模擬一次  udev的運(yùn)行,并輸出查詢規(guī)則文件的過程、所執(zhí)行的行為、規(guī)則文件的執(zhí)行結(jié)果。通常使用  udevtest來調(diào)試規(guī)則文件。以下是一個(gè)針對(duì)設(shè)備 sda 的  udevtest例子。由于  udevtest是掃描所有的規(guī)則文件 ( 包括系統(tǒng)自帶的規(guī)則文件 ),所以會(huì)產(chǎn)生冗長(zhǎng)的輸出。為了讓讀者清楚地了解  udevtest,本例只在規(guī)則目錄里保留一條規(guī)則:

    清單 13. 為 udevtest 保留的規(guī)則

    1

    2

    KERNEL=="sd*", PROGRAM="/lib/udev/scsi_id -g -s %p", RESULT=="35000c50000a7ef67", \

    NAME="root_disk%n", SYMLINK="symlink_root_disk%n"

    清單 14. udevtest 的執(zhí)行過程

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    [root@HOST_RHEL5 rules.d]# udevtest /block/sda

    main: looking at device '/block/sda' from subsystem 'block'

    run_program: '/lib/udev/scsi_id -g -s /block/sda'

    run_program: '/lib/udev/scsi_id' (stdout) '35000c50000a7ef67'

    run_program: '/lib/udev/scsi_id' returned with status 0

    udev_rules_get_name: reset symlink list

    udev_rules_get_name: add symlink 'symlink_root_disk'

    udev_rules_get_name: rule applied, 'sda' becomes 'root_disk'

    udev_device_event: device '/block/sda' already in database, \

                      validate currently present symlinks

    udev_node_add: creating device node '/dev/root_disk', major = '8', \

                minor = '0', mode = '0660', uid = '0', gid = '0'

    udev_node_add: creating symlink '/dev/symlink_root_disk' to 'root_disk'

    可以看出, udevtest對(duì) sda 執(zhí)行了外部命令  scsi_id, 得到的 stdout 和規(guī)則文件里的 RESULT 匹配,所以該規(guī)則匹配。然后 ( 模擬 ) 產(chǎn)生設(shè)備文件  /dev/root_disk和符號(hào)鏈接  /dev/symlink_root_disk,并為其設(shè)定權(quán)限。

  • start_udev:

    start_ dev命令重啟  udev守護(hù)進(jìn)程,并對(duì)所有的設(shè)備重新查詢規(guī)則目錄下所有的規(guī)則文件,然后執(zhí)行所匹配的規(guī)則里的行為。通常使用該命令讓新的規(guī)則文件立即生效:

    清單 15. start_udev 的執(zhí)行過程

    1

    2

    [root@HOST_RHEL5 rules.d]# start_udev

    Starting udev:                                             [  OK  ]

    start _udev 一般沒有標(biāo)準(zhǔn)輸出,所有的 udev 相關(guān)信息都按照配置文件 ( udev.conf)的參數(shù)設(shè)置,由  syslog記錄。

小結(jié):

udev 是高效的設(shè)備管理工具,其最大的優(yōu)勢(shì)是動(dòng)態(tài)管理設(shè)備和自定義設(shè)備的命名規(guī)則,因此替代 devfs 成為 Linux 默認(rèn)的設(shè)備管理工具。通過閱讀本文,Linux 用戶能夠了解到 udev 的工作原理和流程,靈活地運(yùn)用 udev 規(guī)則文件,從而方便地管理 Linux 設(shè)備文件。

向AI問一下細(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