登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  linux

Linux udevadm info 怎样读取设备属性

来源:17golang原创

时间:2026-11-12 10:27:22 348浏览 收藏

Linux udevadm info 怎样读取设备属性

排查 Linux 设备时,真正容易混淆的不是命令本身,而是“我要查哪一层”:设备节点名称、符号链接、sysfs 路径,还是 udev 数据库里的属性。udevadm info 的作用就是查询这些设备信息;它可以接受 /dev/ 设备名、/sys/ 路径、设备 ID 或 systemd 设备单元作为入口。

最实用的选择是:先用 --name 或位置参数定位设备,再用 --query=property 读取属性;需要知道父设备链上哪些 sysfs 字段可用于匹配时,再使用 --attribute-walk。不要把属性查询和修改设备节点混为一谈,本文只讨论读取。

官方地址:https://www.freedesktop.org/software/systemd/man/latest/udevadm.html

先分清 udevadm info 的输入和查询类型

udevadm info 查询的是 udev 数据库中的设备信息。输入可以是设备节点、sysfs 路径或设备单元;--query 决定返回哪一类信息:

查询类型适合回答的问题
name这个设备对应的设备节点名称是什么
symlink它有哪些 udev 符号链接
path它在 sysfs 中的路径是什么
property它有哪些环境属性和设备字段
all需要一次查看多类信息
# 用设备节点作为入口,读取 udev 记录中的全部常用信息
udevadm info --query=all --name=/dev/sda

# 用 sysfs 路径作为入口;--path 的值可以省略开头的 /sys/
udevadm info --query=path --path=/class/block/sda

# 直接使用以 /dev/ 或 /sys/ 开头的位置参数也可以定位设备
udevadm info --query=name /dev/sda
udevadm info 从设备入口读取 name symlink path property 的结构说明图
图1:udevadm info 输入入口与查询类型的静态关系说明图,不是运行截图。

这里有一个容易忽略的边界:--name 和 --path 是定位设备的两种入口,不是查询结果类型;--query=name 和 --query=path 才是在选择返回什么。把两组参数分别理解,命令就不容易写反。

用 property 读取设备属性

需要查看设备属性时,使用 --query=property。默认会列出已知属性;当你只关心几个字段时,用 --property 传入逗号分隔的名称,输出会更适合复制到排障记录或后续脚本中。

# 只读取设备名、设备路径和子系统,避免无关字段淹没重点
udevadm info --query=property --name=/dev/sda \
  --property=DEVNAME,DEVPATH,SUBSYSTEM

# 只取指定属性的值;这个选项适合交给脚本继续处理
udevadm info --query=property --name=/dev/sda \
  --property=DEVPATH --value

--value 只在属性查询时输出值,不再带上属性名和等号。官方文档注明该选项自 systemd 250 加入,因此跨发行版脚本如果要兼容更老的环境,应先确认本机的 udevadm 支持情况;不确定时保留默认的 NAME=value 形式更稳妥。

字段选择可以按这三个问题来做:

  • 想确认当前设备是谁:优先看 DEVNAME、DEVPATH 和 SUBSYSTEM。
  • 想知道稳定访问入口:查看 symlink 查询结果,区分设备节点和符号链接。
  • 想把结果交给脚本:使用 --property 缩小字段,只有在确认版本支持时才加 --value。

用 attribute-walk 观察父设备链

有些字段并不直接出现在目标设备上,而是在它的父设备或更上层 sysfs 节点上。此时使用 --attribute-walk,它会沿设备链向上展示可以用于 udev 规则匹配的 sysfs 属性。它回答的是“哪些设备层级拥有可匹配属性”,不是单纯把环境属性再打印一次。

# 从目标设备向父设备链展开可用于匹配的 sysfs 属性
udevadm info --attribute-walk --name=/dev/sda

# 也可以从明确的 sysfs 路径开始,避免设备名存在多个链接时产生歧义
udevadm info --attribute-walk --path=/class/block/sda
udevadm attribute-walk 展示目标设备与父设备 sysfs 属性链的关系图
图2:目标设备沿父设备链读取 sysfs 属性的静态结构说明图,不是运行截图。

阅读这类输出时,先把目标设备和父设备分开记录,再挑出真正描述硬件层级的字段,例如 DEVPATH、SUBSYSTEM 或具体的 sysfs 属性。不要看到父设备上的字段就直接当成目标设备自身属性,层级边界正是 attribute-walk 的价值。

按排障目标选择命令

实际使用时可以把命令选择压缩成一张小表:

目标建议写法结果重点
确认设备节点--query=name设备名或节点路径
确认符号链接--query=symlink稳定访问别名
确认 sysfs 位置--query=path设备在 sysfs 中的路径
筛选环境属性--query=property --property=...目标字段及其值
寻找规则匹配字段--attribute-walk目标设备与父设备链的 sysfs 属性

如果只是想知道“这个 /dev 节点对应什么”,从 --query=all 或 --query=property 开始;如果你正在写规则前寻找匹配条件,先用 --attribute-walk 找到层级,再把真正属于目标设备或父设备的字段分别记下。

常见误区

把 property 和 attribute-walk 当成同一种输出

property 面向 udev 数据库中的设备属性,适合读取当前设备的环境字段;attribute-walk 面向设备及其父设备链中的 sysfs 属性,适合寻找匹配条件。两者都能“看到字段”,但字段来源和使用场景不同。

只会用设备名,不确认输入边界

设备节点适合日常查询,但脚本或文档需要稳定表达时,sysfs 路径往往更能说明设备层级。若同一设备存在多个符号链接,先用 --query=symlink 看清楚各入口,再决定后续使用哪一个。

把读取命令当成修改命令

udevadm info 这里只负责查询。它不会因为你读取了属性就改变设备配置;重新加载规则、触发事件或修改设备节点属于其他命令和另一套操作边界,不应混在这篇查询流程里。

总结

记住一条主线就够了:先用设备节点、sysfs 路径或设备单元定位目标,再用 --query 选择数据类型;需要精确字段就加 --property,需要纯值且环境支持时加 --value;要查父设备链上的匹配属性,则换用 --attribute-walk。这样既能快速回答设备“是谁、在哪里、有哪些属性”,也能避免把目标设备字段和父设备字段混在一起。

相关问题

udevadm info 怎样按字段读取属性?

使用 --query=property --property=字段1,字段2,只保留需要的属性;脚本需要纯值时再根据版本支持情况添加 --value。

udevadm info --path 和直接写 /sys 路径有什么区别?

两者都可以指定 sysfs 设备路径,--path 是显式选项,位置参数则直接传入以 /sys/ 开头的路径。为了让文档更清楚,建议在复杂脚本中使用显式选项。

为什么 property 看不到父设备字段?

因为 property 主要查询当前设备的 udev 属性;需要沿父设备链查看可匹配的 sysfs 属性时,应使用 --attribute-walk。

--value 可以在所有 Linux 发行版上使用吗?

官方文档注明它自 systemd 250 加入。跨发行版脚本应先确认本机工具版本,不能只根据当前机器的行为推断所有环境都支持。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>