udevデバイスマネージャーによるシステムデバイスの管理

udevデバイス・マネージャがハードウェアを検出し、デバイス・ノードを管理し、Oracle Linuxでsystemdと統合する方法の概要。

udevデバイス・マネージャはsystemdサービスとして動作し、カーネルによって公開されるシステム・デバイスへの予測可能な管理されたアクセスをソフトウェアに提供します。通常、udevはデバイス・ノードの権限を管理し、/dev/ディレクトリにシンボリック・リンクを作成して、デバイス名をより予測可能で簡単に識別できるようにしたり、ネットワーク・インタフェースの名前を変更したりします。

udevデバイス・マネージャは、起動時にデバイス・ノード・ファイルを動的に作成または削除します。デバイス・ノードの作成時に、udevは、ラベルのみ、シリアル番号、バス・デバイス番号などの属性についてデバイスの/sysディレクトリを読み取ります。

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

また、udevはカーネルによってトリガーされるデバイス・ドライバ・イベントも処理し、その構成で定義されたルールを使用して特定のアクションをトリガーします。たとえば、USBストレージデバイスがシステムに接続されている場合、カーネルはudevに通知し、udevはデバイスをマウントできるように適切なハンドラに通知します。また、ネットワークケーブルがネットワークインタフェースカードに接続されている場合、カーネルはudevに状態の変更を通知し、udevはNetworkManagerに通知して、ネットワークに接続するための適切なアクションを実行できるようにします。

udevの構成ファイルは/etc/udev/udev.confで、udev_logロギング優先度を定義できます。これは、errinfoおよびdebugに設定できます。デフォルト値はerrです。udevで使用されるルールの構成は、/etc/udev/rules.d/の個々のルール・ファイルで処理されます。

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

udevはsystemdのコンポーネントです。追加のバックグラウンドについては、リリース固有のsystemdガイドを参照してください。

Oracle Linuxリリース間でudevで使用されるsystemdの概念の詳細は、systemdによるシステムの管理を参照してください。

カーネル仮想ファイルシステムおよびデバイスドライバモジュールの詳細は、次のリリース固有のリソースを使用してください。

Oracle Linuxリリース全体のカーネル仮想ファイルシステムおよびデバイスドライバモジュールの詳細は、Managing Kernels and System Boot on Oracle Linuxを参照してください。

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

Oracle Linuxがハードウェアをデバイス・ファイル(ブロック・デバイス、文字デバイス、擬似デバイスなど)として表す方法について説明します。

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

/devディレクトリには複数のサブディレクトリ階層が含まれ、各階層には特定タイプのデバイスに関連するデバイス・ファイルが保持されます。ただし、これらのサブディレクトリの内容は、/dev内の対応するファイルへのシンボリック・リンクとして実装されます。このため、/dev内のリンク・ファイル、またはサブディレクトリ内の対応するファイルからファイルにアクセスできます。

ls -l /devコマンドを使用すると、ファイルのリストが表示される、その一部にタイプb (blockの場合)またはタイプc (characterの場合)のいずれかとしてフラグが付けられたファイル。これらのデバイスには、デバイスを識別する番号のペアが関連付けられています。

