成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

在Linux中如何編寫基本的udev規(guī)則

系統(tǒng) Linux
udev 規(guī)則是定義在一個以 .rules 為擴展名的文件中。那些文件主要放在兩個位置:/usr/lib/udev/rules.d,這個目錄用于存放系統(tǒng)安裝的規(guī)則;/etc/udev/rules.d/ 這個目錄是保留給自定義規(guī)則的。

[[220305]]

讀者對象

理解 udev 背后的基本概念,學(xué)習(xí)如何寫簡單的規(guī)則。

 

要求

  • root 權(quán)限

 

難度

中等

 

約定

  • # - 要求給定的命令使用 root 權(quán)限或者直接以一個 root 用戶或者使用 sudo 命令去運行。
  • $ - 要求給定的命令以一個普通的非特權(quán)用戶運行。

 

介紹

在 GNU/Linux 系統(tǒng)中,雖然設(shè)備的底層支持是在內(nèi)核層面處理的,但是,它們相關(guān)的事件管理是在用戶空間中通過 udev 來管理的。確切地說是由 udevd 守護進程來完成的。學(xué)習(xí)如何去寫規(guī)則,并應(yīng)用到發(fā)生的這些事件上,將有助于我們修改系統(tǒng)的行為并使它適合我們的需要。

 

規(guī)則如何組織

udev 規(guī)則是定義在一個以 .rules 為擴展名的文件中。那些文件主要放在兩個位置:/usr/lib/udev/rules.d,這個目錄用于存放系統(tǒng)安裝的規(guī)則;/etc/udev/rules.d/ 這個目錄是保留給自定義規(guī)則的。

定義那些規(guī)則的文件的命名慣例是使用一個數(shù)字作為前綴(比如,50-udev-default.rules),并且以它們在目錄中的詞匯順序進行處理的。在 /etc/udev/rules.d 中安裝的文件,會覆蓋安裝在系統(tǒng)默認(rèn)路徑中的同名文件。

 

規(guī)則語法

如果你理解了 udev 規(guī)則的行為邏輯,它的語法并不復(fù)雜。一個規(guī)則由兩個主要的節(jié)構(gòu)成:match 部分,它使用一系列用逗號分隔的鍵定義了規(guī)則應(yīng)用的條件,而 action 部分,是當(dāng)條件滿足時,我們執(zhí)行一些動作。

 

測試案例

講解可能的選項的***方法莫過于配置一個真實的案例,因此,我們?nèi)ザx一個規(guī)則作為演示,當(dāng)鼠標(biāo)被連接時禁用觸摸板。顯然,在該規(guī)則定義中提供的屬性將反映我的硬件。

我們將在 /etc/udev/rules.d/99-togglemouse.rules 文件中用我們喜歡的文本編輯器來寫我們的規(guī)則。一條規(guī)則定義允許跨多個行,但是,如果是這種情況,必須在一個換行字符之前使用一個反斜線(\)表示行的延續(xù),就和 shell 腳本一樣。這是我們的規(guī)則:

  1. ACTION=="add" \
  2. , ATTRS{idProduct}=="c52f" \
  3. , ATTRS{idVendor}=="046d" \
  4. , ENV{DISPLAY}=":0" \
  5. , ENV{XAUTHORITY}="/run/user/1000/gdm/Xauthority" \
  6. , RUN+="/usr/bin/xinput --disable 16"

我們來分析一下這個規(guī)則。

 

操作符

首先,對已經(jīng)使用以及將要使用的操作符解釋如下:

 

== 和 != 操作符

== 是相等操作符,而 != 是不等于操作符。通過使用它們,我們可以確認(rèn)規(guī)則上應(yīng)用的鍵是否匹配各自的值。

 

分配操作符 = 和 :=

= 是賦值操作符,是用于為一個鍵賦值。當(dāng)我們想要賦值,并且想確保它不會被其它規(guī)則所覆蓋,我們就需要使用 := 操作符來代替,使用這個操作符分配的值,它就不能被改變。

 

+= 和 -= 操作符

+= 和 -= 操作符各自用于從一個指定的鍵定義的值列表中增加或者移除一個值。

 

我們使用的鍵

現(xiàn)在,來分析一下在這個規(guī)則中我們使用的鍵。首先,我們有一個 ACTION 鍵:通過使用它,當(dāng)在一個設(shè)備上發(fā)生了特定的事件,我們將指定我們要應(yīng)用的規(guī)則的具體內(nèi)容。有效的值有 addremove  以及 change。 

