亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在Linux中怎么編寫基本的udev規則

發布時間:2021-10-23 09:28:31 來源:億速云 閱讀:285 作者:小新 欄目:系統運維

這篇文章主要介紹了在Linux中怎么編寫基本的udev規則,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

讀者對象

理解 udev 背后的基本概念,學習如何寫簡單的規則。

要求

  • root 權限

難度

中等

約定

  • # - 要求給定的命令使用 root 權限或者直接以一個 root 用戶或者使用 sudo 命令去運行。

  • $ - 要求給定的命令以一個普通的非特權用戶運行。

介紹

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

規則如何組織

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

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

規則語法

如果你理解了 udev 規則的行為邏輯,它的語法并不復雜。一個規則由兩個主要的節構成:match 部分,它使用一系列用逗號分隔的鍵定義了規則應用的條件,而 action 部分,是當條件滿足時,我們執行一些動作。

測試案例

講解可能的選項的***方法莫過于配置一個真實的案例,因此,我們去定義一個規則作為演示,當鼠標被連接時禁用觸摸板。顯然,在該規則定義中提供的屬性將反映我的硬件。

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

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

我們來分析一下這個規則。

操作符

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

== 和 != 操作符

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

分配操作符 = 和 :=

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

+= 和 -= 操作符

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

我們使用的鍵

現在,來分析一下在這個規則中我們使用的鍵。首先,我們有一個 ACTION 鍵:通過使用它,當在一個設備上發生了特定的事件,我們將指定我們要應用的規則的具體內容。有效的值有 addremove  以及 change

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

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 Udevadm info starts with the device specified by the devpath and thenwalks up the chain of parent devices. It prints for every devicefound, all possible attributes in the udev rules key format.A rule to match, can be composed by the attributes of the deviceand the attributes from one single parent device.   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':    KERNEL=="input39"    SUBSYSTEM=="input"    DRIVER==""    ATTR{name}=="Logitech USB Receiver"    ATTR{phys}=="usb-0000:00:1d.0-1.2/input1"    ATTR{properties}=="0"    ATTR{uniq}==""   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':    KERNELS=="0003:046D:C52F.0010"    SUBSYSTEMS=="hid"    DRIVERS=="hid-generic"    ATTRS{country}=="00"   looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.1':    KERNELS=="2-1.2:1.1"    SUBSYSTEMS=="usb"    DRIVERS=="usbhid"    ATTRS{authorized}=="1"    ATTRS{bAlternateSetting}==" 0"    ATTRS{bInterfaceClass}=="03"    ATTRS{bInterfaceNumber}=="01"    ATTRS{bInterfaceProtocol}=="00"    ATTRS{bInterfaceSubClass}=="00"    ATTRS{bNumEndpoints}=="01"    ATTRS{supports_autosuspend}=="1"   looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2':    KERNELS=="2-1.2"    SUBSYSTEMS=="usb"    DRIVERS=="usb"    ATTRS{authorized}=="1"    ATTRS{avoid_reset_quirk}=="0"    ATTRS{bConfigurationValue}=="1"    ATTRS{bDeviceClass}=="00"    ATTRS{bDeviceProtocol}=="00"    ATTRS{bDeviceSubClass}=="00"    ATTRS{bMaxPacketSize0}=="8"    ATTRS{bMaxPower}=="98mA"    ATTRS{bNumConfigurations}=="1"    ATTRS{bNumInterfaces}==" 2"    ATTRS{bcdDevice}=="3000"    ATTRS{bmAttributes}=="a0"    ATTRS{busnum}=="2"    ATTRS{configuration}=="RQR30.00_B0009"    ATTRS{devnum}=="12"    ATTRS{devpath}=="1.2"    ATTRS{idProduct}=="c52f"    ATTRS{idVendor}=="046d"    ATTRS{ltm_capable}=="no"    ATTRS{manufacturer}=="Logitech"    ATTRS{maxchild}=="0"    ATTRS{product}=="USB Receiver"    ATTRS{quirks}=="0x0"    ATTRS{removable}=="removable"    ATTRS{speed}=="12"    ATTRS{urbnum}=="1401"    ATTRS{version}==" 2.00"     [...]

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

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

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

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

$ 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 選項,以及設備的 sysfs 路徑的模擬動作。如果沒有報告錯誤,說明我們的規則運行的很好。要在真實的環境中去使用它,我們需要重新加載規則:

# udevadm control --reload

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

感謝你能夠認真閱讀完這篇文章,希望小編分享的“在Linux中怎么編寫基本的udev規則”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

喀喇沁旗| 拉萨市| 宽甸| 井陉县| 吉木萨尔县| 琼中| 广宁县| 花莲县| 铜梁县| 定南县| 策勒县| 青阳县| 金阳县| 苗栗市| 灯塔市| 盐城市| 巢湖市| 清丰县| 山东省| 格尔木市| 吉木乃县| 河间市| 探索| 隆尧县| 司法| 九龙县| 保靖县| 奉新县| 黑河市| 大化| 沐川县| 绥宁县| 博客| 枣庄市| 汉阴县| 寿光市| 西峡县| 财经| 承德县| 阳谷县| 北流市|