ls -l /dev
total 0
crw-r--r--. 1 root root     10, 235 Aug 20 08:36 autofs
drwxr-xr-x. 2 root root         240 Sep 20 07:37 block
drwxr-xr-x. 2 root root         100 Aug 20 08:36 bsg
drwxr-xr-x. 3 root root          60 Nov  4  2019 bus
lrwxrwxrwx. 1 root root           3 Aug 20 08:36 cdrom -> sr0
drwxr-xr-x. 2 root root        2720 Sep 20 07:37 char
crw-------. 1 root root      5,   1 Aug 20 08:36 console
lrwxrwxrwx. 1 root root          11 Aug 20 08:36 core -> /proc/kcore
drwxr-xr-x. 3 root root          60 Nov  4  2019 cpu
crw-------. 1 root root     10,  62 Aug 20 08:36 cpu_dma_latency
drwxr-xr-x. 7 root root         140 Aug 20 08:36 disk
brw-rw----. 1 root disk    253,   0 Aug 20 08:36 dm-0
brw-rw----. 1 root disk    253,   1 Aug 20 08:36 dm-1
brw-rw----. 1 root disk    253,   2 Aug 20 08:36 dm-2
lrwxrwxrwx. 1 root root          13 Aug 20 08:36 fd -> /proc/self/fd
crw-rw-rw-. 1 root root      1,   7 Aug 20 08:36 full
crw-rw-rw-. 1 root root     10, 229 Aug 20 08:36 fuse
crw-------. 1 root root     10, 228 Aug 20 08:36 hpet
drwxr-xr-x. 2 root root           0 Aug 20 08:36 hugepages
crw-------. 1 root root     10, 183 Aug 20 08:36 hwrng
lrwxrwxrwx. 1 root root          12 Aug 20 08:36 initctl -> /run/initctl
drwxr-xr-x. 3 root root         220 Aug 20 08:36 input
crw-r--r--. 1 root root      1,  11 Aug 20 08:36 kmsg
lrwxrwxrwx. 1 root root          28 Aug 20 08:36 log -> /run/systemd/journal/dev-log
brw-rw----. 1 root disk      7,   0 Sep 23 01:28 loop0
crw-rw----. 1 root disk     10, 237 Sep 20 07:37 loop-control
drwxr-xr-x. 2 root root         120 Aug 20 08:36 mapper
crw-------. 1 root root     10, 227 Aug 20 08:36 mcelog
crw-r-----. 1 root kmem      1,   1 Aug 20 08:36 mem
crw-------. 1 root root     10,  59 Aug 20 08:36 memory_bandwidth
drwxrwxrwt. 2 root root          40 Nov  4  2019 mqueue
drwxr-xr-x. 2 root root          60 Aug 20 08:36 net
crw-------. 1 root root     10,  61 Aug 20 08:36 network_latency
crw-------. 1 root root     10,  60 Aug 20 08:36 network_throughput
crw-rw-rw-. 1 root root      1,   3 Aug 20 08:36 null
crw-------. 1 root root     10, 144 Aug 20 08:36 nvram
drwxr-xr-x. 2 root root         100 Aug 20 08:36 ol_ca-virtdoc-oltest1
crw-r-----. 1 root kmem      1,   4 Aug 20 08:36 port
crw-------. 1 root root    108,   0 Aug 20 08:36 ppp
crw-rw-rw-. 1 root tty       5,   2 Oct  7 08:10 ptmx
drwxr-xr-x. 2 root root           0 Aug 20 08:36 pts
crw-rw-rw-. 1 root root      1,   8 Aug 20 08:36 random
drwxr-xr-x. 2 root root          60 Nov  4  2019 raw
lrwxrwxrwx. 1 root root           4 Aug 20 08:36 rtc -> rtc0
crw-------. 1 root root    251,   0 Aug 20 08:36 rtc0
brw-rw----. 1 root disk      8,   0 Aug 20 08:36 sda
brw-rw----. 1 root disk      8,   1 Aug 20 08:36 sda1
brw-rw----. 1 root disk      8,   2 Aug 20 08:36 sda2
brw-rw----. 1 root disk      8,  16 Aug 20 08:36 sdb
brw-rw----. 1 root disk      8,  17 Aug 20 08:36 sdb1
crw-rw----. 1 root cdrom    21,   0 Aug 20 08:36 sg0 

ブロック・デバイス

ブロック・デバイスにより、データへのランダム・アクセス、データ用のメディアの検索が有効になり、通常はデータの書込みまたは読取り中にデータがバッファリングされます。ブロック・デバイスの例として、ハード・ディスク、CD-ROMドライブ、フラッシュ・メモリー、その他のアドレス可能なメモリー・デバイスがあります。

キャラクタデバイス

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

疑似端末デバイス

疑似端末セカンダリデバイスは、実際の端末デバイスをエミュレートして、ソフトウェアと対話できるようにします。たとえば、ユーザーは端末デバイス(/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]
lrwx------. 1 root root 64 Oct  7 08:23 /proc/self/fd/0 -> /dev/pts/0
lrwx------. 1 root root 64 Oct  7 08:23 /proc/self/fd/1 -> /dev/pts/0
lrwx------. 1 root root 64 Oct  7 08:23 /proc/self/fd/2 -> /dev/pts/0

null、random、および0文字のデバイス

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

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

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

/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)のマニュアル・ページに関する項を参照してください。