Linux udevadm monitor 如何区分内核事件和规则动作
来源:17golang原创
时间:2026-09-14 19:13:23 498浏览 收藏
第一次排查 USB、磁盘或虚拟块设备时,我常看到 udevadm monitor 连续打印两组近似的内容。它们不是重复日志:--kernel 看到的是内核发出的 uevent,--udev 看到的是 udev 规则处理后的事件。判断规则是否介入,关键是同时看事件通道、ACTION、DEVPATH 和属性,而不是只盯着某一行输出。
-k只打印 kernel uevent,-u只打印规则处理后的 udev event。-p补充属性,-s block能把观察范围缩到块设备。- monitor 用于看真实事件时序,规则本身的匹配结果应另用
udevadm test验证。
先把监听对象拆成 kernel 与 udev 两条通道
先开一个观察窗口,分别执行下面两条命令。它们只负责选择事件来源,不会修改 udev 规则:
# 分别观察内核事件和 udev 规则处理后的事件
udevadm monitor --kernel
udevadm monitor --udev
# 同时观察两条通道,便于对照同一个设备动作
udevadm monitor --kernel --udev
示意输出里,内核事件通常先出现,随后才有 udev 事件。两者可能共享同一 DEVPATH 和 ACTION=add,但出现时间不同。这里的“先后”只说明观察到的处理阶段,不代表 udev 一定为每个字段创建了新值。

用属性和 subsystem 过滤掉无关噪声
不加参数时,设备事件一多就很难定位。排查块设备时,我更常用属性和 subsystem 过滤:
# 只看 udev 阶段,并打印便于比对的属性
udevadm monitor --udev --property --subsystem-match=block
# 需要区分设备类型时,把 devtype 写进匹配条件
udevadm monitor --kernel --property --subsystem-match=block/disk
--property(短参数 -p)会把事件属性一并打印;--subsystem-match(短参数 -s)按 subsystem[/devtype] 过滤。常用核对字段如下:
| 字段或参数 | 排查作用 | 不要误判成什么 |
|---|---|---|
ACTION | 判断 add、remove、change 等动作 | 不是规则是否匹配的结论 |
DEVPATH | 把两条通道对应到同一个 sysfs 设备 | 不是可直接复制的设备节点 |
DEVNAME | 查看 udev 阶段是否给出设备名 | 不等于内核原始事件必然携带它 |
-s block | 缩小到 block subsystem | 不会改变事件,只改变显示范围 |

从 ACTION、DEVPATH 和时间差判断规则是否介入
真正有用的判断顺序是:先看事件通道,再对比 DEVPATH,然后观察 ACTION 和属性差异。若同一设备先出现 kernel 的 add,稍后出现 udev 的 add,这符合“内核通知—udev 处理”的基本观察模型。若只看 udev 输出,很容易把 DEVNAME、权限或标签等规则结果误写成内核事件。
规则动作也不等于任意脚本都同步完成。monitor 关注的是事件消息与规则处理后的广播,不能单凭一行输出证明某个外部程序已经执行完。要查时序,保留 -k、-u 两路;要查属性来源,打开 -p;要查规则为什么匹配,则进入下一步。
把 monitor 结果和规则测试分开验证
拿到 sysfs 路径后,可以用 udevadm test 模拟一次规则处理。它和 monitor 的职责不同:
# 对指定 sysfs 路径模拟 add,查看规则匹配和处理输出
# 这里的路径只是示例,实际值应从 DEVPATH 或 sysfs 中确认
udevadm test --action=add /sys/class/block/loop0
# 只看实时设备事件,不把模拟测试当成真实插拔
udevadm monitor --kernel --udev --property
test 适合回答“规则会怎样处理这个设备”,monitor 适合回答“真实事件何时到达、经过了哪一层”。二者结果不一致时,先检查模拟路径、ACTION 和当前规则加载状态,不要直接修改匹配条件。
相关问题
为什么只看到 Kernel device events?
可能只启用了 --kernel,也可能 udev 阶段尚未产生可见事件。先确认命令没有带互斥过滤,再用一个明确的 subsystem 缩小范围。
怎么只观察某类块设备?
使用 --subsystem-match=block;若还要区分设备类型,再写成 block/disk 等具体匹配。
规则文件改完,monitor 会重新加载它吗?
monitor 本身只是监听器,不负责重载规则。规则更新后应按发行版的 systemd-udevd 管理方式重新加载,再用 udevadm test 和真实事件分别确认。
记住这条边界就够实用:kernel 是设备事件的起点,udev 是规则处理后的观察点;用 DEVPATH 对齐对象,用 ACTION 判断动作,用 -p 和 -s 减少噪声,排查会比单看一段连续输出可靠得多。
-
364 收藏
-
339 收藏
-
233 收藏
-
120 收藏
-
122 收藏
-
431 收藏
-
421 收藏
-
357 收藏
-
383 收藏
-
340 收藏
-
298 收藏
-
358 收藏
-
314 收藏
-
317 收藏
-
449 收藏
-
233 收藏
-
344 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习