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

/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

nullrandomurandomおよびzero文字デバイス

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