红联Linux门户
Linux协助

在Linux中怎么编写根本的udev规矩

发布时刻:2018-02-20 22:28:33来历:linux.cn作者:qhwdw
读者目标
了解 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 and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and 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
这个指令将从头加载规矩文件,可是,它只对从头加载之后发作的工作有用果。
咱们经过创立一个 udev 规矩了解了根本的概念和逻辑,这仅仅 udev 规矩中很多的选项和或许的设置中的一小部分。udev 手册页供给了一个翔实的列表,假如你想深化了解,请参阅它。
 
ubuntu16.04下udev权限问题:http://www.138comgov138.com/linux/32372.html
Oracle Linux6.7下运用udev做ASM:http://www.138comgov138.com/linux/22107.html
处理ubuntu体系udev多网卡称号改变的问题:http://www.138comgov138.com/linux/21158.html
运用udev绑定硬件设备:http://www.138comgov138.com/linux/18744.html
CentOS 5上布置udev:http://www.138comgov138.com/linux/3142.html