/dev
のデバイス表現と/sys/class
のデバイス表現の違いは何ですか?
どちらが優先されますか?一方が提供し、他方が提供しないものはありますか?
/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"
...