1. 序章

LinuxおよびUnixライクなオペレーティングシステムは、ファイルシステム階層標準(FHS)に準拠しています。 FHSは、ファイルシステムの構造を定義します。 つまり、メインディレクトリとその内容を定義します。 システムで最も重要なディレクトリの1つは、 / dev/ディレクトリです。 このチュートリアルでは、 / dev/ディレクトリとその機能について理解を深めます。

2. / dev ディレクトリの機能は何ですか?

/ dev / ディレクトリは、ローカルシステムに接続されているデバイスを表すファイルで構成されています。 ただし、これらはユーザーが読み書きできる通常のファイルではありません。 これらのファイルは、デバイスファイルまたは特殊ファイルと呼ばれます。

[root@localhost dev]# ls -l
total 0
crw-r--r--. 1 root root     10, 235 Sep 29 12:08 autofs
drwxr-xr-x. 3 root root          60 Sep 29 12:07 bus
lrwxrwxrwx. 1 root root           3 Sep 29 12:10 cdrom -> sr0
drwxr-xr-x. 2 root root        3100 Sep 29 12:10 char
crw-------. 1 root root      5,   1 Sep 29 12:08 console
lrwxrwxrwx. 1 root root          11 Sep 29 12:07 core -> /proc/kcore
drwxr-xr-x. 3 root root          60 Sep 29 12:07 cpu
crw-------. 1 root root     10,  62 Sep 29 12:08 cpu_dma_latency
drwxr-xr-x. 7 root root         140 Sep 29 12:08 disk
brw-rw----. 1 root disk    253,   0 Sep 29 12:08 dm-0
...

デバイスファイルは、アプリケーションがI / Oシステムコールを介して対話する標準デバイスの抽象化です。ハードウェアデバイスに対応するデバイスファイルは、2つの主要なカテゴリに分類されます。 主にキャラクター特殊ファイルとブロック特殊ファイル。

3. キャラクター特殊ファイルとブロック特殊ファイルの違いは何ですか?

キャラクター特殊ファイルは、キャラクターデバイスへのシンプルなインターフェイスです。 同様に、ブロック特殊ファイルは、デバイスをブロックするための単純なインターフェイスです。 これらのデバイスの違いは、オペレーティングシステムがデバイスからデータを読み取る方法によって異なります。 ドライバは、バイトなどのデータとして単一の文字を送信することにより、文字デバイスと通信します。 さらに、キャラクターデバイスは、ドライバーと通信するときにバッファリングを必要としません。 一方、ドライバーはキャッシュを介してブロックデバイスからのデータにアクセスします。 さらに、ドライバーは、データのブロック全体を送信することによってブロックデバイスと通信します。 たとえば、キャラクターデバイスはサウンドカードまたはシリアルポートですが、ブロックデバイスはハードディスクまたはUSBです。 ブロックデバイスとキャラクターデバイスは、権限の前に表示される文字で識別されます。 最初の列に表示される文字‘b’は、ブロックデバイスを示します。 一方、最初の列に示されている文字「c」は、文字デバイスを表しています。

[root@localhost dev]# ls -l
total 0
crw-r--r--. 1 root root     10, 235 Sep 16 11:52 autofs
drwxr-xr-x. 2 root root         280 Sep 16 11:52 block
drwxr-xr-x. 2 root root          60 Sep 16 11:52 bsg
drwxr-xr-x. 3 root root          60 Sep 16 11:52 bus
lrwxrwxrwx. 1 root root           3 Sep 16 13:05 cdrom -> sr0
drwxr-xr-x. 2 root root        3100 Sep 16 13:05 char
crw-------. 1 root root      5,   1 Sep 16 11:52 console
lrwxrwxrwx. 1 root root          11 Sep 16 11:52 core -> /proc/kcore
drwxr-xr-x. 3 root root          60 Sep 16 11:52 cpu
crw-------. 1 root root     10,  62 Sep 16 11:52 cpu_dma_latency
drwxr-xr-x. 7 root root         140 Sep 16 11:52 disk
brw-rw----. 1 root disk    253,   0 Sep 16 11:52 dm-0
brw-rw----. 1 root disk    253,   1 Sep 16 11:52 dm-1
brw-rw----. 1 root disk    253,   2 Sep 16 11:52 dm-2

私たちが目にするデバイスの大部分は、キャラクターデバイスまたはブロックデバイスです。 ただし、ソケットデバイスやパイプデバイスなど、他のタイプのデバイスも存在します。

4. 疑似デバイスとは何ですか?

