web-dev-qa-db-ja.com

Bashスクリプトを使用して/ sysでcharデバイスを検索しますか?

これら のいずれかがあり、/sysでデバイスパスを見つけるためのBashスクリプトを作成しようとしています。

私のアプローチは次のようになります。

  • これはデバイスが接続されたときにロードされるカーネルモジュールの名前であるため、/sys/modules/usbledで開始します
  • cdからdrivers/usb:usbled、これはデバイスのバスとドライバーの名前のようです( sbled.c:229 による)
  • ???

ディレクトリに次のものが含まれているため、最後のステップでスタックします。

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

さて、この場合、1-1.2:1.0ディレクトリにLEDの制御に必要なcharデバイスが含まれていることがわかりました。しかし、私のスクリプトはどのようにしてこれを知っていますか?ディレクトリの背後にある特定の命名規則はありますか?同じタイプのデバイスが複数接続されている場合はどうなりますか?

3
Nathan Osman

OKあなたの質問のタイトルは、テキストですでにデバイスを見つけたと言っており、プログラムでそうする方法を尋ねているので、少し意図せず誤解を招くと思います。頭に浮かぶ質問の1つは、手動でそれを見つけた方法と、それを回避するためだけにスクリプトを作成できない理由です。現在の形でできる限り質問にお答えします。マークを外した場合は事前にお詫び申し上げます。

このようなものは非常に多様で、デバイス固有です。より高いレベルのソフトウェアでもドライバー/ソフトウェアアダプターを必要とするのは、このような考慮事項です。したがって、このスクリプトは、一般的なプロセスに抽象化するのではなく、この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ディレクトリはモジュールの1つ(usbled)のためのものなので、モジュールを使用するデバイスを含む、sysfsがそのモジュールに持っている情報(またはその逆)を見ています逆に、必要に応じて)。 1-1.2:1.0あなたが見ているのはデバイスを表しており、そのUSBアドレス(USB用語では「エンドポイント」)によって参照されています。

したがって、モジュールをすでに知っている場合は、基本的に既知の値を除外し、両方コロンとピリオドを含むdentryのみを検索します。これは、その特定のsysfs接続されたデバイスでない場合、そのような名前でディレクトリが作成されます。

それはあちこちにあることは知っていますが、あなたの答えはどこかにあると確信しています。

2
Bratchley