udev文件系统的使用和基本工作原理分析

分类: 40.系统集成相关 2008-01-09 13:05 4657人阅读 评论(3) 收藏 举报
作者:刘旭晖 colorant@163.com 转载请注明出处
http://blog.csdn.net/colorant/
Udev相关的文章很多,本文的主要目的不是提供一个完整的教学文档,对其使用,只是给出网上现有的主要资源。着重分析其基本工作原理以及在使用中遇到的一些README文档没有明确说明的问题。
1         基本概念
udev文件系统是针对2.6内核,提供一个基于用户空间的动态设备节点管理和命名的解决方案,网上关于为什么要使用udev文件系统,udev文件系统和devfs文件系统的比较,等等的文章已经很多了,如果你想了解这方面的内容,请直接搜索相关的关键字。
udev的官方网址:http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev.html
src code的下载地址:http://www.us.kernel.org/pub/linux/utils/kernel/hotplug/
此外,关于udev的rules规则的撰写,网上也有很多文章,如果要获得最准确的版本,可以在src code的代码树里找到writing_udev_rules的帮助文档,这个文档其实没有逐条介绍rules的所有关键字,可以结合man udev 和 udev自带的一些rules文件来理解如何撰写你所需要的规则文件。
2         安装和启动
2.1        安装
Udev的代码树里的版本很多,我下载的最新的版本是udev-117,配合2.6.21版本的内核能够正常使用。网上很多文章介绍的可能都是稍微早期一些的版本,有些步骤包括udev的README文档似乎描述的不是很准确。
基本上这个版本的udev需要注意的是,安装时只需要udevd,udevadm两个文件,其它必需的包括udevtrigger等只是udevadm的一个符号链接。udevstart不是必需的。当然Udev.conf等配置文件还是一样。
2.2        启动
你可以在启动脚本中用udevd –d 参数启动udev文件系统的守护进程,然后使用udevtrigger将buildin的设备驱动的节点创建出来,以后模块插入移除时节点的管理会自动处理。
能够正常加载udev的前提,基本包括如下操作:
Ø       设置路径变量
Ø       加载sysfs文件系统
Ø       加载一个基于ram的可写的/dev目录(其实,只要提供一个可写的目录即可,目录路径本身也是可以配置的)
Ø       /dev目录下需要有已经创建好的 console节点和null节点
脚本类似:
# Set the path
PATH=/bin:/sbin:/usr/bin:/usr/sbin
export PATH
# mount proc and devpts filesystem
/bin/mount -a
mknod /dev/console c 5 1
mknod /dev/null c 1 3
/sbin/udevd -d
/sbin/udevtrigger
Mount使用的fstab文件类似:
none/tmp                    ramfs   defaults        0 0
udev/dev                    ramfs   defaults        0 0
none/proc                   proc    defaults        0 0
sysfs/sys                    sysfs   defaults        0 0
当然,你的系统上可能还会需要预先创建一些其它的设备节点,比如串口的ttySx 才能正常启动shell,完成以上脚本的执行,那就要看具体情况了。
3         使用中的一些问题的思考
3.1        关于规则的多次匹配
帮助文档中说一个设备可以被多条规则多次匹配,不过,需要明确的一点是:
多次匹配只能添加多个Symlink,不能创建多个Name:
例如:
KERNEL=="mtdblock4", NAME+="mtdbb4"
KERNEL=="mtdblock4", NAME+="%k"
就只会创建 /dev/mtdbb4 而不会创建/dev/mtdblock4
而类似:
KERNEL=="mtdblock4", NAME+="mtdbb4"
KERNEL=="mtdblock4", SYMLINK+="mtdbb4link"
是可以正常工作的。
3.2        关于udev.conf的语法
可能大家会发现,似乎没有什么详细文档描述udev.conf的写法,实际上从udevd的代码里可以看出:
udev.conf文件里面只会解析这三个参数:
udev_root 定义udev的目录路径
udev_rules 定义udev的规则文件的目录路径
udev_log 定义log的级别
也许以后会添加一些别的配置参数?
4         基本工作原理方面的问题
这部分主要是分析了一下udev的source code,对一些自己关心的问题的理解
4.1        Udevd如何获取内核的这些模块动态变化的信息
设备节点的创建,是通过sysfs接口分析dev文件取得设备节点号,这个很显而易见。那么udevd是通过什么机制来得知内核里模块的变化情况,如何得知设备的插入移除情况呢?当然是通过hotplug机制了,那hotplug又是怎么实现的?或者说内核是如何通知用户空间一个事件的发生的呢?
答案是通过netlink socket通讯,在内核和用户空间之间传递信息。
内核调用kobject_uevent函数发送netlink message给用户空间,这部分工作通常不需要驱动去自己处理,在统一设备模型里面,在子系统这一层面,已经将这部分代码处理好了,包括在设备对应的特定的Kobject创建和移除的时候都会发送相应add和remove消息,当然前提是你在内核中配置了hotplug的支持。
Netlink socket作为一种内核与用户空间的通信方式,不仅仅用在hotplug机制中,同样还应用在其它很多真正和网络相关的内核子系统中。
Udevd通过标准的socket机制,创建socket连接来获取内核广播的uevent事件 并解析这些uevent事件。
4.2        Udevd如何监控规则文件的变更
如果内核版本足够新的话,在规则文件发生变化的时候,udev也能够自动的重新应用这些规则,这得益于内核的inotify机制, inotify是一种文件系统的变化通知机制,如文件增加、删除等事件可以立刻让用户态得知。
在udevd中,对inotify和udev的netlink socket文件描述符都进行了select的等待操作。有事件发生以后再进一步处理。
4.3        Udevtrigger的工作机制?
运行udevd以后,使用udevtrigger的时候,会把内核中已经存在的设备的节点创建出来,那么他是怎么做到这一点的? 分析udevtrigger的代码可以看出:
udevtrigger通过向/sysfs 文件系统下现有设备的uevent节点写"add"字符串,从而触发uevent事件,使得udevd能够接收到这些事件,并创建buildin的设备驱动的设备节点以及所有已经insmod的模块的设备节点。
所以,我们也可以手工用命令行来模拟这一过程:
/ # echo "add" > /sys/block/mtdblock2/uevent
/ #
/ # UEVENT[178.415520] add/block/mtdblock2 (block)
但是,进一步看代码,你会发现,实际上,不管你往uevent里面写什么,都会触发add事件,这个从kernel内部对uevent属性的实现函数可以看出来,默认的实现是:
static ssize_t store_uevent(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count)
{
kobject_uevent(&dev->kobj, KOBJ_ADD);
return count;
}
所以不管写的内容是什么,都是触发add操作,真遗憾,我还想通过这个属性实验remove的操作。 不知道这样限制的原因是什么。
而udevstart的实现方式和udevtrigger就不同了,它基本上是重复实现了udevd里面的机制,通过遍历sysfs,自己完成设备节点的创建,不通过udevd来完成。
4.4        其它
Ø       udevd创建每一个节点的时候,都会fork出一个新的进程来单独完成这个节点的创建工作。
Ø       Uevent_seqnum 用来标识当前的uevent事件的序号(已经产生了多少uevent事件),你可以通过如下操作来查看:
$ cat /sys/kernel/uevent_seqnum
2673

