Linuxは、実際のファイルと存在しない(デバイスなど)ファイルをどのように区別しますか?

Linuxは、実際のファイルと存在しない(デバイスなど)ファイルをどのように区別しますか?

これは非常に低いレベルの質問であり、おそらくこれが質問するのに最適な場所ではないことを知っています。しかし、他のどのSEサイトよりも適切に見えたので、ここまでです。

Linuxファイルシステムでは、一部のファイルが実際に存在する、例:/usr/bin/bash存在します。しかし(私が理解している限り)一部は実際には存在せず、より多くが存在します。仮想次のファイル/dev/sda/proc/cpuinfoなど私の質問は次のとおりです(2つですが、別の質問になるにはあまりにも密接に関連しています)。

  • 読み取りコマンド(または同様のコマンド)が実行されると、Linuxカーネルはこれらのファイルが実際であるか(したがってディスクから読み取られるか)どうすればわかりますか?
  • ファイルが実際ではない場合:たとえば、read fromはランダムな/dev/randomデータを返し、read fromは/dev/nullを返しますEOF。この仮想ファイルから読み取るデータを決定する方法(およびデータが仮想ファイルに書き込まれるときに実行するアクション) - 各ファイルまたは仮想ディレクトリに適した個別の読み取り/書き込みへのポインタを持つ一種のマッピングはありますか?自分で注文しますか?したがって、アイテムは/dev/null単にEOF

ベストアンサー1

したがって、ここには基本的に2つのタイプがあります。

  1. データとメタデータを含むディレクトリに慣れている方法でファイルを保存する一般的なファイルシステム(ソフトリンク、ハードリンクなどを含む)は常にそうではありませんが、通常は永続ストレージに使用されるブロックデバイスにバックアップされます(tmpfsはRAMにのみ存在します)しかし、それ以外は通常のファイルシステムと同じです)。読み、書き込み、名前変更などの意味はなじみがあり、すべてが期待どおりに機能します。
  2. さまざまな仮想ファイルシステム。/procまたはなどのFUSEカスタムファイルシステムと同様に、ここには例があります/sys。実際には、ある意味では「ユーザー定義」の意味を持つファイルシステムを参照するので、はるかに多様です。したがって、ファイルの下のファイルからデータを読み取るとき、通常のファイルシステムのように、以前に作成された他の項目によって保存された特定のデータに実際にアクセスすることはありません。本質的にカーネル呼び出しを実行して、即座に生成された情報を要求します。このコードは意味を実装する関数にすぎないので、何をしたいかをすることができます。その結果、実際にはシンボリックリンクではなく、シンボリックリンクであるかのように偽装するなど、ファイルの奇妙な動作を経験することになります。sshfsifuse/procread/proc

重要なことは、/devそれが一般的に最初であるということです。最新のディストリビューションでは/devtmpfsのようなものが一般的ですが、以前のシステムでは特別な属性なしでディスクの一般的なディレクトリであることが一般的です。鍵は、次のファイルが/devFIFOまたはUnixソケットに似た特殊ファイルであるデバイスノードであることです。デバイスノードには、メインデバイス番号とマイナーデバイス番号があります。これを読み書きするのはカーネルドライバを呼び出すことです。 FIFOを読み書きすることは、パイプの出力をバッファリングするためにカーネルを呼び出すのと同じです。ドライバは必要なものは何でもできますが、通常はハードドライブにアクセスしたり、スピーカーでサウンドを再生するなど、あらゆる方法でハードウェアに触れます。

元の質問に答えるには:

  1. 「ファイルが存在しますか」に関する2つの質問があります。これは、デバイスノードファイルが実際に存在するかどうか、およびそれをサポートするカーネルコードが意味があるかどうかです。前者は通常のファイルシステムと同様に解決されます。最新のシステムは、udevハードウェアイベントを監視し、/devそれに応じてデバイスノードを自動的に作成および削除するのと同様のものを使用します。ただし、古いシステムまたは軽量カスタムビルドでは、事前に作成されたすべてのデバイスノードをディスクに直接保存することができます。同時に、これらのファイルを読み取ると、メジャーおよびマイナーデバイス番号によって決定されたカーネルコードが呼び出されます。これが不合理な場合(たとえば、存在しないブロックデバイスを読み取ろうとする場合)、I / Oエラーです。

  2. どのデバイスファイルに対してどのカーネルコードを呼び出すかを把握する方法はさまざまです。などの仮想ファイルシステムでは、/proc独自の機能を実装しますreadwriteカーネルはマウントポイントに基づいてそのコードを呼び出し、ファイルシステムの実装は残りを処理します。デバイスファイルの場合、プライマリおよびマイナーデバイス番号に基づいて予約されます。

おすすめ記事