udevadm 是 udev 设备管理器的管理工具,udev 是 Linux 内核的设备管理器,负责在 /dev 目录下动态创建设备节点。
主要功能包括:
udevadm [options] command
| 命令 | 说明 |
|---|---|
info |
查询设备信息 |
trigger |
触发设备事件 |
settle |
等待设备事件队列完成 |
control |
控制 udev 守护进程 |
monitor |
监控内核和设备事件 |
test |
测试设备事件处理 |
| 选项 | 说明 |
|---|---|
-d, --debug |
启用调试输出 |
-h, --help |
显示帮助信息 |
-q, --quiet |
静默模式,不输出信息 |
-V, --version |
显示版本信息 |
-e, --export |
导出属性为键值对 |
-p, --property=NAME |
仅显示指定属性 |
查询指定设备的详细信息:
# 查询设备信息
udevadm info /dev/sda
# 查询设备路径的信息
udevadm info -p /sys/class/net/eth0
# 查询设备属性
udevadm info -q property -n /dev/sda
# 查询所有属性(包括环境变量)
udevadm info -a -p /sys/class/net/eth0
实时监控系统设备事件:
# 监控内核和设备事件
udevadm monitor
# 监控内核事件(uevents)
udevadm monitor -k
# 监控udev事件
udevadm monitor -u
# 监控属性变化事件
udevadm monitor -p
# 监控所有事件并显示属性
udevadm monitor --kernel --udev --property
手动触发设备事件,让udev重新处理设备:
# 触发所有设备事件
udevadm trigger
# 触发指定类型设备
udevadm trigger --type=devices --action=add
# 触发子系统事件
udevadm trigger --subsystem-match=usb
# 触发属性匹配的设备
udevadm trigger --attr-match=idVendor=1234
# 触发并等待完成
udevadm trigger --verbose --settle
等待udev事件队列处理完成:
# 等待事件队列完成
udevadm settle
# 等待指定时间(秒)
udevadm settle --timeout=30
# 等待指定设备文件出现
udevadm settle --exit-if-exists=/dev/sdb1
测试udev规则对设备的处理:
# 测试设备事件处理
udevadm test /sys/class/net/eth0
# 测试并显示详细调试信息
udevadm test -a -p /sys/block/sda
# 测试特定动作
udevadm test-builtin path_id /sys/class/block/sda
控制udev守护进程的运行状态:
# 重新加载udev规则
udevadm control --reload-rules
# 重新加载规则并触发事件
udevadm control --reload
# 停止事件处理
udevadm control --stop-exec-queue
# 开始事件处理
udevadm control --start-exec-queue
# 设置日志级别
udevadm control --log-level=debug
查看USB设备信息:
# 查看所有USB设备
lsusb | awk '{print $6}' | xargs -I {} udevadm info --attribute-walk --name=/dev/bus/usb/{} 2>/dev/null | grep -E "ATTRS{idVendor}|ATTRS{idProduct}"
创建设备的软链接:
# 通过udev规则创建设备持久化名称
# 在 /etc/udev/rules.d/ 下创建规则文件
echo 'SUBSYSTEM=="block", ATTRS{serial}=="XYZ123", SYMLINK+="my_disk"' > /etc/udev/rules.d/99-my-device.rules
# 重新加载规则
udevadm control --reload-rules
udevadm trigger
调试设备问题:
# 开启udev调试
udevadm control --log-level=debug
# 监控特定设备事件
udevadm monitor --property --subsystem-match=block | grep -E "DEVNAME|ACTION"
# 测试规则
udevadm test $(udevadm info -q path -n /dev/sdb1)
dmesg 显示内核环形缓冲区中的消息,包括所有内核事件。
udevadm monitor 专门显示与设备相关的事件,包括内核发送的uevent和udev处理的事件,更适合设备调试。
使用 udevadm info -a -p [设备路径] 命令:
udevadm info -a -p /sys/class/net/eth0
这会显示设备的所有父级设备的属性,对于编写udev规则非常有用。
需要重新加载udev规则并触发设备事件:
# 重新加载规则
udevadm control --reload-rules
# 触发相关设备事件
udevadm trigger --type=devices --action=change
# 或者等待事件完成
udevadm settle
udevadm test 命令仅用于测试,不会实际执行设备节点创建等操作Ctrl+C 停止