开始接触udev的时候,看各种资料觉得这个东西很深的时候,突然看到一篇文章说:树立一个信念:udev很简单,我没有当时是这么想的,现在我能理解了。其实稍微研究一下就可以理解了。那些看似很高端很遥远的title,比如LinuxKernel,比如软硬件交互,比如热插拔等等,其实掌握了几个规律,然后练习对比。解释完了,就知道来龙去脉了。如果你想更深入,你可以阅读更多关于文档实现和内核源代码。其实很多事情都是这样的。这很容易理解。如果你一无所知,你就会比别人知道得更多。什么是Udev?udev是linux内核的一个设备管理器,处理硬件的添加和移除,但它的功能远不止于此。比如插入U盘,电脑如何立即响应?耳机插上后自动关闭外接音量怎么办?这些都和udev有关。虽然udev很强大,功能也很多,但是还是想分享一下SCSI硬盘设备插拔的一些经验。至于为什么研究这个东西,是因为最近在做ceph相关的项目,需要实现一个类似于热插拔的特性。懂的应该很清楚,就是插拔硬盘后,osd会自动恢复,主要用于硬盘。寿命快到了,更换新盘的场景对于不懂的同学来说还好,因为本文主要讨论udevudevRulesudev管理各种设备,如USB,DISK,CD等,以便区分设备类型,精准匹配,udev制定了一套特征规则,为什么是特征呢?因为我觉得它用最简洁的语法来满足各方面的需求。这里有一些有用的链接:UDEVPrimerudev入门必读,可以快速了解udev编写udev规则的经典文章,看完这篇基本可以掌握udev规则的编写udev规则的修订版国内论坛做了一些修改格式。有洁癖的可以看Writingudevrules的翻译版。如果英文不好,可以对照udev中文手册进行中英文对比。突出贡献,早前看过他写的Apache手册,Writingudevrulesandkernelexamples。上面的规则看够了,我们来看看具体的例子。特殊技巧看完上面的文章,你应该知道规则文件的位置和规则了。下面我将贴出一些我实践中的代码和例子。这是添加和删除SCSI硬盘设备的两条规则,会分别触发设备事件。对应脚本:KERNEL=="sd[a-z]",ACTION=="add",SUBSYSTEM=="block",RUN+="/usr/bin/python/root/test.py%kadd"KERNEL=="sd[a-z]",ACTION=="remove",SUBSYSTEM=="block",RUN+="/usr/bin/python/root/test.py%kremove"注意:执行外部命令必须添加环境变量路径,上面的也可以不加/usr/bin/python,但是必须在py脚本的头部加上shebang:#!/usr/bin/pythonRUN可以运行程序外的程序,PROGRAM没有这个功能。就是生成Linkhashtag和shebangshebang相关的相关变量Udevadmudevadm是一个udev管理工具,可以用来获取设备信息(info),监视和控制udev运行时行为(control),请求内核事件(trigger),管理事件队列(解决),并提供简单的调试机制(测试)非常实用且易于使用!!!推荐Linkudevadm中文手册很全面,很基础~~udevadm命令实例很多udevadm命令可以参考,说不定以后可以用到?介绍几个我具体用过的例子:udevadminfo可以从udev数据库中提取设备信息。此外,它还可以从sysfs中提取设备属性,以帮助创建与该设备相匹配的udev规则。获取/dev/sdb的路径信息udevadminfo-qpath-n/dev/sdbudevadmtest模拟向udev发送设备信息,不会真正触发,而是打印出触发后的进程信息,对调试很有帮助。我用这个来检查脚本是否会被执行udevadmtest--action='add'`udevadminfo-qpath-n/dev/sdb`注意:test不会真正触发事件,但是trigger实际上可以触发udev事件,但不会真正改变Hardware只会触发kernel和udev事件,这会触发udev规则。我使用这个触发事件来验证规则是否匹配udevadmtrigger-v--action=add--sysname-match=sda注意:如果不添加sysname-match,它会触发所有设备。如果是action=remove,那么很多设备会被移除,甚至导致sshd服务停止。下面是sda而不是/dev/sda,因为它是根据pci路径来定位名字的。例如sda的路径为:/sys/devices/pci0000:00/0000:00:10.0/host2/target2:0:0/2:0:0:0/block/sdaudevadm控制重载udev规则,即对于后面触发的新设备有效,对于之前触发过的无效的udevadm控制--relaod-rules改变udev日志级别为info,udev默认级别为err,可以在/etc/udev/查看udev.conf。具体的日志信息可以在syslog中查看udevadmcontrol--log-priority=info关于udevudev还有很多有趣的东西,如果想学的更深入,那么除了熟练掌握规则之外s等技能,还要了解其实现原理。这就需要多阅读文档和源码了。换个口味,多比较,不要盲目依赖别人总结的产品Linux自动挂载usb设备小例子usb设备插入后如何自动挂载?udevusagenotes这篇文章的图不错。编写一个程序来检测我们的设备插拔。仿照内核源码简单实现一个设备插拔检测。linux下热插拔事件的事件传递过程如何通知用户空间?udev源码解析hotplug机制和udevudev原理详解Uevent向上层上报事件详解uevent源码详解Linux内核空间和用户空间的区别,如何交互,如何从用户空间进入内核空间一些分析内核空间和用户空间Netlink用什么实现热插拔监控消息传输?网联是怎么做到的
