/ devとそのサブディレクトリとファイルを理解する


52
$ ls -l /dev/stdin /dev/fd/0
lrwx------ 1 tim tim 64 2011-08-07 09:53 /dev/fd/0 -> /dev/pts/2
lrwxrwxrwx 1 root root 15 2011-08-06 08:14 /dev/stdin -> /proc/self/fd/0
$ ls -l /dev/pts/2 /proc/self/fd/0
crw--w---- 1 tim tty  136, 2 2011-08-07 09:54 /dev/pts/2
lrwx------ 1 tim tim     64 2011-08-07 09:54 /proc/self/fd/0 -> /dev/pts/2
  1. 下のすべてのファイル/devとそのサブディレクトリがすべてデバイスのファイル記述子であるかどうか疑問に思っていましたか?
  2. なぜ互いに多くのリンクがあるのですか?たとえば、/dev/fd/0/dev/stdin/proc/self/fd/0すべてへのリンクです/dev/pts/2
  3. もしllrwx------何平均リンク、ccrw--w---- 意味ですか?

3
#3に答えるために、cはキャラクターデバイス、またはキャラクタースペシャルを表します。bはブロックspecialを表します。
フェリックスフー14

回答:


78

ほぼすべてのファイル/devデバイスファイルです。通常のファイルの読み取りと書き込みはディスクまたは他のファイルシステムにデータを保存しますが、デバイスファイルへのアクセスはカーネル内のドライバーと通信し、カーネルは一般にハードウェア(ハードウェアデバイス、したがって名前)と通信します。

デバイスファイルには2つのタイプがあります。ブロックデバイス(bの出力の最初の文字としてls -l示されるc)と文字デバイス(で示される)です。ブロックデバイスとキャラクターデバイスの区別は完全に普遍的ではありません。ブロックデバイスはディスクのようなもので、大きな固定サイズのファイルのように動作します。特定のオフセットでバイトを書き込み、後でそのオフセットでデバイスから読み取ると、そのバイトが返されます。キャラクターデバイスは、バイトを書き込むとすぐに効果があり(シリアルラインで出力されるなど)、バイトを読み取るとすぐに効果がある(シリアルポートから読み取るなど)ほぼすべてのものです。

デバイスファイルの意味は、名前ではなく番号によって決まります(名前はアプリケーションにとって重要ですが、カーネルにとっては重要ではありません)。番号は実際には2つの番号です。メジャー番号はこのデバイスを担当するドライバーを示し、マイナー番号はドライバーが複数のデバイスを駆動できることを示します¹。これらの数値はls -lリストに表示され、通常はファイルサイズが表示されます。たとえば、brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sdaこのデバイスはメジャー8、マイナー0です。

一部のデバイスファイル/devは、ハードウェアデバイスに対応していません。すべてのUNIXシステムに存在するものは/dev/null; それへの書き込みは効果がなく、そこからの読み取りは決してデータを返しません。シェルスクリプトでは、コマンドからの出力を無視する(>/dev/null)か、入力なしでコマンドを実行する()場合に便利</dev/nullです。他の一般的な例は、/dev/zero(nullバイトを無限/dev/urandomに返す)(ランダムバイトを無限に返す)です。

いくつかのデバイスファイルには、アクセスするプロセスに依存する意味があります。たとえば/dev/stdin、現在のプロセスの標準入力を指定します。から開くことは、プロセスの標準入力として開かれた元のファイルを開くこととほぼ同じ効果があります。同様に、/dev/ttyプロセスが接続される端末を指定します。Linuxでは、今日、/dev/stdinそして友人はキャラクターデバイスとして実装されていませんが、代わりにすべてのファイル記述子を参照できるより一般的なメカニズムへのシンボリックリンクとして実装されています(従来の方法では0、1、2のみではありません); たとえば/dev/stdin、へのシンボリックリンク/proc/self/fd/0です。/ dev / fdと/ proc / self / fd /の関係をご覧ください

