御风灰灰
发布于 2024-07-11 / 14 阅读
0
0

udev热拔插调试

1. 什么是udev?

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

2. 使用udev的好处

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

  1. 动态管理:当设备添加/删除时,udev 守护进行帧听来自内核的 uevent,以此添加或者删除 /dev 下的设备文件,所以 udev 只为已经连接的设备产生设备文件,而不会在 /dev 下产生大量虚无的设备文件。
  2. 自定义命名规则:通过 Linux 默认的规则文件,udev 在 /dev/ 里为所有的设备定义了内核设备名称,比如 /dev/sda、/dev/hda、/dev/fd 等等。由于 udev 是在用户空间(user space)运行,Linux 用户可以通过自定义的规则文件,灵活地产生标识性强的设备文件名,比如 /dev/boot_disk、/dev/root_disk、/dev/color_printer 等等 。
  3. 设定设备的权限和所有者/组:udev 可以按一定的条件来设置设备文件的权限和设备文件所有者/组。在不同的 udev 版本中,实现的方法不同,在 “如何配置和使用 udev” 中会详解。

3. 工作流程

linux-udev-流程.png

4. 调试过程

4.1 获取设备信息

根据设备路径信息查询设备属性

udevadm info -a -p /sys/class/net/usb0

linux-udev-设备信息.png

4.2 编写规则文件

规则文件是 udev 里最重要的部分,默认是存放在 /etc/udev/rules.d/ 下。所有的规则文件必须以 “.rules” 为后缀名,规则文件按第一个字母或数字的顺序执行。

系统udev路径: /etc/udev/rules.d/

示例文件: 10-myurule.rules

4.2.1 规则的所有操作符

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

4.2.2 规则的匹配键

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" 里的内容;

4.2.3 变量替换符

符号 说明
$kernel,%k 设备的内核设备名称,例如:sda、cdrom;
$number,%n 设备的内核号码,例如:sda3 的内核号码是 3;
$devpath,%p 设备的 devpath 路径;
$id,%b 设备在 devpath 里的 ID 号;
$sysfs{file},%s{file} 设备的 sysfs 里 file 的内容,其实就是设备的属性值; $sysfs{size} 表示该设备(磁盘)的大小
$env{key},%E{key} 一个环境变量的值
$major,%M 设备的 major 号
$minor,%m 设备的 minor 号
$resule,%c PROGRAM 返回的结果
$parent,%P 父设备的设备文件名
$root,%r udev_root 的值,默认是 /dev/
$tempnode,%N 临时设备名
%% 符号 % 本省;
$$ 符号 $ 本身;

4.3 重启udev

重新加载udev

sudo udevadm control --reload
sudo service udev restart

4.4 监控udev事件

udevadm monitor -ku

评论