Linux udevadm命令

udevadm 是 Linux 系统中用于管理 udev 设备的命令行工具,用于监控设备事件、查询设备信息、触发设备事件等操作。

命令简介

udevadm 是 udev 设备管理器的管理工具,udev 是 Linux 内核的设备管理器,负责在 /dev 目录下动态创建设备节点。

主要功能包括:

  • 监控设备事件
  • 查询设备属性信息
  • 触发设备事件处理
  • 测试设备规则
  • 控制 udev 守护进程

命令语法

udevadm [options] command

常用命令

命令 说明
info 查询设备信息
trigger 触发设备事件
settle 等待设备事件队列完成
control 控制 udev 守护进程
monitor 监控内核和设备事件
test 测试设备事件处理

常用选项

选项 说明
-d, --debug 启用调试输出
-h, --help 显示帮助信息
-q, --quiet 静默模式,不输出信息
-V, --version 显示版本信息
-e, --export 导出属性为键值对
-p, --property=NAME 仅显示指定属性

命令示例

1. 查询设备信息

查询指定设备的详细信息:

# 查询设备信息
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

2. 监控设备事件

实时监控系统设备事件:

# 监控内核和设备事件
udevadm monitor

# 监控内核事件(uevents)
udevadm monitor -k

# 监控udev事件
udevadm monitor -u

# 监控属性变化事件
udevadm monitor -p

# 监控所有事件并显示属性
udevadm monitor --kernel --udev --property

3. 触发设备事件

手动触发设备事件,让udev重新处理设备:

# 触发所有设备事件
udevadm trigger

# 触发指定类型设备
udevadm trigger --type=devices --action=add

# 触发子系统事件
udevadm trigger --subsystem-match=usb

# 触发属性匹配的设备
udevadm trigger --attr-match=idVendor=1234

# 触发并等待完成
udevadm trigger --verbose --settle

4. 等待设备事件完成

等待udev事件队列处理完成:

# 等待事件队列完成
udevadm settle

# 等待指定时间(秒)
udevadm settle --timeout=30

# 等待指定设备文件出现
udevadm settle --exit-if-exists=/dev/sdb1

5. 测试设备规则

测试udev规则对设备的处理:

# 测试设备事件处理
udevadm test /sys/class/net/eth0

# 测试并显示详细调试信息
udevadm test -a -p /sys/block/sda

# 测试特定动作
udevadm test-builtin path_id /sys/class/block/sda

6. 控制udev守护进程

控制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 命令仅用于测试,不会实际执行设备节点创建等操作
  • 修改udev规则时建议先备份原有规则
  • 在嵌入式系统或initramfs环境中,udev可能不可用
  • 某些操作需要root权限
  • 监控事件时可以使用 Ctrl+C 停止

相关命令

  • lsblk - 列出块设备信息
  • lsusb - 列出USB设备
  • lspci - 列出PCI设备