4 デバイス管理

警告:

Oracle Linux 7は現在延長サポート中です。詳細は、Oracle Linux拡張サポートおよびOracleオープン・ソース・サポート・ポリシーを参照してください。

できるだけ早くアプリケーションとデータをOracle Linux 8またはOracle Linux 9に移行してください。

この章では、システムでデバイス・ファイルを使用する方法、およびudevデバイス・マネージャでデバイス・ノード・ファイルを動的に作成または削除する方法について説明します。

デバイス・ファイルについて

/devディレクトリにはデバイス・ファイル(デバイス特殊ファイルデバイス・ノードと呼ばれることがあります)が格納され、このファイルによって周辺機器(ハード・ディスクなど)、周辺機器上のリソース(ディスク・パーティションなど)および疑似デバイス(乱数ジェネレータなど)へのアクセスが可能になります。

/devディレクトリには複数のサブディレクトリ階層が含まれ、各階層には特定タイプのデバイスに関連するデバイス・ファイルが保持されます。たとえば、/dev/disk/id-by-uuidディレクトリには、ディスクの汎用一意識別子(UUID)に従って指定されたハード・ディスクのデバイス・ファイルが格納されます。このようなサブディレクトリ内のデバイス・ファイルは、実際には/dev内のデバイス・ファイルへのシンボリック・リンクとして実装されます。/dev内のファイルを使用しても、/dev/disk/id-by-uuidにリストされたファイルに対応するリンクを使用しても同じデバイスにアクセスできます。

ls -lコマンドを使用して/devの下のファイルをリストすると、一部のデバイス・ファイルは、タイプb (ブロック)またはタイプc (キャラクタ)として表示されます。これらのデバイスには、ファイル・サイズではなく、デバイスに関連する番号のペアが表示されます。これらのメジャー番号とマイナー番号によって、デバイスがシステムに対して識別されます。

ls -l /dev
total 0
crw-rw----. 1 root    root     10,  56 Mar 17 08:17 autofs
drwxr-xr-x. 2 root    root         640 Mar 17 08:17 block
drwxr-xr-x. 2 root    root          80 Mar 17 08:16 bsg
drwxr-xr-x. 3 root    root          60 Mar 17 08:16 bus
lrwxrwxrwx. 1 root    root           3 Mar 17 08:17 cdrom -> sr0
drwxr-xr-x. 2 root    root        2880 Mar 17 08:17 char
crw-------. 1 root    root      5,   1 Mar 17 08:17 console
lrwxrwxrwx. 1 root    root          11 Mar 17 08:17 core -> /proc/kcore
drwxr-xr-x. 4 root    root         100 Mar 17 08:17 cpu
crw-rw----. 1 root    root     10,  61 Mar 17 08:17 cpu_dma_latency
drwxr-xr-x. 6 root    root         120 Mar 17 08:16 disk
brw-rw----. 1 root    disk    253,   0 Mar 17 08:17 dm-0
brw-rw----. 1 root    disk    253,   1 Mar 17 08:17 dm-1
...
crw-rw-rw-. 1 root    root      1,   3 Mar 17 08:17 /dev/null
...
drwxr-xr-x. 2 root     root          0 Mar 17 08:16 pts
...
crw-rw-rw-. 1 root     root     1,   8 Mar 17 08:17 random
...
brw-rw----. 1 root     disk     8,   0 Mar 17 08:17 sda
brw-rw----. 1 root     disk     8,   1 Mar 17 08:17 sda1
brw-rw----. 1 root     disk     8,   2 Mar 17 08:17 sda2
...
lrwxrwxrwx. 1 root     root         15 Mar 17 08:17 stderr -> /proc/self/fd/2
lrwxrwxrwx. 1 root     root         15 Mar 17 08:17 stdin -> /proc/self/fd/0
lrwxrwxrwx. 1 root     root         15 Mar 17 08:17 stdout -> /proc/self/fd/1
...
crw--w----. 1 root     tty      4,   0 Mar 17 08:17 tty0
crw--w----. 1 root     tty      4,   1 Mar 17 08:17 tty1
...
crw-rw-rw-. 1 root     root     1,   9 Mar 17 08:17 urandom
...
crw-rw-rw-. 1 root     root     1,   5 Mar 17 08:17 zero

