• 首页
  • Qt文档
  • DTK文档
  • 玲珑文档
  • udev详解

    udev是linux kernel的设备管理器。自2.6 内核开始,linux引入了sysfs 文件系统。sysfs 把连接在系统上的设备和总线组织成一个分级的文件,并提供给用户空间存取使用。udev 运行在用户模式,而非内核中。udev 的初始化脚本在系统启动时创建设备节点,并且当插入新设备——加入驱动模块——在sysfs上注册新的数据后,udev会创新新的设备节点。

    udev设备文件系统

    1、关于udev

    ​ udev是linux kernel的设备管理器。自2.6 内核开始,linux引入了sysfs 文件系统。sysfs 把连接在系统上的设备和总线组织成一个分级的文件,并提供给用户空间存取使用。udev 运行在用户模式,而非内核中。udev 的初始化脚本在系统启动时创建设备节点,并且当插入新设备——加入驱动模块——在sysfs上注册新的数据后,udev会创新新的设备节点。

    ​ 在早期的 Linux 版本中,/dev目录包含了所有可能出现的设备的设备文件。很难想象 Linux 用户如何在这些大量的设备文件中找到匹配条件的设备文件。现在 udev 只为那些连接到 Linux 操作系统的设备产生设备文件。并且 udev 能通过定义一个 udev 规则 (rule) 来产生匹配设备属性的设备文件,这些设备属性可以是内核设备名称、总线路径、厂商名称、型号、序列号或者磁盘大小等等。

    ​ 动态管理:当设备添加 / 删除时,udev 的守护进程侦听来自内核的 uevent,以此添加或者删除 /dev下的设备文件,所以 udev 只为已经连接的设备产生设备文件,而不会在 /dev下产生大量虚无的设备文件。

    2、udev工作流程

    udev

    3、udev规则

    ​ 主要的udev配置文件是/etc/udev/udev.confl,udev规则文件一般存放在/etc/udev/rules.d/下,以xxxx.rules命名。

    ① udev 规则的所有操作符

    “==”: 比较键、值,若等于,则该条件满足; “!=”: 比较键、值,若不等于,则该条件满足; “=”: 对一个键赋值。 “+=”: 为一个表示多个条目的键赋值。 “:=”: 对一个键赋值,并拒绝之后所有对该键的改动。目的是防止后面的规则文件对该键赋值。

    ② udev 规则的匹配键

    ACTION:          事件 (uevent) 的行为,例如:add( 添加设备 )、remove( 删除设备 )。

    KERNEL:          内核设备名称,例如:sda, cdrom。

    DEVPATH:        设备的 devpath 路径。

    SUBSYSTEM:        设备的子系统名称,例如:sda 的子系统为 block。

    BUS:           设备在 devpath 里的总线名称,例如:usb。

    DRIVER:           设备在 devpath 里的设备驱动名称,例如:ide-cdrom。

    ID:             设备在 devpath 里的识别号。

    SYSFS{filename}:      设备的 devpath 路径下,设备的属性文件“filename”里的内容。               例如:SYSFS{model}==“ST936701SS”表示:如果设备的型号为 ST936701SS,则 该设备匹配该匹配键。在一条规则中,可以设定最多五条 SYSFS 的 匹配键。

    ENV{key}:          环境变量。在一条规则中,可以设定最多五条环境变量的 匹配键。

    PROGRAM:        调用外部命令。

    RESULT:           外部命令 PROGRAM 的返回结果。

    ③ udev 的重要赋值键

    NAME:        在 /dev下产生的设备文件名。只有第一次对某个设备的 NAME 的赋值行为生 效,之后匹配的规则再对该设备的 NAME 赋值行为将被忽略。如果没有任何规 则对设备的 NAME 赋值,udev 将使用内核设备名称来产生设备文件。

    SYMLINK:         为 /dev/下的设备文件产生符号链接。由于 udev 只能为某个设备产生一个设备文 件,所以为了不覆盖系统默认的 udev 规则所产生的文件,推荐使用符号链接。

    OWNER, GROUP, MODE:  为设备设定权限。

    ENV{key}:         导入一个环境变量。

    ④ udev 的值和可调用的替换操作符

    Linux 用户可以随意地定制 udev 规则文件的值。例如:my_root_disk, my_printer。同时也可以引用下面的替换操作符:

    $kernel, %k:       设备的内核设备名称,例如:sda、cdrom。

    $number, %n:      设备的内核号码,例如:sda3 的内核号码是 3。

    $devpath, %p:      设备的 devpath路径。

    $id, %b:         设备在 devpath里的 ID 号。

    $sysfs{file}, %s{file}:   设备的 sysfs里 file 的内容。其实就是设备的属性值。

    $env{key}, %E{key}:    一个环境变量的值。

    $major, %M:     设备的 major 号。

    $minor %m:       设备的 minor 号。

    $result, %c:        PROGRAM 返回的结果。

    $parent, %P:       父设备的设备文件名。

    $root, %r:         udev_root的值,默认是 /dev/。

    $tempnode, %N:     临时设备名。

    %%:           符号 % 本身。

    $$:            符号 $ 本身。

    4、适配案例

    ​ 因为UOS桌面专业版默认不开启开发者模式(root权限),所以在外设适配时,打包过程需要添加udev规则才能使普通用户拥有外设权限。在工作目录下创建etc/udev/rules.d/目录,在rules.d目录下创建xxx.rules规则文件并编辑。

    串口外设案例

    USB外设案例