转载于:https://www.cnblogs.com/yuzaipiaofei/archive/2011/07/28/4124461.html

udev文件系统的使用和基本工作原理分析相关推荐

  1. Hadoop生态圈-Zookeeper的工作原理分析

    Hadoop生态圈-Zookeeper的工作原理分析 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   无论是是Kafka集群,还是producer和consumer都依赖于Zoo ...

  2. RxJs map operator 工作原理分析

    使用一个例子来研究 map 操作符的工作原理. 推荐阅读本文之前,先浏览这篇文章RxJs fromEvent 工作原理分析以了解相关知识. 源代码: import { Component, OnIni ...

  3. 原理剖析(第 009 篇)ReentrantReadWriteLock工作原理分析

    2019独角兽企业重金招聘Python工程师标准>>> 原理剖析(第 009 篇)ReentrantReadWriteLock工作原理分析 一.大致介绍 1.在前面章节了解了AQS和 ...

  4. 匿名突破网络限制 (Tor工作原理分析)

    转载自:http://blog.163.com/mike_gz/blog/static/247532200672932800/ 网管顾名思义,就是天天管着网络.想尽各种手段限制我们上网的人.在网络中订 ...

  5. 滑环的基本结构及工作原理分析

    滑环是工业机械部件,基本原理是利用导电机械部件的折动或滚动在接触旋转部件和静止部件之间传递电能或电信号的产业部部件,作为360度旋转方式的一个相当好的解决方法,那么,下面一起了解下滑环的基本结构及工作 ...

  6. 【高通SDM660平台 Android 10.0】(19) --- Camera_focus、Camera_snapshot、volume_up 按键工作原理分析

    [高通SDM660平台 Android 10.0]19 --- Camera_focus.Camera_snapshot.volume_up 按键工作原理分析 一. DTS代码配置 二. Kernel ...

  7. 二极管温度补偿电路工作原理分析

    众所周知,PN结导通后有一个约为0.6V(指硅材料PN结)的压降,同时PN结还有一个与温度相关的特性:PN结导通后的压降基本不变,但不是不变,PN结两端的压降随温度升高而略有下降,温度愈高其下降的量愈 ...

  8. 船型开关工作原理分析

    船型开关工作原理分析 由于疫情,这几个月一直无聊的待在家里,就把家里翻出来的旧电热锅简单的修理了一下,关于电热锅的修理博客之后有时间再写吧,这次就总结下在修过程中让我一直很头疼的船型开关的工作原理. ...

  9. 全自动升降柱工作原理分析

    全自动升降柱工作原理分析 全自动升降柱使用范围比较广泛,在城市交通安全中提供非常便捷的交通舒缓措施,可控制车辆行驶确保安全,全自动升降柱外观设计精美, 具有高的防撞击效果,当电动升降柱升起可在地面形成 ...

  10. KVM-QEMU基本工作原理分析(二)

    1.理解KVM与Qemu的关系 我们都知道开源虚拟机KVM,并且知道它总是跟Qemu结合出现,那这两者之间有什么关系呢? 首先,Qemu本身并不是KVM的一部分,而是一整套完整的虚拟化解决方案,它是纯 ...

最新文章

  1. 关于tail, head ,less ,more ,cat 之小介------Linux命令
  2. 公司inur php id_,PHP——个人信息管理系统
  3. 1-10 之间的整数相加,得到累加值大于 20 的当前数
  4. 2012服务器系统安装iis,Windows Server 2012服务器管理系统安装配置IIS8.5教程
  5. perl中-和=作用
  6. 令新手头痛的java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet错误...
  7. Python入门--局部变量,全局变量,作用域,LEGB规则
  8. Camel In Action 读书笔记 (8)
  9. 190819每日一句
  10. MTK modemlog分析
  11. 特殊字符 U+200X/
  12. vbs脚本的基本使用
  13. 西南大学计算机试题答案,17秋西南大学计算机组成原理【0013】机考答案
  14. Ios 公司申请苹果账号
  15. STM32 RTOS创建消息队列的两种方式(解决数据类型问题)
  16. 百度地图Javascript API 使用记录
  17. SecureCRT方向键不可用
  18. 第 40 章 呼吸灯与 SPWM 波
  19. qs计算机专业排名2017,2017年qs计算机专业大学排名
  20. Nexus搭建Maven私服全攻略一:认识Nexus与索引

热门文章

  1. 064 import和from...import
  2. Java开发笔记(一百三十五)Swing的文件对话框
  3. JMS学习十一(ActiveMQ Consumer高级特性之独有消费者(Exclusive Consumer))
  4. JQuery原生js ——实现剪刀石头布小游戏
  5. JAVA(int...i)问题
  6. 点聚-weboffice 6.0 (一)
  7. WCF消息传输的几个基本概念(知识点整理)
  8. .Net CF 开发菜鸟笔记(PDA应用开发)
  9. 雷蛇灯光配置文件_突破极限!Razer雷蛇发布高性能V2版炼狱蝰蛇和巴塞利斯蛇...
  10. grasshopper插件_【Grasshopper 的奇技淫巧】 —— 插件(二)