ブロック・デバイスでは、データへのランダム・アクセス、データ用のメディアの検索がサポートされ、通常は、データの書込みまたは読取り中にデータのバッファリングが可能です。ブロック・デバイスの例として、ハード・ディスク、CD-ROMドライブ、フラッシュ・メモリー、その他のアドレス可能なメモリー・デバイスがあります。カーネルは、ブロック・デバイスに対して、特定のバイト数のブロック単位でデータの書込みまたは読取りを行います。出力例のsdaはハード・ディスクに対応するブロック・デバイス・ファイルで、メジャー番号が8、マイナー番号が0です。sda1sda2はこのディスクのパーティションで、メジャー番号はsdaと同じ(8)ですが、マイナー番号は1と2です。

キャラクタ・デバイスではデバイスに対するデータのストリーミングがサポートされ、通常、データはバッファリングされず、デバイス上のデータへのランダム・アクセスも許可されません。カーネルは、キャラクタ・デバイスに対して、一度に1バイトずつデータの書込みまたは読取りを行います。キャラクタ・デバイスの例として、キーボード、マウス、端末、擬似端末およびテープ・ドライブがあります。tty0tty1は端末デバイスに対応するキャラクタ・デバイス・ファイルで、ユーザーはシリアル端末または端末エミュレータからログインできます。これらのファイルのメジャー番号は4で、マイナー番号は0と1です。

擬似端末のワーカーまたはセカンダリ(スレーブ)デバイスは、実際の端末デバイスをエミュレートしてソフトウェアと相互作用します。たとえば、ユーザーは端末デバイス(/dev/tty1など)にログインし、擬似端末のプライマリ(マスター)デバイス/dev/pts/ptmxを使用して、基礎となる擬似端末デバイスと相互作用します。ワーカーおよびプライマリ擬似端末のキャラクタ・デバイス・ファイルは、/dev/ptsディレクトリにあります。

ls -l /dev/pts
total 0
crw--w----. 1 guest tty  136, 0 Mar 17 10:11 0
crw--w----. 1 guest tty  136, 1 Mar 17 10:53 1
crw--w----. 1 guest tty  136, 2 Mar 17 10:11 2
c---------. 1 root  root   5, 2 Mar 17 08:16 ptmx
stdin (標準入力)など一部のデバイス・エントリは、procファイル・システムのselfサブディレクトリを介してシンボリック・リンクされます。これらが実際に参照する擬似端末デバイス・ファイルは、プロセスのコンテキストによって異なります。
ls -l /proc/self/fd/[012]
total 0
lrwx------. 1 root root 64 Mar 17 10:02 0 -> /dev/pts/1
lrwx------. 1 root root 64 Mar 17 10:02 1 -> /dev/pts/1
lrwx------. 1 root root 64 Mar 17 10:02 2 -> /dev/pts/1

nullrandomurandomおよびzeroなどのキャラクタ・デバイスは、物理ハードウェアではなくソフトウェアに実装された仮想機能にアクセスできる擬似デバイスの例です。

/dev/nullはデータ・シンクです。/dev/nullに書き込むデータは実質的に消去されますが、書込み操作は成功します。/dev/nullから読み込むとEOF (end-of-file)が返されます。

/dev/zeroは無制限のゼロ値バイトのデータ・ソースです。

/dev/randomおよび/dev/urandomは、擬似ランダム・バイトのストリームのデータ・ソースです。高エントロピの出力を維持するために、エントロピ・プールにノイズの十分なビットが含まれない場合は/dev/randomがブロックされます。/dev/urandomはブロックされないため、その出力のエントロピは/dev/randomのエントロピほど一貫して高くありません。ただし、/dev/random/dev/urandomはいずれも、ミリタリーグレードの暗号化のようなセキュアな暗号化という目的に対して十分にランダムであるとはみなされません。

エントロピ・プールのサイズ、および/dev/randomのエントロピ値は、/proc/sys/kernel/random下の仮想ファイルから検出できます。

cat /proc/sys/kernel/random/poolsize
4096
cat /proc/sys/kernel/random/entropy_avail
3467

詳細は、null(4)pts(4)およびrandom(4)の各マニュアル・ページを参照してください。

udevデバイス・マネージャについて

