Linux Udev

在我入门udev的时候,看着各类各样的资料以为这个东西很高深的时候,忽然瞄到一篇文章里面说道: 要树立一个信念:udev很简单,当时不觉得然,如今可以理解,其实稍做研究就能理解了,看起来很高端很遥远的Title,好比Linux Kernel,好比软硬件交互,好比热插拔等等,其实掌握几个rules,而后再动手实践实践,对比着讲解,就能知道七七八八了,想要再深刻,就多看看文档实现和内核源码,其实不少东西都是这样,了解了就很简单,没事了解一点就比别人多知道一些,共勉html

Udev 是什么

udevlinux kernel的设备管理器,处理硬件的添加和删除,但它的功能远远不只于此。好比U盘插入,电脑是如何即时的作出响应?耳机插入又是如何作到自动关闭外部音量?这些都跟udev有关。虽然udev很强大,功能不少,原本就针对SCSI硬盘设备的插拔作一些经验的分享。至于为何我会研究到这个东西,是由于最近在作ceph相关的项目,须要实现一个相似热插拔的feature,懂的人应该很清楚,就是拔插硬盘后,osd自动恢复,主要应用于硬盘寿命即将到期,替换新盘的场景,不明白的同窗也没关系,由于本文主要讨论的是udevpython

Udev Rules

udev管理各类各样的设备,好比USB,DISK,CD等等,为了区别设备类型,精确匹配,udev制定了一套特点的rules,为何说特点呢?由于我以为它用最简洁的语法知足了方方面面的需求react

这里推荐一些有用的linklinux

你们看完上面的文章应该知道rules文件的位置和规则,下面我贴一些我实践中的代码和例子

这是两条分别针对SCSI硬盘设备的添加和删除的rules,设备事件分别会触发相应的脚本:

KERNEL=="sd[a-z]", ACTION=="add", SUBSYSTEM=="block", RUN+="/usr/bin/python /root/test.py %k add"
KERNEL=="sd[a-z]", ACTION=="remove", SUBSYSTEM=="block", RUN+="/usr/bin/python /root/test.py %k remove"

注意:

  • 执行外部命令必须加上环境变量路径, 上面的这个也能够不加/usr/bin/python,可是必须在py脚本头部加上shebang#! /usr/bin/python

  • RUN能够运行程序外的程序,而PROGRAM不是作这个事情的,而是为了生成以后须要的变量

相关 Link

Udevadm

udevadm是一个udev的管理工具,能够用来获取设备信息(info),监视和控制udev运行时的行为(control),请求内核事件(trigger),管理事件队列(settle),以及提供简单的调试机制(test)。很实用,很好用!!!

推荐 Link

介绍几个我具体使用过的例子:

udevadm info

能够从udev数据库中提取设备信息,此外,还能够从sysfs中提取设备的属性, 以帮助建立与此设备匹配的udev规则

获取/dev/sdbpath信息

udevadm info -q path -n /dev/sdb

udevadm test

模拟向udev发送设备信息,并不会真的触发,而是将触发后的过程信息打印出来,对调试颇有帮助, 我用这个查看脚本是否会被执行

udevadm test --action='add' `udevadm info -q path -n /dev/sdb`

注意: test不会真正触发事件,而trigger能够

udevadm trigger

能够真正触发udev事件,可是不会真正改变硬件,只是触发kerneludev的事件,会触发udev rules,我用这个触发事件,校验rules匹配

udevadm trigger -v --action=add --sysname-match=sda

注意:

  • 不加sysname-match那么会触发全部设备,若是是action=remove,那么则会移除不少设备,甚至致使sshd服务停掉

  • 后面是sda而不是/dev/sda由于它是根据pci路径来定位name的,好比sda的路径是:

/sys/devices/pci0000:00/0000:00:10.0/host2/target2:0:0/2:0:0:0/block/sda

udevadm control

  • 重载udev rules,对以后触发的新设备有效,对以前已经触发的无效

udevadm control --relaod-rules
  • 更改udev日志等级为infoudev默认等级为err,能够在/etc/udev/udev.conf中查看,日志具体信息能够在syslog中查看

udevadm control --log-priority=info

More about udev

udev还有不少有意思的地方,若是想要更加深刻的学习,那么除了熟练地掌握rules等技巧,还要对其实现原理有了解,这就得多看文档,多看源码了,建议你们有条件的状况下多看源码,多看原始的东西,由于通过别人的总结就可能会变味,相互对比,不要一味依赖别人总结的产物

相关文章
相关标签/搜索