在我入门
udev
的时候,看着各类各样的资料以为这个东西很高深的时候,忽然瞄到一篇文章里面说道: 要树立一个信念:udev
很简单,当时不觉得然,如今可以理解,其实稍做研究就能理解了,看起来很高端很遥远的Title
,好比Linux Kernel
,好比软硬件交互,好比热插拔等等,其实掌握几个rules
,而后再动手实践实践,对比着讲解,就能知道七七八八了,想要再深刻,就多看看文档实现和内核源码,其实不少东西都是这样,了解了就很简单,没事了解一点就比别人多知道一些,共勉html
udev
是linux kernel
的设备管理器,处理硬件的添加和删除,但它的功能远远不只于此。好比U
盘插入,电脑是如何即时的作出响应?耳机插入又是如何作到自动关闭外部音量?这些都跟udev
有关。虽然udev
很强大,功能不少,原本就针对SCSI
硬盘设备的插拔作一些经验的分享。至于为何我会研究到这个东西,是由于最近在作ceph
相关的项目,须要实现一个相似热插拔的feature
,懂的人应该很清楚,就是拔插硬盘后,osd
自动恢复,主要应用于硬盘寿命即将到期,替换新盘的场景,不明白的同窗也没关系,由于本文主要讨论的是udev
python
udev
管理各类各样的设备,好比USB
,DISK
,CD
等等,为了区别设备类型,精确匹配,udev
制定了一套特点的rules
,为何说特点呢?由于我以为它用最简洁的语法知足了方方面面的需求react
这里推荐一些有用的link
:linux
UDEV Primer udev
入门必读,能够快速将udev
了解一番web
Writing udev rules 经典文章,看完这个基本就能掌握udev rules
数据库
Writing udev rules 修订版 国内论坛对格式样式作了一些修改,有洁癖的能够看看ssh
Writing udev rules 译 翻译版本,英文很差的能够中英文对比着看工具
udev 中文手册 这位金步国先生为开源事业作出了杰出的贡献,早前就看过他翻译的Apache
的手册学习
Writing udev rules and kernel examples 看够了上面各类规则,来看看具体的例子吧ui
Udev 详解 文章如名,真的很详细
Udev 使用方法 一些特殊的技巧
你们看完上面的文章应该知道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
不是作这个事情的,而是为了生成以后须要的变量
udevadm
是一个udev
的管理工具,能够用来获取设备信息(info
),监视和控制udev运行时的行为(control
),请求内核事件(trigger
),管理事件队列(settle
),以及提供简单的调试机制(test
)。很实用,很好用!!!
udevadm 中文手册 很全,很基础 ~~
udevadm command examples 不少udevadm
的命令能够借鉴,说不定之后能够用到呢?
介绍几个我具体使用过的例子:
能够从udev
数据库中提取设备信息,此外,还能够从sysfs
中提取设备的属性, 以帮助建立与此设备匹配的udev
规则
获取/dev/sdb
的path
信息
udevadm info -q path -n /dev/sdb
模拟向udev
发送设备信息,并不会真的触发,而是将触发后的过程信息打印出来,对调试颇有帮助, 我用这个查看脚本是否会被执行
udevadm test --action='add' `udevadm info -q path -n /dev/sdb`
注意: test
不会真正触发事件,而trigger
能够
能够真正触发udev
事件,可是不会真正改变硬件,只是触发kernel
和udev
的事件,会触发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
重载udev rules
,对以后触发的新设备有效,对以前已经触发的无效
udevadm control --relaod-rules
更改udev
日志等级为info
,udev
默认等级为err
,能够在/etc/udev/udev.conf
中查看,日志具体信息能够在syslog
中查看
udevadm control --log-priority=info
udev
还有不少有意思的地方,若是想要更加深刻的学习,那么除了熟练地掌握rules
等技巧,还要对其实现原理有了解,这就得多看文档,多看源码了,建议你们有条件的状况下多看源码,多看原始的东西,由于通过别人的总结就可能会变味,相互对比,不要一味依赖别人总结的产物
Linux 自动挂载usb设备 小例子 如何在usb
设备插入后自动挂载?
udev使用笔记 这篇文章里面那张图片不错
写个程序检测咱们的设备插拔 模仿内核源码简单地实现一个设备插拔的检测
linux下热插拔事件的产生是怎样通知到用户空间 事件传递过程,udev
源码解析
热插拔的工做原理 hotplug机制和udev udev
原理讲解
Uevent 上报event事件给上层的详细讲解 uevent
源码讲解
linux内核空间和用户空间的是怎样区别的,如何交互,如何从用户空间进入内核空间 内核空间和用户空间的一些剖析
Netlink实现热拔插监控 消息传输用的是什么?Netlink
是如何作到的