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

Ruc*_*t88 22 udev

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

slm*_*slm 14

$ udevadm info -q all -a /dev/sdb
Run Code Online (Sandbox Code Playgroud)

注意:上面查询 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.
Run Code Online (Sandbox Code Playgroud)

例子

这是我的/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':
Run Code Online (Sandbox Code Playgroud)

这两个命令之间的区别

@sepero 的回答是显示仅与叶节点上的 UDEV 设备有关的信息。

塞佩罗的回答

$ udevadm info -q all -n /dev/sda > udevadm_info_1.txt
Run Code Online (Sandbox Code Playgroud)

slm 的回答

我的回答显示了它在整个/sys设备链层次结构中的属性。

$ udevadm info -q all -a /dev/sda > udevadm_info_2.txt
Run Code Online (Sandbox Code Playgroud)

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

$ diff -y udevadm_info_1.txt udevadm_info_2.txt  \
    > udevadm_info_diff.txt
Run Code Online (Sandbox Code Playgroud)

注意:我在 Fedora 19 上运行,使用 204 版udevadm

$ udevadm --version
204
Run Code Online (Sandbox Code Playgroud)


Gil*_*il' 8

udevadm info 提供此类信息。

如果您特别想要子系统:

udevadm info -n /dev/sdb -q property | sed -n 's/SUBSYSTEM=//p'
Run Code Online (Sandbox Code Playgroud)

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

udevadm info -a -n /dev/sdb
Run Code Online (Sandbox Code Playgroud)

这会打印出可用于匹配 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"
Run Code Online (Sandbox Code Playgroud)

那么您可以将此设备与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
Run Code Online (Sandbox Code Playgroud)

这将打印您可以在 udev 规则中使用的表单的设备属性值。KEY=VALUEENV{KEY}=="VALUE"

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

udevadm info -a -p /sys/block/sdb
Run Code Online (Sandbox Code Playgroud)

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

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


Sep*_*ero 5

$ udevadm info -q all -n /dev/sdb
Run Code Online (Sandbox Code Playgroud)