iis服务器助手广告广告
返回顶部
首页 > 资讯 > 操作系统 >在Linux中怎么编写基本的udev规则
  • 764
分享到

在Linux中怎么编写基本的udev规则

2023-06-16 12:06:21 764人浏览 泡泡鱼
摘要

这篇文章主要介绍了在linux中怎么编写基本的udev规则,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。读者对象理解 udev 背后的基本概念,学习如何写简单的规则。要求ro

这篇文章主要介绍了在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规则”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网操作系统频道,更多相关知识等着你来学习!

--结束END--

本文标题: 在Linux中怎么编写基本的udev规则

本文链接: https://www.lsjlt.com/news/283505.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 在Linux中怎么编写基本的udev规则
    这篇文章主要介绍了在Linux中怎么编写基本的udev规则,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。读者对象理解 udev 背后的基本概念,学习如何写简单的规则。要求ro...
    99+
    2023-06-16
  • linux中udev的匹配规则是什么
    Linux中udev的匹配规则是通过设备的属性来匹配设备。udev使用一系列规则来确定哪个设备应该由哪个设备驱动程序处理。这些规则可...
    99+
    2024-03-05
    linux
  • Linux防火墙iptables-基础与编写防火墙规则
    Linux防火墙iptables-基础与编写防火墙规则.txtLinux防火墙基础与编写防火墙规则https://www.cnblogs.com/L2366/p/9285917.htmllinux 防火墙配置规则https://blog.c...
    99+
    2023-06-05
  • Go怎么编写Makefile规则文件
    这篇“Go怎么编写Makefile规则文件”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go怎么编写Makefile规则文件...
    99+
    2023-06-30
  • C语言的基本编写规范是什么
    C语言的基本编写规范是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。C语言是什么C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发,使用C语言可以以简易的...
    99+
    2023-06-26
  • avaScript基本的语法规则是什么
    今天小编给大家分享一下avaScript基本的语法规则是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、运算符&nbs...
    99+
    2023-06-29
  • CSS语法的基本规则是什么
    这篇文章主要为大家展示了“CSS语法的基本规则是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“CSS语法的基本规则是什么”这篇文章吧。 ...
    99+
    2024-04-02
  • C语言的基本编写规范你了解吗
    目录基本编写规范一、代码规范化的好处二、规范目的与基本规则1.目的2.基本原则1.空行2.空格3.成对书写(有些编译器会自动补括号)4.缩进(有些编译器会自动缩进)5.对齐(有些编译...
    99+
    2024-04-02
  • shell脚本的编写规范是怎样的
    这篇文章主要介绍“shell脚本的编写规范是怎样的”,在日常操作中,相信很多人在shell脚本的编写规范是怎样的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”shell脚本的编写规范是怎样的”的疑惑有所帮助!...
    99+
    2023-06-09
  • 用Go语言编写的基本的四则运算示例
    Go语言实现加减乘除运算的简单示例Go语言作为一门现代化的编程语言,具有简洁、高效、并发等特点,非常适合用于实现各种数学运算。本文将以加减乘除运算为例,展示Go语言中的实现方式,并提供具体的代码示例。首先,我们需要明确一下加减乘除运算的定义...
    99+
    2023-12-23
    Go语言 简单示例 加减乘除
  • 在Linux系统中怎么给iptables规则添加注释
    本篇内容主要讲解“在Linux系统中怎么给iptables规则添加注释”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“在Linux系统中怎么给iptables规则添加注释”吧!给iptables规...
    99+
    2023-06-13
  • 在做nlp数据标注时,规则集怎么 写
    在进行NLP数据标注时,规则集可以按照以下步骤进行编写:1. 确定任务目标:首先要明确标注的任务目标是什么,例如实体识别、情感分析等...
    99+
    2023-10-11
    nlp
  • linux系统中怎么设置iptables规则
    这篇文章将为大家详细讲解有关linux系统中怎么设置iptables规则,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。iptables -L查看filter表的iptables规则,包括所有...
    99+
    2023-06-05
  • java中方法重写的规则是什么
    在Java中,方法重写是指子类重写父类中的方法。以下是Java中方法重写的规则:1. 方法重写必须具有相同的方法名称、参数列表和返回...
    99+
    2023-08-11
    java
  • 怎么在Linux中编写内核模块
    怎么在Linux中编写内核模块?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。尽可能不要用root身份默认情况下,/dev/reverse只有root可以使用,因此你只能使用su...
    99+
    2023-06-12
  • 在java中如何编写规范的代码
    本篇内容介绍了“在java中如何编写规范的代码”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、MyBatis 不要为了多个查询条件而写 1...
    99+
    2023-06-16
  • linux中Shell脚本编程规范是什么
    这篇文章主要介绍了linux中Shell脚本编程规范是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。代码风格规范开头有“蛇棒”所谓shebang其实就是在很多脚本的第一行...
    99+
    2023-06-15
  • linux怎么编写shell集群脚本
    编写一个Shell集群脚本可以实现以下步骤:1. 在主节点上创建一个Shell脚本文件,例如cluster.sh。2. 在clust...
    99+
    2023-09-22
    shell linux
  • 怎么在Grafana中创建警报规则
    要在Grafana中创建警报规则,您可以按照以下步骤操作: 登录到Grafana仪表板,并导航到要设置警报的面板。 在面板右...
    99+
    2024-04-02
  • Rocky Linux中怎么设置防火墙规则
    在Rocky Linux中,可以使用firewalld来设置防火墙规则。以下是设置防火墙规则的步骤: 检查firewalld状态...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作