衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

在 Linux 中如何編寫基本的 udev 規則并了解其基本的概念和邏輯

Linux愛好者 ? 2018-02-23 09:12 ? 次閱讀

讀者對象

理解 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 鍵:通過使用它,當在一個設備上發生了特定的事件,我們將指定我們要應用的規則的具體內容。有效的值有 add、remove 以及 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 andthen

walks up the chain of parentdevices.It prints forevery device

found,all possible attributes inthe udev rules key format.

Arule tomatch,can be composed by the attributes of the device

andthe attributes from one single parentdevice.

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 parentdevice'/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 parentdevice'/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 parentdevice'/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

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

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11345

    瀏覽量

    210387
  • udev
    +關注

    關注

    0

    文章

    13

    瀏覽量

    8244
  • root
    +關注

    關注

    1

    文章

    86

    瀏覽量

    21417

原文標題:在 Linux 中如何編寫基本的 udev 規則

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    嵌入式Linux學習步驟

    系統多線程程序設計  線程的基礎知識 多線程編程方法 線程應用的同步問題了解線程的概念 能夠編寫簡單的多線程程序
    發表于 05-04 15:01

    了解嵌入式系統學習的步驟

    熟悉文件I/O 編寫串口通信程序 編寫多串口通信程序 6、嵌入式系統多進程程序設計Linux系統進程概述 嵌入式系統的進程特點 進程操作 守護進程 相關的系統調用
    發表于 02-25 09:51

    Udev:介紹現代Linux系統的設備管理

    的內核的未來是不明智的。DEVfs曾經被當作靜態設備節點的一個解決方案被引入,但是經歷一小段時間之后就消失了。而Udev則被證明是現代Linux內核中一個成功的設備管理器,并且有希望
    發表于 05-05 18:19

    嵌入式linux學習步驟

    程序 編寫多串口通信程序6、嵌入式系統多進程程序設計Linux系統進程概述 嵌入式系統的進程特點 進程操作 守護進程 相關的系統調用了解Linux
    發表于 09-12 14:23

    嵌入式linux學習步驟

    文件I/O 編寫串口通信程序 編寫多串口通信程序6、嵌入式系統多進程程序設計Linux系統進程概述 嵌入式系統的進程特點 進程操作 守護進程 相關的系統調用
    發表于 10-25 10:12

    初學者嵌入式linux系統的學習步驟

    /O 編寫串口通信程序 編寫多串口通信程序7、嵌入式系統多進程程序設計Linux系統進程概述 嵌入式系統的進程特點 進程操作 守護進程 相關的系統調用
    發表于 01-18 10:34

    什么是腳本? makefile的編寫規則有哪些

    一、實驗目的和要求1了解什么是腳本2掌握shell編程方法3掌握makefile的編寫規則二、實驗內容和原理1編寫一個Shell腳本,要求:顯示當前目錄的所有內容,
    發表于 12-22 07:52

    【魯班貓】通過添加udev規則實現用戶組訪問SPI和I2C設備

    udev規則實現設備權限的自動綁定。什么是udev,簡單來說,只要Linux內核啟動了,udev就以守護進程的方式運行 ,
    發表于 04-08 10:35

    如何通過udev和sys文件系統動態創建設備結點

    Linux2.6內核,devfs被認為是過時的方法,最終被拋棄,udev取代了它。Devfs的一個很重要的特點就是可以動態創建設備結點
    發表于 05-05 11:36 ?1499次閱讀

    LINUXUdev的詳細介紹

    目前很多的Linux分發版本采納了udev的方式,因為它在Linux設備訪問,特別是那些對設備有極端需求的站點(比如需要控制上千個硬盤)和熱插拔設備(比如USB攝像頭和MP3播放器)上解決了幾個問題。下面我我們來看看如何管理
    發表于 05-04 17:22 ?1536次閱讀
    <b class='flag-5'>在</b><b class='flag-5'>LINUX</b>下<b class='flag-5'>Udev</b>的詳細介紹

    可以使用嵌入式udev高效、動態地管理Linux設備文件

    以通俗的方法闡述 udev 及相關術語的概念udev 的配置文件和規則文件,然后以 Red Hat Enterprise Server 為平臺演示一些管理設備文件和查詢設備信息的實例
    發表于 04-25 16:15 ?894次閱讀
    可以使用嵌入式<b class='flag-5'>udev</b>高效、動態地管理<b class='flag-5'>Linux</b>設備文件

    需要了解udev文件系統的使用和基本工作原理

    udev文件系統是針對2.6內核,提供一個基于用戶空間的動態設備節點管理和命名的解決方案,網上關于為什么要使用udev文件系統,udev文件系統和devfs文件系統的比較,等等的文章已經很多了,如果你想
    發表于 05-05 14:28 ?901次閱讀
    需要<b class='flag-5'>了解</b><b class='flag-5'>udev</b>文件系統的使用和基本工作原理

    嵌入式Linux_USB_U盤自動檢測識別

    我們程序開發時,有時需要熱拔插U盤,然后mount 這個U盤。Linux 2.6以上版本udev 規則提供了自動識別的機制。具體請查看udev
    發表于 11-01 18:00 ?11次下載
    嵌入式<b class='flag-5'>Linux</b>_USB_U盤自動檢測識別

    如何創建接近傳感器了解背后邏輯

    電子發燒友網站提供《如何創建接近傳感器了解背后邏輯.zip》資料免費下載
    發表于 11-08 10:52 ?0次下載
    如何創建接近傳感器<b class='flag-5'>并</b><b class='flag-5'>了解</b><b class='flag-5'>其</b>背后<b class='flag-5'>邏輯</b>

    Linuxudev應用

    的在內核層靜態注冊設備文件方便得多。接下來我們以啟揚IAC-IMX8MP-Kit開發板udev為例,對進行簡單的了解udev一般會有
    的頭像 發表于 08-28 15:47 ?790次閱讀
    <b class='flag-5'>Linux</b>下<b class='flag-5'>udev</b>應用
    876棋牌游戏中心| 智尊娱乐| 百家乐揽子打法| gt百家乐官网平台| 天健棋牌大厅下载| 澳门百家乐赌钱| 真人百家乐技巧| 百家乐官网开户导航| 利来网| A8百家乐娱乐城| 百家乐官网和| 百家乐官网网站排行| 大发888有哪些| 查找百家乐群| 百家乐破解的方法| 香港百家乐官网赌场娱乐网规则 | 百家乐论坛bocaila| 百家乐现场网络| 包赢百家乐官网的玩法技巧和规则| 百家乐官网两头压注| bet365客服电话| 大发888送58| 威尼斯人娱乐网站| 百家乐娱乐平台开户| 百家乐园游戏77sonci...| 风水24山头| 海立方百家乐赢钱| 大世界百家乐官网的玩法技巧和规则 | 百家乐网络游戏信誉怎么样| 圣安娜百家乐包杀合作| 百家乐巴黎| 百家乐稳赚秘籍| 百家乐路单破解软件| 网上玩百家乐好吗| 百家乐娱乐开户| 百家乐的必赢方法| 百家乐玩法秘决| 百家乐视频地主| 百家乐交流群号| 金赞百家乐现金网| 滨海湾百家乐娱乐城|