使用 Bash 脚本在 /sys 中查找字符设备?

使用 Bash 脚本在 /sys 中查找字符设备?

我有一个这些我正在尝试编写一个 Bash 脚本来查找/sys.

我的方法是这样的:

  • 开始,/sys/modules/usbled因为这是插入设备时加载的内核模块的名称
  • cdto drivers/usb:usbled,它似乎是设备驱动程序的总线和名称(根据usbled.c:229
  • ???

由于目录包含以下内容,我陷入了最后一步:

$ ls
1-1.2:1.0  bind  module  new_id  remove_id  uevent  unbind

现在,我碰巧知道在这种情况下该1-1.2:1.0目录包含控制 LED 所需的字符设备。但是,我的脚本如何知道这一点?目录背后是否有任何特定的命名约定?如果插入多个相同类型的设备怎么办?

答案1

好的,我认为您的问题标题有点无意中误导,因为在文本中您说您已经找到了该设备并询问如何以编程方式执行此操作。我想到的一个问题是如何手动找到它以及为什么不能仅围绕它编写脚本。我会尽可能以目前的形式回答这个问题,如果我没有回答清楚,请提前道歉。

像这样的东西非常多变并且特定于设备。正是出于这样的考虑,即使在更高级别的软件中也需要驱动程序/软件适配器。因此,您可能应该习惯这样的想法:该脚本将执行这一特定的操作,而不是抽象为某些通用过程(我猜您正在尝试执行此操作)。

作为一点背景知识:每个类似总线的系统(USB、SCSI、PCI 等)都需要某种形式的寻址设备。这些lspci是您在默认输出中每行最左侧看到的值。

缩写示例:

[root@hypervisor pyadmin]# lspci
00:00.0 Host bridge: Intel Corporation 5400 Chipset Memory Controller Hub (rev 20)
00:1d.1 USB controller: Intel Corporation 631xESB/632xESB/3100 Chipset UHCI USB Controller #2 (rev 09)
00:1d.2 USB controller: Intel Corporation 631xESB/632xESB/3100 Chipset UHCI USB Controller #3 (rev 09)
04:00.0 PCI bridge: Intel Corporation 6311ESB/6321ESB PCI Express Downstream Port E1 (rev 01)
04:01.0 PCI bridge: Intel Corporation 6311ESB/6321ESB PCI Express Downstream Port E2 (rev 01)
07:05.0 Fibre Channel: QLogic Corp. ISP2422-based 4Gb Fibre Channel to PCI-X HBA (rev 02)
07:06.0 Fibre Channel: QLogic Corp. ISP2422-based 4Gb Fibre Channel to PCI-X HBA (rev 02)
08:00.0 Ethernet controller: Broadcom Corporation NetXtreme BCM5754 Gigabit Ethernet PCI Express (rev 02)

PCI 地址为 08:00.0、07:06.0 等。

正如您所说,您正在查看的 sysfs 目录是针对其中一个模块 ( usbled) 的,因此您正在查看 sysfs 在该模块上的信息,其中包括使用该模块的设备(反之亦然,如果您愿意) 。您1-1.2:1.0正在查看的代表设备并由其 USB 地址(在 USB 术语中为“端点”)引用。

因此,如果您已经知道该模块,我基本上会过滤掉已知值并仅搜索包含的 dentry两个都sysfs冒号和句点,因为如果不是连接的设备,则在该特定目录中使用类似名称创建另一个目录项的可能性很小。

我知道这有点乱,但我很确定你的答案就在那里。

相关内容