web-dev-qa-db-ja.com

/ devと/ sys / classの違いは?

/devのデバイス表現と/sys/classのデバイス表現の違いは何ですか?

どちらが優先されますか?一方が提供し、他方が提供しないものはありますか?

34

/devのファイルは、UDEVが実行時に作成する実際のデバイスファイルです。ディレクトリ/sys/classは、実行時にカーネルによってエクスポートされ、sysfsを介してハードウェアの階層を公開します。

From libudev and Sysfs Tutorial

抜粋

UnixおよびUnixライクなシステムでは、ハードウェアデバイスは、/ devディレクトリにある特別なファイル(デバイスファイルまたはノードとも呼ばれます)を介してアクセスされます。これらのファイルは、通常のファイルと同じように読み書きされますが、ディスク上でデータを読み書きする代わりに、ハードウェアと通信するカーネルドライバーと直接通信します。/devファイルについて詳しく説明しているオンラインリソースは多数あります。伝統的に、これらの特別なファイルはインストール時にmknodコマンドを使用してディストリビューションによって作成されました。近年、Linuxシステムは、実行時にこれらの/ devファイルを管理するためにudevを使用し始めました。たとえば、udevはデバイスが検出されたときにノードを作成し、デバイスが削除されたときにそれらを削除します(実行時のホットプラグデバイスを含む)。このように、/ devディレクトリには、(ほとんどの場合)存在する可能性のあるデバイスではなく、現在システムに実際に存在するデバイスのエントリのみが含まれます。

別の抜粋

Sysfsのディレクトリには、デバイスがコンピュータに接続されているため、デバイスの階層が含まれています。たとえば、私のコンピューターでは、hidraw0デバイスは次の場所にあります。

/sys/devices/pci0000:00/0000:00:12.2/usb1/1-5/1-5.4/1-5.4:1.0/0003:04D8:003F.0001/hidraw/hidraw0

パスに基づいて、デバイスは(おおむね最後から開始して)デバイス1-5のポート番号4に接続されたデバイスの構成1(:1.0)に接続され、USBコントローラー1(usb1)に接続され、 PCIバス。興味深いことに、このディレクトリパスは、ハードウェアがコンピューターに物理的に接続されている方法に依存しているため、あまり役に立ちません。

幸いにも、Sysfsは多数のシンボリックリンクも提供し、接続されているPCIポートとUSBポートを知らなくてもデバイスに簡単にアクセスできます。/sys/classには、デバイスの異なるクラスごとにディレクトリがあります。

使用法?

一般に、/etc/udev/rules.dのルールを使用してシステムを拡張します。ルールは、さまざまなハードウェアが存在するときにスクリプトを実行するように構築できます。

システムが起動したら、/devまたは/sysのどちらかに対して動作するスクリプトを記述できます。これは、実際には個人の好みによるものですが、通常は/sysに対して動作して、使用します。 udevadmなどのツールを使用して、さまざまなシステムリソースの場所をUDEVに照会します。

$ udevadm info -a -p  $(udevadm info -q path -n /dev/sda) | head -15

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/pci0000:00/0000:00:1f.2/ata1/Host0/target0:0:0/0:0:0:0/block/sda':
    KERNEL=="sda"
    SUBSYSTEM=="block"
    DRIVER==""
    ATTR{ro}=="0"
    ATTR{size}=="976773168"
    ATTR{stat}==" 6951659  2950164 183733008 41904530 16928577 18806302 597365181 580435555        0 138442293 622621324"
    ATTR{range}=="16"
...
30
slm