然后,我們使用 ATTRS 關(guān)鍵字去指定一個屬性去匹配。我們可以使用 udevadm info 命令去列出一個設(shè)備屬性,提供它的名字或者 sysfs 路徑即可:

  1. udevadm info -ap /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.1/0003:046D:C52F.0010/input/input39
  2.  
  3. Udevadm info starts with the device specified by the devpath and then
  4. walks up the chain of parent devices. It prints for every device
  5. found, all possible attributes in the udev rules key format.
  6. A rule to match, can be composed by the attributes of the device
  7. and the attributes from one single parent device.
  8.  
  9. looking at device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.1/0003:046D:C52F.0010/input/input39':
  10. KERNEL=="input39"
  11. SUBSYSTEM=="input"
  12. DRIVER==""
  13. ATTR{name}=="Logitech USB Receiver"
  14. ATTR{phys}=="usb-0000:00:1d.0-1.2/input1"
  15. ATTR{properties}=="0"
  16. ATTR{uniq}==""
  17.  
  18. looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.1/0003:046D:C52F.0010':
  19. KERNELS=="0003:046D:C52F.0010"
  20. SUBSYSTEMS=="hid"
  21. DRIVERS=="hid-generic"
  22. ATTRS{country}=="00"
  23.  
  24. looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.1':
  25. KERNELS=="2-1.2:1.1"
  26. SUBSYSTEMS=="usb"
  27. DRIVERS=="usbhid"
  28. ATTRS{authorized}=="1"
  29. ATTRS{bAlternateSetting}==" 0"
  30. ATTRS{bInterfaceClass}=="03"
  31. ATTRS{bInterfaceNumber}=="01"
  32. ATTRS{bInterfaceProtocol}=="00"
  33. ATTRS{bInterfaceSubClass}=="00"
  34. ATTRS{bNumEndpoints}=="01"
  35. ATTRS{supports_autosuspend}=="1"
  36.  
  37. looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2':
  38. KERNELS=="2-1.2"
  39. SUBSYSTEMS=="usb"
  40. DRIVERS=="usb"
  41. ATTRS{authorized}=="1"
  42. ATTRS{avoid_reset_quirk}=="0"
  43. ATTRS{bConfigurationValue}=="1"
  44. ATTRS{bDeviceClass}=="00"
  45. ATTRS{bDeviceProtocol}=="00"
  46. ATTRS{bDeviceSubClass}=="00"
  47. ATTRS{bMaxPacketSize0}=="8"
  48. ATTRS{bMaxPower}=="98mA"
  49. ATTRS{bNumConfigurations}=="1"
  50. ATTRS{bNumInterfaces}==" 2"
  51. ATTRS{bcdDevice}=="3000"
  52. ATTRS{bmAttributes}=="a0"
  53. ATTRS{busnum}=="2"
  54. ATTRS{configuration}=="RQR30.00_B0009"
  55. ATTRS{devnum}=="12"
  56. ATTRS{devpath}=="1.2"
  57. ATTRS{idProduct}=="c52f"
  58. ATTRS{idVendor}=="046d"
  59. ATTRS{ltm_capable}=="no"
  60. ATTRS{manufacturer}=="Logitech"
  61. ATTRS{maxchild}=="0"
  62. ATTRS{product}=="USB Receiver"
  63. ATTRS{quirks}=="0x0"
  64. ATTRS{removable}=="removable"
  65. ATTRS{speed}=="12"
  66. ATTRS{urbnum}=="1401"
  67. ATTRS{version}==" 2.00"
  68.  
  69. [...]

上面截取了運行這個命令之后的輸出的一部分。正如你從它的輸出中看到的那樣,udevadm 從我們提供的指定路徑開始,并且提供了所有父級設(shè)備的信息。注意設(shè)備的屬性都是以單數(shù)的形式報告的(比如,KERNEL),而它的父級是以復(fù)數(shù)形式出現(xiàn)的(比如,KERNELS)。父級信息可以做為規(guī)則的一部分,但是同一時間只能有一個父級可以被引用:不同父級設(shè)備的屬性混合在一起是不能工作的。在上面我們定義的規(guī)則中,我們使用了一個父級設(shè)備屬性:idProduct 和 idVendor。 