udevデバイス・マネージャでは、ブート時、または2.6バージョン以降のカーネルを含むシステムに対してデバイスの追加または削除を実行した場合に、デバイス・ノード・ファイルが動的に作成または削除されます。デバイス・ノードの作成時に、udevでは、ラベル、シリアル番号、バス・デバイス番号などの属性についてデバイスの/sysディレクトリが読み取られます。

udevでは、永続的なデバイス名を使用でき、検出の順序に関係なく、再起動をまたいでデバイスの一貫したネーミングが保証されます。永続的なデバイス名は、外部ストレージ・デバイスを使用する場合に特に重要です。

udevの構成ファイルは/etc/udev/udev.confです。ファイルには、ロギング優先度を示す変数udev_logが含まれます。変数は、errinfoおよびdebugに設定できます。デフォルト値はerrです。

詳細は、udev(7)マニュアル・ページを参照してください。

udevルールについて

udevでは、デバイスの識別方法およびデバイス名の作成方法を決定するルール・ファイルが使用されます。udevサービス(systemd-udevd)によって、システム起動時にルール・ファイルが読み取られ、ルールがメモリーに格納されます。カーネルが新しいデバイス、または既存のデバイスがオフラインになったのを検出すると、カーネルによってイベント・アクション(uevent)通知がudevに送信され、udevdでは、デバイスを識別するために、/sysのデバイス属性に対してインメモリー・ルールが照合されます。デバイス・イベント処理の一部として、ルールでは、デバイスを構成するために実行する必要がある追加のプログラムを指定できます。ファイル拡張子が.rulesのルール・ファイルは、次のディレクトリに格納されます。

/lib/udev/rules.d

デフォルト・ルール・ファイルが格納されます。これらのファイルは編集しないでください。

