linux 设备文件管理udev详解

1 udev是什么?

          udev 是 Linux2.6 内核里的一个功能,它替代了原来的 devfs,成为当前 Linux 默认的设备管理工具。udev 以守护进程的形式运行,通过侦听内核发出来的 uevent 来管理 /dev目录下的设备文件。不像之前的设备管理工具,udev 在用户空间 (user space) 运行,而不在内核空间 (kernel space) 运行。

        工作流程示意图如下:

2.0  devfs 概述:

        linux下有专门的文件系统用来对设备进行管理,devfs和sysfs就是其中两种。在2.6内核以前一直使用的是devfs,devfs挂载于/dev目录下,提供了一种类似于文件的方法来管理位于/dev目录下的所有设备,我们知道/dev目录下的每一个文件都对应的是一个设备,至于当前该设备存在与否先且不论,而且这些特殊文件是位于根文件系统上的,在制作文件系统的时候我们就已经建立了这些设备文件,因此通过操作这些特殊文件,可以实现与内核进行交互。

2.1 devfs的几个缺点:

* 不确定的设备映射。特别是那些动态设备,比如USB设备,设备文件到实际设备的映射并不可靠和确定。举一个例子:如果你有两个USB打印机。一个可能称为 /dev/usb/lp0,另外一个便是/dev/usb/lp1。但是到底哪个是哪个并不清楚,lp0,lp1和实际的设备没有一一对应的关系,因为他可能因为发现设备的顺序,打印机本身关闭等原因而导致这种映射并不确定。理想的方式应该是:两个打印机应该采用基于他们的序列号或者其他标识信息的唯一设备文件来映射。但是静态文件和devfs都无法做到这点。

*没有足够的主/辅设备号。我们知道,每一个设备文件是有两个8位的数字:一个是主设备号 ,另外一个是辅设备号来分配的。这两个8位的数字加上设备类型(块设备或者字符设备)来唯一标识一个设备。不幸的是,关联这些身边的的数字并不足够。

*/dev目录下文件太多。一个系统采用静态设备文件关联的方式,那么这个目录下的文件必然是足够多。而同时你又不知道在你的系统上到底有那些设备文件是激活的。

*命名不够灵活。尽管devfs解决了以前的一些问题,但是它自身又带来了一些问题。其中一个就是命名不够灵活;你别想非常简单的就能修改设备文件的名字。缺省的devfs命令机制本身也很奇怪,他需要修改大量的配置文件和程序。

*内核内存使用,devfs特有的另外一个问题是,作为内核驱动模块,devfs需要消耗大量的内存,特别当系统上有大量的设备时(比如上面我们提到的系统一个上有好几千磁盘时)

2.2 sysfs 概述:         

       udev的目标是想解决上面提到的这些问题,他通采用用户空间(user-space)工具来管理/dev/目录树,他和文件系统分开。知道如何改变缺省配置能让你之大如何定制自己的系统,比如创建设备字符连接,改变设备文件属组,权限等。

        正因为上述这些问题的存在,在linux2.6内核以后,引入了一个新的文件系统sysfs,它挂载于/sys目录下,跟devfs一样它也是一个虚拟文件系统,也是用来对系统的设备进行管理的,它把实际连接到系统上的设备和总线组织成一个分级的文件,用户空间的程序同样可以利用这些信息以实现和内核的交互,该文件系统是当前系统上实际设备树的一个直观反应,它是通过kobject子系统来建立这个信息的,当一个kobject被创建的时候,对应的文件和目录也就被创建了,位于/sys下的相关目录下,既然每个设备在sysfs中都有唯一对应的目录,那么也就可以被用户空间读写了。用户空间的工具udev就是利用了sysfs提供的信息来实现所有devfs的功能的,但不同的是udev运行在用户空间中,而devfs却运行在内核空间,而且udev不存在devfs那些先天的缺陷。很显然,sysfs将是未来发展的方向。

3  udev实例:

udev规则文章参考:https://blog.csdn.net/xiaoliu5396/article/details/46531893

例1 使用udev修改u盘设备文件名

1) fdisk -l 查看U盘信息

Disk /dev/sdb:14.5 GiB,15518924800 字节,30310400 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x500a0dff

设备       启动       起点       末尾       扇区   大小 Id 类型
/dev/sdb1       1948285285 3650263507 1701978223 811.6G 6e 未知
/dev/sdb2                0          0          0     0B 74 未知
/dev/sdb4         28049408   28049848        441 220.5K  0 空

2)获取修改U盘/dev/sdb的详细信息

tips1 :目前多数系统上均由udevadm info 替代udevinfo,使用udevadm 查看设备信息。

终端输入 :udevadm info -a -p $(udevadm info -q path -n /dev/sdb)

截取部分有用信息如下:

 looking at device '/devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/1-1/1-1:1.0/host33/target33:0:0/33:0:0:0/block/sdb':
    KERNEL=="sdb"
    SUBSYSTEM=="block"
    DRIVER==""
    ATTR{alignment_offset}=="0"
    ATTR{capability}=="51"
    ATTR{discard_alignment}=="0"

或在终端输入 : udevadm info -q path -n /dev/sdb

/devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/1-1/1-1:1.0/host33/target33:0:0/33:0:0:0/block/sdb

3) 修改 /etc/udev/rules.d下映射文件

 创建文件   touch 80-usb.rules

 修改文件  vi 80-usb.rules

 KERNEL=="sdb",SUBSYSTEMS=="block",SYMLINK+="Kingston_link"

4) 验证生效

     一般我们要使这个规则文件生效,要热插拔我们的设备以产生一个事件或在设备中的event文件中增加信息以达到发送事件的目的来更新我们的udev规则,但这里有个更加方便的方法,我们可以运行下面这个命令。

    udevadm test /sys/class/block/sdb

    终端中输入命令:ll /dev/Kingston_link

    /dev/Kingston_link -> sdb4



 

猜你喜欢

转载自blog.csdn.net/weixin_42121713/article/details/119635313