精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

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

讀者對(duì)象

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

要求

root 權(quán)限

難度

中等

要求

#– 要求給定的命令使用 root 權(quán)限或者直接以一個(gè) root 用戶或者使用sudo命令去運(yùn)行。

$– 要求給定的命令以一個(gè)普通的非特權(quán)用戶運(yùn)行。

介紹

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

規(guī)則如何組織

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

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

規(guī)則語法

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

測(cè)試案例

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

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

ACTION=="add"\

,ATTRS{idProduct}=="c52f"\

,ATTRS{idVendor}=="046d"\

,ENV{DISPLAY}=":0"\

,ENV{XAUTHORITY}="/run/user/1000/gdm/Xauthority"\

,RUN+="/usr/bin/xinput --disable 16"

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

操作符

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

== 和 != 操作符

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

分配操作符 = 和 :=

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

+= 和 -= 操作符

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

我們使用的鍵

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

然后,我們使用 ATTRS 關(guān)鍵字去指定一個(gè)屬性去匹配。我們可以使用 udevadm info 命令去列出一個(gè)設(shè)備屬性,提供它的名字或者 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"

[...]

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

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

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

規(guī)則設(shè)置完成之后,我們可以通過使用 udevadm test 命令去調(diào)試它。這個(gè)命令對(duì)調(diào)試非常有用,它并不真實(shí)去運(yùn)行 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 選項(xiàng),以及設(shè)備的 sysfs 路徑的模擬動(dòng)作。如果沒有報(bào)告錯(cuò)誤,說明我們的規(guī)則運(yùn)行的很好。要在真實(shí)的環(huán)境中去使用它,我們需要重新加載規(guī)則:

# udevadm control --reload

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

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11230

    瀏覽量

    208931
  • udev
    +關(guān)注

    關(guān)注

    0

    文章

    13

    瀏覽量

    8230
  • root
    +關(guān)注

    關(guān)注

    1

    文章

    85

    瀏覽量

    21376

原文標(biāo)題:在 Linux 中如何編寫基本的 udev 規(guī)則