/etc/udev/rules.d/*.rules

カスタマイズ・ルール・ファイルが格納されます。これらのファイルは変更できます。

/dev/.udev/rules.d/*.rules

一時ルール・ファイルが格納されます。これらのファイルは編集しないでください。

Udevでは、ルール・ファイルが格納されているディレクトリに関係なく、ルール・ファイルが字句順に処理されます。/etc/udev/rules.d内のルール・ファイルによって、/lib/udev/rules.d内の同じ名前のファイルがオーバーライドされます。

次のルールはファイル/lib/udev/rules.d/50-udev- default.rulesから抽出したもので、udevルールの構文を示しています。

# do not edit this file, it will be overwritten on update

SUBSYSTEM=="block", SYMLINK{unique}+="block/%M:%m"
SUBSYSTEM!="block", SYMLINK{unique}+="char/%M:%m"

KERNEL=="pty[pqrstuvwxyzabcdef][0123456789abcdef]", GROUP="tty", MODE="0660"
KERNEL=="tty[pqrstuvwxyzabcdef][0123456789abcdef]", GROUP="tty", MODE="0660"
...
# mem
KERNEL=="null|zero|full|random|urandom", MODE="0666"
KERNEL=="mem|kmem|port|nvram",  GROUP="kmem", MODE="0640"
...
# block
SUBSYSTEM=="block", GROUP="disk"
...
# network
KERNEL=="tun",                  MODE="0666"
KERNEL=="rfkill",               MODE="0644"

# CPU
KERNEL=="cpu[0-9]*",            MODE="0444"
...
# do not delete static device nodes
ACTION=="remove", NAME=="", TEST=="/lib/udev/devices/%k", \
    OPTIONS+="ignore_remove"
ACTION=="remove", NAME=="?*", TEST=="/lib/udev/devices/$name", \
    OPTIONS+="ignore_remove"

コメント行は#の文字で始まります。他のすべての空白以外の行でルールが定義され、これは、1つ以上のカンマ区切りのキーと値のペアのリストです。ルールでは、値がキーに割り当てられるか、またはその現在値と指定した値とを比較することによってキーに対する一致の検出が試行されます。次のリストに、使用可能な割当および比較演算子を示します。

  • =: キーに値を割り当て、以前の値を上書きします。

  • +=: キーの現在の値リストに値を追加することによって、値を割り当てます。

  • :=: キーに値を割り当てます。この値は以降のいずれのルールによっても変更できません。

  • ==: キーの現在の値が指定した値と等しいかどうか照合します。

  • !=: キーの現在の値が指定した値と等しいかどうか照合します。

次のシェル形式のパターン一致文字を値で使用できます。

  • ?: 1文字に一致します。

  • *: ゼロを含めて、任意の数の文字に一致します。

  • []: カッコ内に指定された任意の1文字または文字範囲の文字に一致します。たとえば、tty[sS][0-9]ttys7またはttyS7に一致します。

次のリストに、ルールでよく使用される一致キーを示します。

  • ACTION

    イベントを発生させたアクションの名前を照合します。たとえば、ACTION="add"またはACTION="remove"です。

  • ENV{key}

    デバイス・プロパティkeyに対する値を照合します。たとえば、ENV{DEVTYPE}=="disk"です。

  • KERNEL

    イベントによって影響を受けるデバイスの名前を照合します。たとえば、ディスク・メディアの場合はKERNEL=="dm-*"です。

  • NAME

    デバイス・ファイルまたはネットワーク・インタフェースの名前を照合します。たとえば、1つ以上の文字で構成される任意の名前の場合はNAME="?*"です。

  • SUBSYSTEM

    イベントによって影響を受けるデバイスのサブシステムを照合します。たとえば、SUBSYSTEM=="tty"です。

  • TEST

    指定したファイルまたはパスが存在するかどうかをテストします。たとえば、TEST=="/lib/udev/devices/$name"であり、$nameは現在照合しているデバイス・ファイルの名前です。

その他の一致キーには、ATTR{filename}ATTRS{filename}DEVPATHDRIVERDRIVERSKERNELSPROGRAMRESULTSUBSYSTEMSおよびSYMLINKがあります。

次のリストに、ルールでよく使用される割当キーを示します。

  • ENV{key}

    デバイス・プロパティkeyに対する値を指定します。たとえば、GROUP="disk"です。

  • GROUP

    デバイス・ファイルのグループを指定します。たとえば、GROUP="disk"です。

  • IMPORT{type}:

    typeに応じて、デバイス・プロパティの変数のセットを指定します。

    • cmdline: ブートkernelコマンドラインから単一のプロパティをインポートします。単純なフラグの場合、udevではプロパティの値が1に設定されます。たとえば、IMPORT{cmdline}="nodmraid"です。

    • db: 指定した値をデバイス・データベースの索引として解釈し、単一のプロパティをインポートしますが、この値は以前のイベントですでに設定されている必要があります。たとえば、IMPORT{db}="DM_UDEV_LOW_PRIORITY_FLAG"です。

    • file: 指定した値をテキスト・ファイルの名前として解釈し、その内容をインポートしますが、この値は環境キー形式である必要があります。たとえば、IMPORT{file}="keyfile"です。

    • parent: 指定した値をキー名のフィルタとして解釈し、親デバイスに対するデータベース・エントリから格納済のキーをインポートします。たとえば、IMPORT{parent}="ID_*"です。

    • program: 指定した値を外部プログラムとして実行し、その結果をインポートしますが、この値は環境キー形式である必要があります。たとえば、IMPORT{program}="usb_id --export %p"です。

  • MODE

    デバイス・ファイルの権限を指定します。たとえば、MODE="0640"です。

  • NAME

    デバイス・ファイルの名前を指定します。たとえば、NAME="em1"です。

  • OPTIONS

    ルールおよびデバイスのオプションを指定します。たとえば、OPTIONS+="ignore_remove"であり、これは、デバイスが削除された場合でもデバイス・ファイルが削除されないことを意味します。

  • OWNER

    デバイス・ファイルの所有者を指定します。たとえば、GROUP="root"です。

  • RUN

    デバイス・ファイルの作成後に実行するコマンドを指定します。たとえば、RUN+="/usr/bin/eject $kernel"であり、$kernelはデバイスのカーネル名です。

  • SYMLINK

    デバイス・ファイルへのシンボリック・リンクの名前を指定します。たとえば、SYMLINK+="disk/by-uuid/$env{ID_FS_UUID_ENC}"であり、$env{}は指定したデバイス・プロパティに置換されます。

その他の割当キーには、ATTR{key}GOTOLABELRUNおよびWAIT_FORがあります。

次のリストに、GROUPMODENAMEOWNERPROGRAMRUNおよびSYMLINKキーとともによく使用される文字列置換を示します。

  • $attr{file}または%s{file}

    /sysの下にあるファイルからデバイス属性の値を指定します。たとえば、ENV{MATCHADDR}="$attr{address}"です。

  • $devpathまたは%p

    /sysの下にあるsysfsファイル・システムのデバイスのデバイス・パス。たとえば、RUN+="keyboard-force-release.sh $devpath common-volume-keys"です。

  • $env{key}または%E{key}

    デバイス・プロパティの値を指定します。たとえば、SYMLINK+="disk/by-id/md-name-$env{MD_NAME}-part%n"です。

  • $kernelまたは%k

    デバイスのカーネル名。

  • $majorまたは%M

    デバイスのメジャー番号を指定します。たとえば、IMPORT{program}="udisks-dm-export %M %m"です。

  • $minorまたは%m

    デバイスのマイナー番号を指定します。たとえば、RUN+="$env{LVM_SBIN_PATH}/lvm pvscan --cache --major $major --minor $minor"です。

  • $name

    現在のデバイスのデバイス・ファイルを指定します。たとえば、TEST=="/lib/udev/devices/$name"です。

udevでは、デバイスに対する他の全ルールの処理終了後である、そのプログラムの実行直前に、RUNに対して指定した文字列が展開されます。その他のキーについては、ルールの処理中に文字列が展開されます。

詳細は、udev(7)マニュアル・ページを参照してください。

udevおよびsysfsの問合せ

udevadmコマンドを使用すると、udevデータベースおよびsysfsを問い合せることができます。

たとえば、デバイス・ファイル/dev/sdaに対応する、/sysに相対的なsysfsデバイス・パスを問い合せるには、次のようにします。

sudo udevadm info --query=path --name=/dev/sda
/devices/pci0000:00/0000:00:0d.0/host0/target0:0:0/0:0:0:0/block/sda

/dev/sdaを示すシンボリック・リンクを問い合せるには:

sudo udevadm info --query=symlink --name=/dev/sda
block/8:0
disk/by-id/ata-VBOX_HARDDISK_VB6ad0115d-356e4c09
disk/by-id/scsi-SATA_VBOX_HARDDISK_VB6ad0115d-356e4c09
disk/by-path/pci-0000:00:0d.0-scsi-0:0:0:0

/dev/sdaのプロパティを問い合せるには:

sudo udevadm info --query=property --name=/dev/sda
UDEV_LOG=3
DEVPATH=/devices/pci0000:00/0000:00:0d.0/host0/target0:0:0/0:0:0:0/block/sda
MAJOR=8
MINOR=0
DEVNAME=/dev/sda
DEVTYPE=disk
SUBSYSTEM=block
ID_ATA=1
ID_TYPE=disk
ID_BUS=ata
ID_MODEL=VBOX_HARDDISK
ID_MODEL_ENC=VBOX\x20HARDDISK\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20...
ID_REVISION=1.0
ID_SERIAL=VBOX_HARDDISK_VB579a85b0-bf6debae
ID_SERIAL_SHORT=VB579a85b0-bf6debae
ID_ATA_WRITE_CACHE=1
ID_ATA_WRITE_CACHE_ENABLED=1
ID_ATA_FEATURE_SET_PM=1
ID_ATA_FEATURE_SET_PM_ENABLED=1
ID_ATA_SATA=1
ID_ATA_SATA_SIGNAL_RATE_GEN2=1
ID_SCSI_COMPAT=SATA_VBOX_HARDDISK_VB579a85b0-bf6debae
ID_PATH=pci-0000:00:0d.0-scsi-0:0:0:0
ID_PART_TABLE_TYPE=dos
LVM_SBIN_PATH=/sbin
UDISKS_PRESENTATION_NOPOLICY=0
UDISKS_PARTITION_TABLE=1
UDISKS_PARTITION_TABLE_SCHEME=mbr
UDISKS_PARTITION_TABLE_COUNT=2
UDISKS_ATA_SMART_IS_AVAILABLE=0
DEVLINKS=/dev/block/8:0 /dev/disk/by-id/ata-VBOX_HARDDISK_VB579a85b0-bf6debae ...

/dev/sdaに関するすべての情報を問い合せるには:

sudo udevadm info --query=all --name=/dev/sda
P: /devices/pci0000:00/0000:00:0d.0/host0/target0:0:0/0:0:0:0/block/sda
N: sda
W: 37
S: block/8:0
S: disk/by-id/ata-VBOX_HARDDISK_VB579a85b0-bf6debae
S: disk/by-id/scsi-SATA_VBOX_HARDDISK_VB579a85b0-bf6debae
S: disk/by-path/pci-0000:00:0d.0-scsi-0:0:0:0
E: UDEV_LOG=3
E: DEVPATH=/devices/pci0000:00/0000:00:0d.0/host0/target0:0:0/0:0:0:0/block/sda
E: MAJOR=8
E: MINOR=0
E: DEVNAME=/dev/sda
E: DEVTYPE=disk
E: SUBSYSTEM=block
E: ID_ATA=1
E: ID_TYPE=disk
E: ID_BUS=ata
E: ID_MODEL=VBOX_HARDDISK
E: ID_MODEL_ENC=VBOX\x20HARDDISK\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20...
E: ID_SERIAL=VBOX_HARDDISK_VB579a85b0-bf6debae
E: ID_SERIAL_SHORT=VB579a85b0-bf6debae
E: ID_ATA_WRITE_CACHE=1
E: ID_ATA_WRITE_CACHE_ENABLED=1
E: ID_ATA_FEATURE_SET_PM=1
E: ID_ATA_FEATURE_SET_PM_ENABLED=1
E: ID_ATA_SATA=1
E: ID_ATA_SATA_SIGNAL_RATE_GEN2=1
E: ID_SCSI_COMPAT=SATA_VBOX_HARDDISK_VB579a85b0-bf6debae
E: ID_PATH=pci-0000:00:0d.0-scsi-0:0:0:0
E: ID_PART_TABLE_TYPE=dos
E: LVM_SBIN_PATH=/sbin
E: UDISKS_PRESENTATION_NOPOLICY=0
E: UDISKS_PARTITION_TABLE=1
E: UDISKS_PARTITION_TABLE_SCHEME=mbr
E: UDISKS_PARTITION_TABLE_COUNT=2
E: UDISKS_ATA_SMART_IS_AVAILABLE=0
E: DEVLINKS=/dev/block/8:0 /dev/disk/by-id/ata-VBOX_HARDDISK_VB579a85b0-bf6debae ...

udevによって/sysで検出された/dev/sdaとその親デバイスのすべてのプロパティを表示するには:

sudo udevadm info --attribute-walk --name=/dev/sda
...
  looking at device '/devices/pci0000:00/0000:00:0d.0/host0/target0:0:0/0:0:0:0/block/sda':
    KERNEL=="sda"
    SUBSYSTEM=="block"
    DRIVER==""
    ATTR{range}=="16"
    ATTR{ext_range}=="256"
    ATTR{removable}=="0"
    ATTR{ro}=="0"
    ATTR{size}=="83886080"
    ATTR{alignment_offset}=="0"
    ATTR{capability}=="52"
    ATTR{stat}=="   20884    15437  1254282   338919     5743     8644   103994   109005 ...
    ATTR{inflight}=="       0        0"

  looking at parent device '/devices/pci0000:00/0000:00:0d.0/host0/target0:0:0/0:0:0:0':
    KERNELS=="0:0:0:0"
    SUBSYSTEMS=="scsi"
    DRIVERS=="sd"
    ATTRS{device_blocked}=="0"
    ATTRS{type}=="0"
    ATTRS{scsi_level}=="6"
    ATTRS{vendor}=="ATA     "
    ATTRS{model}=="VBOX HARDDISK   "
    ATTRS{rev}=="1.0 "
    ATTRS{state}=="running"
    ATTRS{timeout}=="30"
    ATTRS{iocounterbits}=="32"
    ATTRS{iorequest_cnt}=="0x6830"
    ATTRS{iodone_cnt}=="0x6826"
    ATTRS{ioerr_cnt}=="0x3"
    ATTRS{modalias}=="scsi:t-0x00"
    ATTRS{evt_media_change}=="0"
    ATTRS{dh_state}=="detached"
    ATTRS{queue_depth}=="31"
    ATTRS{queue_ramp_up_period}=="120000"
    ATTRS{queue_type}=="simple"

  looking at parent device '/devices/pci0000:00/0000:00:0d.0/host0/target0:0:0':
    KERNELS=="target0:0:0"
    SUBSYSTEMS=="scsi"
    DRIVERS==""

  looking at parent device '/devices/pci0000:00/0000:00:0d.0/host0':
    KERNELS=="host0"
    SUBSYSTEMS=="scsi"
    DRIVERS==""

  looking at parent device '/devices/pci0000:00/0000:00:0d.0':
    KERNELS=="0000:00:0d.0"
    SUBSYSTEMS=="pci"
    DRIVERS=="ahci"
    ATTRS{vendor}=="0x8086"
    ATTRS{device}=="0x2829"
    ATTRS{subsystem_vendor}=="0x0000"
    ATTRS{subsystem_device}=="0x0000"
    ATTRS{class}=="0x010601"
    ATTRS{irq}=="21"
    ATTRS{local_cpus}=="00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000003"
    ATTRS{local_cpulist}=="0-1"
    ATTRS{modalias}=="pci:v00008086d00002829sv00000000sd00000000bc01sc06i01"
    ATTRS{numa_node}=="-1"
    ATTRS{enable}=="1"
    ATTRS{broken_parity_status}=="0"
    ATTRS{msi_bus}==""
    ATTRS{msi_irqs}==""

  looking at parent device '/devices/pci0000:00':
    KERNELS=="pci0000:00"
    SUBSYSTEMS==""
    DRIVERS==""

コマンドはそのデバイス・パスで指定されたデバイスから開始し、親デバイスのチェーンを上にたどります。検出されたすべてのデバイスについて、デバイスとその親デバイスに対する考えられるすべての属性が、udevルールの一致キー形式で表示されます。

詳細は、udevadm(8)マニュアル・ページを参照してください。

udevルールの変更

ルールが評価される順序は重要です。udevでは、ルールが字句順に処理されます。独自のルールを追加する場合は、デフォルト・ルールの前にudevによってこれらのルールが検出され、評価される必要があります。

次の例は、udevルール・ファイルを実装して、シンボリック・リンクをディスク・デバイス(/dev/sdb)に追加する方法を示しています。

  1. udevによって他のルール・ファイルの前に読み取られるルール・ファイルを、/etc/udev/rules.dの下に10-local.rulesなどのファイル名で作成します。

    たとえば、次に示す10-local.rulesのルールでは、/dev/sdbを参照するシンボリック・リンク/dev/my_diskを作成します。

    KERNEL=="sdb", ACTION=="add", SYMLINK="my_disk"

    /devのデバイス・ファイルをリストすると、udevによってルールがまだ適用されていないことが示されます。

    sudo ls /dev/sd* /dev/my_disk
    ls: cannot access /dev/my_disk: No such file or directory
    /dev/sda  /dev/sda1  /dev/sda2  /dev/sdb
  2. udevがそのルールを適用してデバイスを作成する手順をシミュレートするには、次のようにudevadm testコマンドと/sys/class/block階層の下にリストされたsdbのデバイス・パスを使用できます。

    sudo udevadm test /sys/class/block/sdb
    calling: test
    version ...
    This program is for debugging only, it does not run any program
    specified by a RUN key. It may show incorrect results, because
    some values may be different, or not available at a simulation run.
    ...
    LINK 'my_disk' /etc/udev/rules.d/10-local.rules:1
    ...
    creating link '/dev/my_disk' to '/dev/sdb'
    creating symlink '/dev/my_disk' to 'sdb
    ...
    ACTION=add
    DEVLINKS=/dev/disk/by-id/ata-VBOX_HARDDISK_VB186e4ce2-f80f170d 
      /dev/disk/by-uuid/a7dc508d-5bcc-4112-b96e-f40b19e369fe 
      /dev/my_disk
    ...
  3. systemd-udevdサービスを再起動します。

    sudo systemctl restart systemd-udevd

    udevでルール・ファイルが処理された後、シンボリック・リンク/dev/my_diskが追加されます。

    sudo ls -F /dev/sd* /dev/my_disk
    /dev/my_disk@  /dev/sda  /dev/sda1  /dev/sda2  /dev/sdb

変更を取り消すには、/etc/udev/rules.d/10-local.rulesおよび/dev/my_diskを削除し、systemctl restart systemd-udevdを再度実行します。