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