在我們的規(guī)則中接下來做的事情是,去使用 ENV 關(guān)鍵字:它既可以用于設(shè)置也可以用于去匹配環(huán)境變量。我們給 DISPLAY 和 XAUTHORITY 分配值。當(dāng)我們使用 X 服務(wù)器程序進行交互去設(shè)置一些需要的信息時,這些變量是非常必要的:使用 DISPLAY 變量,我們指定服務(wù)器運行在哪個機器上,用的是哪個顯示和屏幕;使用 XAUTHORITY 提供了一個文件路徑,其包含了 Xorg 認(rèn)證和授權(quán)信息。這個文件一般位于用戶的家目錄中。 

***,我們使用了 RUN 字:它用于運行外部程序。非常重要:這里沒有立即運行,但是一旦所有的規(guī)則被解析,將運行各種動作。在這個案例中,我們使用 xinput 實用程序去改變觸摸板的狀態(tài)。我不想解釋這里的 xinput 的語法,它超出了本文的范圍,只需要注意這個觸摸板的 ID 是 16。 

規(guī)則設(shè)置完成之后,我們可以通過使用 udevadm test 命令去調(diào)試它。這個命令對調(diào)試非常有用,它并不真實去運行 RUN 指定的命令:

  1. $ udevadm test --action="add" /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.1/0003:046D:C52F.0010/input/input39

我們提供給命令的是使用 --action 選項,以及設(shè)備的 sysfs 路徑的模擬動作。如果沒有報告錯誤,說明我們的規(guī)則運行的很好。要在真實的環(huán)境中去使用它,我們需要重新加載規(guī)則:

  1. # udevadm control --reload

這個命令將重新加載規(guī)則文件,但是,它只對重新加載之后發(fā)生的事件有效果。

我們通過創(chuàng)建一個 udev 規(guī)則了解了基本的概念和邏輯,這只是 udev 規(guī)則中眾多的選項和可能的設(shè)置中的一小部分。udev 手冊頁提供了一個詳盡的列表,如果你想深入了解,請參考它。 

責(zé)任編輯:龐桂玉 來源: Linux中國
相關(guān)推薦

2019-03-18 09:40:44

Linux命令編程語言

2022-07-05 08:41:28

Sigma日志事件開發(fā)

2019-09-24 20:07:30

Linux移動文件 命令

2010-05-14 09:57:25

MySQL數(shù)據(jù)庫

2023-12-21 07:06:32

Go編寫HTML

2018-12-10 09:22:52

udevLinux命令

2011-03-14 15:46:35

Iptables語法

2024-08-12 08:33:05

2018-01-08 15:30:18

Linux命令date

2022-02-24 09:00:38

React代碼模式

2011-11-08 17:11:47

程序員

2011-05-27 11:01:10

DreamweaverCSS

2022-07-27 06:42:16

C 程序Linux代碼

2021-01-19 08:07:50

Linux日期文件

2021-02-26 14:20:35

LinuxWindowsexe文件

2023-05-20 17:45:25

LinuxShell

2017-04-12 11:16:08

Python終端編程

2022-06-27 09:00:55

SwiftGit Hooks

2018-06-01 10:37:26

Linux歸檔文件壓縮文件

2021-12-15 08:00:00

YARA安全工具
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产精品成人一区二区三区夜夜夜 | 天天色综 | www.一区二区三区.com | 国产精品激情在线 | 亚洲欧美激情精品一区二区 | 国产一区久久久 | 波多野结衣二区 | 黄色一级电影在线观看 | 精品国产乱码久久久久久中文 | av在线免费观看网站 | 涩涩片影院| 成人午夜电影网 | 日本久久精品 | 午夜视频免费在线观看 | 精品日韩在线 | 久久久亚洲成人 | 欧美中文字幕一区二区三区亚洲 | 午夜视频一区 | 欧美视频日韩 | 国产伦精品一区二区三毛 | 亚洲毛片在线 | 99re6在线| 国产精品色| 毛片入口 | 国产高清免费 | 亚洲电影一区二区三区 | 北条麻妃99精品青青久久 | 羞羞视频免费在线观看 | 日韩精品人成在线播放 | 欧美激情精品久久久久久免费 | 亚洲久久| 国产精品久久av | av激情在线 | 欧美精品久久 | 欧美精品一区二区在线观看 | 精品久久视频 | 日韩欧美1区2区 | 精品国产欧美在线 | 99re在线视频 | 超碰一区二区 | 一区二区在线 |