Udev-如何找出设备属于哪个子系统?


19

例如,我有设备/ dev / sdb。如何找到它的udev子系统?

Answers:


12
$ udevadm info -q all -a /dev/sdb

注意:上面的代码在UDEV数据库中查询设备信息,info我们正在查询所有信息-q all,并且正在遍历/sys与该设备标签有关的所有属性。

摘抄

   --attribute-walk|-a
       Print all sysfs properties of the specified device that can be used 
       in udev rules to match the specified device. It prints all devices
       along the chain, up to the root of sysfs that can be used in udev 
       rules.

这是我的/dev/sda设备。

$ udevadm info -q all -a /dev/sda | grep parent
walks up the chain of parent devices. It prints for every device
and the attributes from one single parent device.
  looking at parent device '/devices/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0/0:0:0:0':
  looking at parent device '/devices/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0':
  looking at parent device '/devices/pci0000:00/0000:00:1f.2/ata1/host0':
  looking at parent device '/devices/pci0000:00/0000:00:1f.2/ata1':
  looking at parent device '/devices/pci0000:00/0000:00:1f.2':
  looking at parent device '/devices/pci0000:00':

这两个命令之间的区别

@sepero的答案是在叶节点处显示与UDEV设备有关的信息。

Sepero的答案

$ udevadm info -q all -n /dev/sda > udevadm_info_1.txt

slm的答案

我的答案显示了遍历/sys设备整个链层次结构的属性。

$ udevadm info -q all -a /dev/sda > udevadm_info_2.txt

您可以看到两者之间的区别。

$ diff -y udevadm_info_1.txt udevadm_info_2.txt  \
    > udevadm_info_diff.txt

注意:我正在使用以下版本的204在Fedora 19上运行udevadm

$ udevadm --version
204

为什么使用这种复杂的命令而不是udevadm info -a -n /dev/sdb
吉尔(Gilles)'所以

@Gilles-这个转储所有父节点的所有ATTRS。
slm

我的也是如此—输出是相同的。
吉尔斯(Gilles)'所以

吉尔斯-你在Debian上吗?什么版本的udevadm?当我运行上述2条命令时,我得到了这2个文件。单个udevadm输出嵌套udevadm输出。在查看输出时,我认为单个命令只是合并了所有父项的所有输出,而我的版本显示了ATTRS源自哪个父项。
slm

pastebin.com/NHg9pydA是的输出udevadm info -q all,而不是的输出udevadm info -a。我认为这-a是的捷径-q all --attribute-walk。还是您的版本不同?我不记得这种变化,但是后来我已经好几年没有使用Fedora了(但是为什么发行版会对此进行修补?)。
吉尔斯(Gilles)'“ SO-别再作恶了”

5

udevadm info 提供此类信息。

如果您特别想要子系统:

udevadm info -n /dev/sdb -q property | sed -n 's/SUBSYSTEM=//p'

在编写udev规则时,最有用的命令是

udevadm info -a -n /dev/sdb

这会打印出规则,可用于在udev规则中匹配设备。第一个块与设备本身有关,后续的块与设备树中的祖先有关。唯一的警告是您不能混合与不同祖先对应的键。例如,鉴于此摘录

KERNEL=="sdb"
SUBSYSTEM=="block"
…
KERNELS=="5:0:0:0"
SUBSYSTEMS=="scsi"
DRIVERS=="sd"
ATTRS{model}=="Yoyodyne Diskinator"
…
KERNELS=="0000:00:1f.2"
SUBSYSTEMS=="pci"
DRIVERS=="ahci"

那么您可以将此设备与SUBSYSTEM=="block", SUBSYSTEMS=="scsi", ATTRS{model}="Yoyodyne Diskinator"或匹配,SUBSYSTEM=="block", SUBSYSTEMS=="pci", DRIVERS="ahci"但不能与匹配SUBSYSTEM=="block", SUBSYSTEMS=="scsi", ATTRS{model}="Yoyodyne Diskinator", DRIVERS="ahci"

获取用于规则的信息的另一种方法是

udevadm info -q property -n /dev/sdb --export

这会打印格式的设备属性值,您可以在udev规则中使用它。KEY=VALUEENV{KEY}=="VALUE"

如果您的设备没有/dev条目,则可以使用下面的路径来引用它/sys,例如

udevadm info -a -p /sys/block/sdb

(在这种情况下,这不是一个有用的示例-这对于类别不常见且还没有条目的设备很有用/dev)。

当您更改udev规则时,将自动读取它们。但是,它们仅适用于随后插入系统的设备。要将新规则应用于已连接的设备,请使用udevadm trigger(带有选项以将应用程序限制为某些设备)。


4
$ udevadm info -q all -n /dev/sdb

此方法与我的方法的b / w不同之处在于,这仅显示/sysfor中的叶节点/dev/sdb。另一种方法显示叶节点的整个树层次结构以及分支。
slm
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.