web-dev-qa-db-ja.com

Udev-デバイスがどのサブシステムに属しているかを知るにはどうすればよいですか?

たとえば、デバイス/ dev/sdbがあります。それがudevサブシステムであることを確認するにはどうすればよいですか?

19
Rucent88
$ udevadm info -q all -a /dev/sdb

注:上記は、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.

これが私の/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':

これら2つのコマンドの違い

@seperoの答えは、リーフノードのUDEVデバイスに関する情報のみを示しています。

セペロの答え

$ udevadm info -q all -n /dev/sda > udevadm_info_1.txt

slmの答え

私の答えは、デバイスの/sysチェーン階層全体を歩くときの属性を示しています。

$ udevadm info -q all -a /dev/sda > udevadm_info_2.txt

これら2つの違いを確認できます。

$ diff -y udevadm_info_1.txt udevadm_info_2.txt  \
    > udevadm_info_diff.txt

注:udevadmのバージョン204を使用して、Fedora 19で実行しています:

$ udevadm --version
204
12
slm

udevadm info は、この種の情報を提供します。

特にサブシステムが必要な場合:

udevadm info -n /dev/sdb -q property | sed -n 's/SUBSYSTEM=//p'

Udevルールを作成する場合、最も役立つコマンドは

udevadm info -a -n /dev/sdb

これにより、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"

次に、このデバイスを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

これは、KEY=VALUEという形式のデバイスプロパティ値を出力します。これは、udevルールでENV{KEY}=="VALUE"として使用できます。

デバイスに/devエントリがない場合は、代わりに/sysの下のパスを使用して参照できます。

udevadm info -a -p /sys/block/sdb

(この場合は便利な例ではありません。これは、カテゴリが一般的ではなく、/devの下にまだエントリがないデバイスに役立ちます)。

Udevルールを変更すると、それらは自動的に読み込まれます。ただし、これらは、後でシステムに接続されるデバイスにのみ適用されます。既に接続されているデバイスに新しいルールを適用するには、udevadm triggerを使用します(アプリケーションを特定のデバイスに制限するオプションを使用)。

$ udevadm info -q all -n /dev/sdb
4
Sepero