疑似デバイスはハードウェアデバイスに対応していません。 つまり、それらはいくつかの便利な機能を提供します。 たとえば、 / dev / random は、ランダムデータを生成する関数です。 疑似デバイスはキャラクターデバイスでもあります。 デバイスのメジャー番号を使用して、疑似デバイスと他のキャラクターデバイスの違いを知ることができます。 さらに、デバイスドライバーは、メジャー番号と呼ばれる一意の値を介してデバイスに関連付けられます。 ls -l コマンドを実行すると、メジャー番号とマイナー番号が表示されます。 2つの数値はコンマで区切ります。 最初にメジャー番号があり、次にマイナー番号があります。 この場合、メジャー番号が1であるため、疑似デバイスに関連付けられているドライバーはドライバー1です。

[root@localhost dev]# ls -l |grep random
crw-rw-rw-. 1 root root      1,   8 Sep 29 12:08 random

stat を実行して、メジャー番号とマイナー番号を表示することもできます。 これらの番号は、デバイスタイプの下に表示されます。

[root@localhost dev]# stat /dev/random
  File: /dev/random
  Size: 0         	Blocks: 0          IO Block: 4096   character special file
Device: 6h/6d	Inode: 10216       Links: 1     Device type: 1,8
Access: (0666/crw-rw-rw-)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:random_device_t:s0
Access: 2021-09-16 11:52:35.644848848 -0400
Modify: 2021-09-16 11:52:35.644848848 -0400
Change: 2021-09-16 11:52:35.644848848 -0400
 Birth: -

5. なぜこれほど多くのシンボリックリンクがあるのですか?

/ dev / ディレクトリ内の一部のデバイスファイルは、ブロックデバイスまたはキャラクターデバイスとして表示されません。 代わりに、シンボリックリンクが一覧表示されます。

[root@localhost dev]# ls -lhaF| grep ^l 
lrwxrwxrwx.  1 root root           3 Sep 17 09:07 cdrom -> sr0
lrwxrwxrwx.  1 root root          11 Sep 17 09:06 core -> /proc/kcore
lrwxrwxrwx.  1 root root          13 Sep 17 09:06 fd -> /proc/self/fd/
lrwxrwxrwx.  1 root root          12 Sep 17 09:06 initctl -> /run/initctl|
lrwxrwxrwx.  1 root root          28 Sep 17 09:06 log -> /run/systemd/journal/dev-log=
lrwxrwxrwx.  1 root root           4 Sep 17 09:06 rtc -> rtc0
lrwxrwxrwx.  1 root root          15 Sep 17 09:06 stderr -> /proc/self/fd/2
lrwxrwxrwx.  1 root root          15 Sep 17 09:06 stdin -> /proc/self/fd/0
lrwxrwxrwx.  1 root root          15 Sep 17 09:06 stdout -> /proc/self/fd/1|

/ dev ディレクトリの下にあるシンボリックリンクには、さまざまな理由があります。 たとえば、 / dev / stdin を見ると、 / proc / self / fd /0を指していることがわかります。 これは、/ proc/selfディレクトリが/procファイルシステム上にあるためです。 プロセスが/proc / self を読み取ると、プロセスIDを使用してプロセス自体に関する情報を取得します。 したがって、 / proc /selfディレクトリもシンボリックリンクです。

[root@localhost dev]# ls -l /proc/self/fd/0
lrwx------. 1 root root 64 Sep 17 12:02 /proc/self/fd/0 -> /dev/pts/0

サブディレクトリ ../fd ファイル記述子を示しますファイル記述子は、ファイルまたは入出力(IO)リソースへの一意の参照です。 。 これは、プロセスが処理する必要のあるファイルまたは入出力リソースを識別するのに役立ちます。 たとえば、 / dev / pts /0ディレクトリはメモリに存在します。 ディレクトリの下のコンテンツは、アプリケーションが入力を受信して出力を表示できるようにする疑似端末です。

[root@localhost pts]# ls -l /dev/pts
total 0
crw--w----. 1 root tty  136, 0 Sep 17 12:33 0
c---------. 1 root root   5, 2 Sep 17 09:06 ptmx

さらに、 / dev ディレクトリの下にあるシンボリックリンクのもう1つの理由は、名前の変更です。 一部のアプリケーションは、ファイルの古い名前を参照する可能性があるため、シンボリックリンクを使用します。

[root@localhost dev]# ls -l
total 0
lrwxrwxrwx. 1 root root           3 Sep 17 09:07 cdrom -> sr0

6. 結論

この記事では、 /devディレクトリとその下にあるコンテンツについて説明しました。 さまざまな特殊ファイルとそれぞれの機能を理解することができました。 さらに、一部のファイルがシンボリックリンクとして実装されている理由についても説明しました。 要約すると、 /devディレクトリは*nixシステムの重要な部分です。 これは、「すべてがファイルである」という*nixシステムのアーキテクチャを強調しているためです。