の下に多数のシンボリックリンクがあり/devます。これは、歴史的な理由で発生する可能性があります。デバイスファイルがある名前から別の名前に移動されましたが、一部のアプリケーションはまだ古い名前を使用しています。たとえば、Linuxの下/dev/scd0へのシンボリックリンク/dev/sr0です。両方とも最初のCDデバイスを指定します。シンボリックリンクのもう一つの理由は、組織です:Linuxでは、あなたはいくつかの場所で、あなたのハードディスクやパーティションを見つけることができます:/dev/sda/dev/sda1、友人(任意の文字で指定された各ディスク、パーティション、パーティションレイアウトに従って)、 /dev/disk/by-id/*(ディスクはaで指定されました固有のシリアル番号)、/dev/disk/by-label/*(人間が選択したラベルで指定されたファイルシステムのパーティション); もっと。シンボリックリンクは、一般的なデバイス名がいくつかある場合にも使用されます。例えば/dev/dvdは、へのシンボリックリンク/dev/sr0であるか、/dev/sr12つのCDリーダーがあり、2番目のCDリーダーがデフォルトのDVDリーダーである場合のリンクです。

最後に、/dev伝統的な理由から、の下にいくつかのファイルがあります。すべてのシステムで同じものが見つかるわけではありません。ほとんどの場合、プログラムがログメッセージを出力するために使用/dev/logするソケットです。/dev/MAKEDEVは、にエントリを作成するスクリプトです/dev。最新のLinuxシステムでは、のエントリはudev/dev/によって自動的に作成され、廃止されました。MAKEDEV

¹これは実際にはLinuxでは事実ではありませんが、この詳細はデバイスドライバー作成者にのみ関係します。


ありがとう!「デバイスファイルの意味はその番号によって決まります」とは、そのファイル記述子のことですか?
ティム

@Tim:いいえ、ls -l日付の前にファイルサイズが通常表示されるリストに番号が表示されます。たとえば、brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sdaこのデバイスはメジャー8、マイナー0です。デバイス番号は実際には頻繁に表示されませんデバイスをデバイスにするもの(最も重要なことは、ファイル名ではありません)。ファイル記述子番号は、特定のプロセスでのみ意味を持ちます。
ジル 'SO-悪であるのをやめる'

いいえ、Linux で開く/dev/stdin(=> /proc/self/fd/0)ことは、標準入力を複製することと同じ効果はありません。違いを確認するには、su - non_root_userは、exec 5</dev/stdin「アクセス許可が拒否されました」で失敗しますが、exec 5<&0成功します。そして、それは新しいfdが異なるフラグで開かれることではないだけだ、ファイルオブジェクト(「オープンファイルDESCRIPのについてのすべてション POSIXの用語では」)(ファイルポインタのオフセット、非/ブロックモードなど)を異なるものになります。
mosvy

14
  1. はい-直接またはシンボリックリンクとして-それ/dev/が目的です。
  2. さまざまな目的のため:命名規則間の互換性のために、時には作業環境に必要な場合があります-の例のように/dev/stdin。これは静的/dev/pts/2または他のものを指していませ -別の端末に切り替えると表示されます。現在の端末セッション/dev/stdinの標準入力です。それはまた、シンボリックリンクである必要がある理由の例でもあります。
  3. man mknodおよびを参照してくださいinfo coreutils 'mknod invocation'。一般的に、cキャラクタデバイスタイプを表します。

3
「現在の端末セッションの標準入力」は少しあいまいです。/dev/stdin開くプロセスの標準入力を指します。内のすべて/proc/$pidはプロセス依存データであり/proc/self、プロセス自身のデータを指す魔法のシンボリックリンクです。
ステファンギメネス

11

最初の質問では、これらはファイル記述子ではなく、デバイスファイルです。(別名「開発ノード」)

これらのファイルは、メジャー番号とマイナー番号を使用してデバイスを処理しているドライバーにバインドされています。(たとえば、ls出力の「136、2」は、メジャー番号136にバインドされたデバイスドライバーを指し、そのドライバーによって処理されるデバイス#2を指定します。)

の出力の最初の文字はls -l、デバイスファイルの場合のデバイスのタイプです。'c'の場合、それはキャラクター型デバイス、または 'b'の場合、ブロック型デバイスです。

2番目の質問については、rozcietrzewiaczによる上記の回答を参照してください。


1
[デバイスドライバーの概要]リンクが壊れているようです。
ナマケモノ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.