文章出處:【微信號(hào):LinuxHub,微信公眾號(hào):Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    嵌入式Linux學(xué)習(xí)步驟

    系統(tǒng)多線程程序設(shè)計(jì)  線程的基礎(chǔ)知識(shí) 多線程編程方法 線程應(yīng)用的同步問題了解線程的概念 能夠編寫簡(jiǎn)單的多線程程序
    發(fā)表于 05-04 15:01

    了解嵌入式系統(tǒng)學(xué)習(xí)的步驟

    熟悉文件I/O 編寫串口通信程序 編寫多串口通信程序 6、嵌入式系統(tǒng)多進(jìn)程程序設(shè)計(jì)Linux系統(tǒng)進(jìn)程概述 嵌入式系統(tǒng)的進(jìn)程特點(diǎn) 進(jìn)程操作 守護(hù)進(jìn)程 相關(guān)的系統(tǒng)調(diào)用
    發(fā)表于 02-25 09:51

    Udev:介紹現(xiàn)代Linux系統(tǒng)的設(shè)備管理

    的內(nèi)核的未來是不明智的。DEVfs曾經(jīng)被當(dāng)作靜態(tài)設(shè)備節(jié)點(diǎn)的一個(gè)解決方案被引入,但是經(jīng)歷一小段時(shí)間之后就消失了。而Udev則被證明是現(xiàn)代Linux內(nèi)核中一個(gè)成功的設(shè)備管理器,并且有希望
    發(fā)表于 05-05 18:19

    嵌入式linux學(xué)習(xí)步驟

    程序 編寫多串口通信程序6、嵌入式系統(tǒng)多進(jìn)程程序設(shè)計(jì)Linux系統(tǒng)進(jìn)程概述 嵌入式系統(tǒng)的進(jìn)程特點(diǎn) 進(jìn)程操作 守護(hù)進(jìn)程 相關(guān)的系統(tǒng)調(diào)用了解Linux
    發(fā)表于 09-12 14:23

    嵌入式linux學(xué)習(xí)步驟

    文件I/O 編寫串口通信程序 編寫多串口通信程序6、嵌入式系統(tǒng)多進(jìn)程程序設(shè)計(jì)Linux系統(tǒng)進(jìn)程概述 嵌入式系統(tǒng)的進(jìn)程特點(diǎn) 進(jìn)程操作 守護(hù)進(jìn)程 相關(guān)的系統(tǒng)調(diào)用
    發(fā)表于 10-25 10:12

    初學(xué)者嵌入式linux系統(tǒng)的學(xué)習(xí)步驟

    /O 編寫串口通信程序 編寫多串口通信程序7、嵌入式系統(tǒng)多進(jìn)程程序設(shè)計(jì)Linux系統(tǒng)進(jìn)程概述 嵌入式系統(tǒng)的進(jìn)程特點(diǎn) 進(jìn)程操作 守護(hù)進(jìn)程 相關(guān)的系統(tǒng)調(diào)用
    發(fā)表于 01-18 10:34

    什么是腳本? makefile的編寫規(guī)則有哪些

    一、實(shí)驗(yàn)?zāi)康暮鸵?了解什么是腳本2掌握shell編程方法3掌握makefile的編寫規(guī)則二、實(shí)驗(yàn)內(nèi)容和原理1編寫一個(gè)Shell腳本,要求:顯示當(dāng)前目錄的所有內(nèi)容,
    發(fā)表于 12-22 07:52

    【魯班貓】通過添加udev規(guī)則實(shí)現(xiàn)用戶組訪問SPI和I2C設(shè)備

    udev規(guī)則實(shí)現(xiàn)設(shè)備權(quán)限的自動(dòng)綁定。什么是udev,簡(jiǎn)單來說,只要Linux內(nèi)核啟動(dòng)了,udev就以守護(hù)進(jìn)程的方式運(yùn)行 ,
    發(fā)表于 04-08 10:35

    如何通過udev和sys文件系統(tǒng)動(dòng)態(tài)創(chuàng)建設(shè)備結(jié)點(diǎn)

    Linux2.6內(nèi)核,devfs被認(rèn)為是過時(shí)的方法,最終被拋棄,udev取代了它。Devfs的一個(gè)很重要的特點(diǎn)就是可以動(dòng)態(tài)創(chuàng)建設(shè)備結(jié)點(diǎn)
    發(fā)表于 05-05 11:36 ?1476次閱讀

    LINUXUdev的詳細(xì)介紹

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

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

    以通俗的方法闡述 udev 及相關(guān)術(shù)語的概念udev 的配置文件和規(guī)則文件,然后以 Red Hat Enterprise Server 為平臺(tái)演示一些管理設(shè)備文件和查詢?cè)O(shè)備信息的實(shí)例
    發(fā)表于 04-25 16:15 ?836次閱讀
    可以使用嵌入式<b class='flag-5'>udev</b>高效、動(dòng)態(tài)地管理<b class='flag-5'>Linux</b>設(shè)備文件

    需要了解udev文件系統(tǒng)的使用和基本工作原理

    udev文件系統(tǒng)是針對(duì)2.6內(nèi)核,提供一個(gè)基于用戶空間的動(dòng)態(tài)設(shè)備節(jié)點(diǎn)管理和命名的解決方案,網(wǎng)上關(guān)于為什么要使用udev文件系統(tǒng),udev文件系統(tǒng)和devfs文件系統(tǒng)的比較,等等的文章已經(jīng)很多了,如果你想
    發(fā)表于 05-05 14:28 ?880次閱讀
    需要<b class='flag-5'>了解</b><b class='flag-5'>udev</b>文件系統(tǒng)的使用和基本工作原理

    嵌入式Linux_USB_U盤自動(dòng)檢測(cè)識(shí)別

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

    如何創(chuàng)建接近傳感器了解背后邏輯

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

    Linuxudev應(yīng)用

    的在內(nèi)核層靜態(tài)注冊(cè)設(shè)備文件方便得多。接下來我們以啟揚(yáng)IAC-IMX8MP-Kit開發(fā)板udev為例,對(duì)進(jìn)行簡(jiǎn)單的了解udev一般會(huì)有
    的頭像 發(fā)表于 08-28 15:47 ?728次閱讀
    <b class='flag-5'>Linux</b>下<b class='flag-5'>udev</b>應(yīng)用