解读udev的几个作用

  转载:https://blog.csdn.net/fengying765/article/details/6995313

udev是一种工具,它能够根据系统中的硬件设备的状况动态更新设备文件,包括设备文件的创建,删除等。设备文件通常放在/dev目录下,使用udev后,在/dev下面只包含系统中真实存在的设备。它于硬件平台无关的,位于用户空间,需要内核sysfs和tmpfs的支持,sysfs为udev提供设备入口和uevent通道,tmpfs为udev设备文件提供存放空间。

    在 sysfs 下的很多 kobject 下都有 uevent 属性,它主要用于内核与 udev 之间的一个通信接口;从 udev 本身与内核的通信接口 netlink 协议套接字来说,它并不需要知道设备的 uevent 属性文件,但多了 uevent 这样一个接口,可用于 udevmonitor 通过内核向 udevd发送消息,也可用于检查设备本身所支持的 netlink 消息上的环境变量,这个特性一般用于开发人员调试 udev 规则文件, udevtrigger 这个调试工具本身就是以写各设备的 uevent 属性文件实现的。

udev具有如下几个作用:

1. 内核设备事件管理

     * 启动初始化时, /dev目录使用tmpfs挂载,然后, Udev拷贝/lib/udev/devices 的静态设备节点到 /dev 目录.
     * Udev守护进程开始运行,为所有连接到系统的设备收集来自内核的uevents.
     * Udev守护进程解析uevent数据,并且对/etc/udev/rules.d中指定的规则进行匹配.
     * 根据指定的规则为设备创建设备节点和符号链接.
     * Udev守护进程读取/etc/udev/rules.d/*.rules 中的规则并且保存到内存里面.
     * Udev接收接收inotify事件,如果某个规则发生了改变,读取这些改变并更新内存副本. 

2. 管理设备节点的权限

     在规则文件(*.rules)中利用关键子OWNER, GROUP, MODE为设备设定权限。例如“

     KERNEL=="sda", NAME="my_root_disk", MODE="0660"

     KERNEL 是匹配键,NAME 和 MODE 是赋值键。

     这条规则的意思是:如果有一个设备的内核设备名称为 sda,则该条件生效,执行后面的赋值:

     在 /dev下产生一个名为 my_root_disk的设备文件,并把设备文件的权限设为 0660。

     例如:/etc/udev/rules.d/10-local.rules

     KERNEL=="event*", NAME="input/%k", MODE:="0660", GROUP:="input"
     KERNEL=="mouse*", NAME="input/%k", MODE:="0660", GROUP:="input"
     KERNEL=="mice*", NAME="input/%k", MODE:="0660", GROUP:="input"

     这时插拔一下usb鼠标就会发现/dev/input/mousex以及和它相关的/dev/input/eventx的所属组变成了“input”,而不是默认的“root”。

3. 在/dev中创建额外的符号链接

     插拔移动设备将在/dev目录下创建/删除设备的符号链接,例如:

     # ls /dev/sda1

4. 重命名的网络接口的系统软件

     创建一个rules文件/etc/udev/rules/10-local.rules,如下所示:

     DRIVER=“rt3070sta”,NAME=“wlan0”

     其中“DRIVER”为无线网络驱动的名称,“NAME”为重命名后的无线网络名称

     还可以利用nameif重命名网络接口

     nameif ra0 74:F0:6D:4E:89:3A

     其中,“ra0” 为重命名后的无线网络名称,“74:F0:6D:4E:89:3A” 无线网络的mac地址

5. 动态分配主/次设备号

     传统的devfs不能动态分配major和minor的值,而major和minor非常有限,很快就会用完了。udev能够像DHCP动态分配IP地址一样去动态分配major和minor。

6.提供设备命名持久化的机制

    传统设备命名方式不具直观性,像/dev/hda1这样的名字肯定没有boot_disk这样的名字直观。udev能够像DNS解析域名一样去给设备指定一个有意义的名称。
 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设我们有一个USB设备插入到系统中,我们希望在插入时执行一个脚本来自动挂载该设备并将其添加到系统中。 首先,我们需要创建一个udev规则文件,以便在插入设备时自动触发该脚本。我们可以在/etc/udev/rules.d/目录下创建一个新的规则文件,例如我们可以创建一个名为“10-usb-mount.rules”的文件,其中包含以下内容: ACTION=="add", KERNEL=="sd*", SUBSYSTEMS=="usb", RUN+="/path/to/mount_script.sh %k" 在这个规则文件中,“ACTION==”add””表示当设备被添加到系统中时触发该规则,“KERNEL==”sd*””表示匹配以“sd”为前缀的设备,例如“sda”、“sdb”等等,“SUBSYSTEMS==”usb””表示匹配USB子系统中的设备,最后,“RUN+=”/path/to/mount_script.sh %k””表示在匹配设备时运行一个脚本文件“mount_script.sh”,并将设备的内核名称传递给该脚本。 接下来,我们需要编写一个脚本文件“mount_script.sh”,以便在设备插入时自动挂载该设备。以下是一个示例脚本: #!/bin/bash DEVNAME=$1 MOUNTPOINT=/media/usb mkdir -p $MOUNTPOINT mount /dev/$DEVNAME $MOUNTPOINT 在这个脚本中,“$1”表示我们从udev规则中传递的内核名称,我们将其存储在变量“DEVNAME”中。然后,我们定义了一个挂载点“/media/usb”,并使用“mkdir -p”命令创建该目录(如果它不存在)。最后,我们使用“mount”命令将设备挂载到该挂载点上。 完成上述步骤后,我们只需要重新加载udev规则并重新插入设备即可自动执行脚本并挂载设备。这可以通过以下命令完成: sudo udevadm control --reload-rules sudo udevadm trigger 现在,每当我们插入一个USB设备时,udev将自动触发我们的脚本并自动挂载该设备。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值