GNU/Linux >> Linux の 問題 >  >> Linux

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

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

<オール>
  • データとメタデータを含むディレクトリにファイルを保持する通常のファイル システム (ソフト リンク、ハード リンクなどを含む)。これらは、常にではありませんが、多くの場合、永続ストレージ用のブロック デバイスによってバックアップされます (tmpfs は RAM にのみ存在しますが、それ以外は通常のファイル システムと同じです)。これらのセマンティクスはよく知られています。読み取り、書き込み、名前の変更など、すべて期待どおりに機能します。
  • さまざまな種類の仮想ファイルシステム。 /proc/sys sshfs のような FUSE カスタム ファイルシステムと同様に、ここに例があります。 または ifuse .実際には、ある意味で「カスタム」なセマンティクスを持つファイルシステムを参照しているだけなので、これらにははるかに多様性があります。したがって、/proc の下のファイルから読み取ると、 、通常のファイルシステムのように、以前に別の何かによって保存された特定のデータに実際にアクセスしているわけではありません。基本的にカーネル呼び出しを行っており、オンザフライで生成された情報を要求しています。このコードは、read を実装するどこかの関数にすぎないため、好きなことを何でも実行できます。 セマンティクス。したがって、 /proc 未満のファイルの奇妙な動作があります たとえば、実際にはシンボリック リンクではないのにシンボリック リンクのふりをするなどです。
  • キーは /dev です 実際には、通常、最初の種類の 1 つです。最近のディストリビューションでは /dev を持つのが普通です tmpfs のようなものですが、古いシステムでは、特別な属性を持たない、ディスク上の単純なディレクトリにするのが普通でした。キーは、/dev の下のファイルです。 FIFOまたはUnixソケットに似たタイプの特殊ファイルであるデバイスノードです。デバイスノードにはメジャー番号とマイナー番号があり、FIFO の読み取りまたは書き込みがカーネルを呼び出して出力をパイプにバッファリングするのと同じように、それらの読み取りまたは書き込みはカーネルドライバーへの呼び出しを行います。このドライバーは、やりたいことは何でもできますが、通常は何らかの方法でハードウェアに触れます。ハードディスクにアクセスしたり、スピーカーでサウンドを再生したりします。

    元の質問に答えるには:

    <オール>
  • 「ファイルが存在する」かどうかに関連する 2 つの質問があります。これらは、デバイス ノード ファイルが文字通り存在するかどうか、およびそれをサポートするカーネル コードが意味を持つかどうかです。前者は、通常のファイルシステムと同様に解決されます。最新のシステムは udev を使用します または、ハードウェア イベントを監視し、/dev の下のデバイス ノードを自動的に作成および破棄するようなもの によると。しかし、古いシステムや軽量のカスタム ビルドでは、事前に作成されたディスク上に文字通りすべてのデバイス ノードを配置できます。一方、これらのファイルを読み取るときは、メジャー デバイス番号とマイナー デバイス番号によって決定されるカーネル コードを呼び出しています。これらが適切でない場合 (たとえば、存在しないブロック デバイスを読み込もうとしている場合)、何らかの I/O エラーが発生します。

  • どのデバイス ファイルに対してどのカーネル コードを呼び出すかを決定する方法はさまざまです。 /proc のような仮想ファイルシステムの場合 、独自の read を実装しています と write 機能;カーネルは、それがどのマウント ポイントにあるかに応じてそのコードを呼び出すだけで、残りはファイル システムの実装が処理します。デバイス ファイルの場合、メジャー デバイス番号とマイナー デバイス番号に基づいてディスパッチされます。


  • /dev/sda1 のファイル一覧です。 ほぼ最新の Arch Linux サーバーで:

    % ls -li /dev/sda1
    1294 brw-rw---- 1 root disk 8, 1 Nov  9 13:26 /dev/sda1
    

    /dev/ のディレクトリ エントリ sda の場合 i ノード番号は 1294 です。これはディスク上の実際のファイルです。

    通常、ファイル サイズが表示される場所を確認します。代わりに「8, 1」が表示されます。これはメジャーおよびマイナー デバイス番号です。また、ファイル許可の 'b' にも注意してください。

    ファイル /usr/include/ext2fs/ext2_fs.h この (フラグメント) C 構造体が含まれています:

    /*
     * Structure of an inode on the disk
     */
    struct ext2_inode {
        __u16   i_mode;     /* File mode */
    

    この構造体は、ファイルの inode のディスク上の構造を示しています。この構造体には興味深いものがたくさんあります。よく見てください。

    i_mode struct ext2_inode の要素 には 16 ビットがあり、ユーザー/グループ/その他、読み取り/書き込み/実行のアクセス許可に 9 つだけを使用し、setuid、setgid、およびスティッキーに別の 3 つを使用します。 「プレーン ファイル」、「リンク」、「ディレクトリ」、「名前付きパイプ」、「Unix ファミリ ソケット」、「ブロック デバイス」などのタイプを区別するための 4 ビットがあります。

    Linux カーネルは、通常のディレクトリ ルックアップ アルゴリズムに従い、i_mode のパーミッションとフラグに基づいて決定を下すことができます。 エレメント。 'b' (ブロックデバイスファイル) の場合、メジャーデバイス番号とマイナーデバイス番号を見つけることができ、伝統的にメジャーデバイス番号を使用して、ディスクを処理するカーネル関数 (デバイスドライバー) へのポインターを検索します。マイナー デバイス番号は通常、SCSI バス デバイス番号や EIDE デバイス番号などとして使用されます。

    /proc/cpuinfo のようなファイルの処理方法に関するその他の決定事項 ファイルシステムのタイプに基づいて作成されます。次の場合:

    % mount | grep proc 
    proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
    

    /proc であることがわかります 「proc」のファイルシステムタイプを持っています。 /proc のファイルからの読み取り ReiserFS または DOS ファイル システムでファイルを開くと、カーネルがさまざまな関数を使用してファイルを検索し、ファイルのデータを検索するのと同じように、ファイル システムの種類に基づいてカーネルが別の処理を実行します。


    結局のところ、それらはすべて Unix 用のファイルです。これが抽象化の美しさです。

    ファイルがカーネルによって処理される方法は、今では別の話です。

    /proc と最近では /dev と /run (別名 /var/run) は RAM 内の仮想ファイルシステムです。 /proc は、カーネル変数と構造体へのインターフェイス/ウィンドウです。

    The Linux Kernel http://tldp.org/LDP/tlk/tlk.html と Linux Device Drivers, Third Edition https://lwn.net/Kernel/LDD3/ を読むことをお勧めします。

    また、FreeBSD オペレーティング システムの設計と実装も楽しみました http://www.amazon.com/Design-Implementation-FreeBSD-Operating-System/dp/0321968972/ref=sr_1_1

    あなたの質問に関連するページを見てください。

    http://www.tldp.org/LDP/tlk/dd/drivers.html


    Linux
    1. Linuxでコマンドラインからファイルとディレクトリを削除する方法

    2. Linuxでコマンドラインからファイルを分割して結合する方法

    3. SCPとFTPを使用してLinuxのサーバー間でファイルを転送する方法

    1. LinuxとWindows間でSAMBAサーバーを構成してファイルを転送する方法

    2. Linuxで.gzファイルと.tar.gzファイルを抽出する方法

    3. デバイスファイルとデバイスドライバーの違い

    1. Linuxファイルコマンド:その機能と使用方法

    2. Linux でファイルを tar および untar し、tar ファイルの内容を表示する方法

    3. Linux でのファイルの変更とファイルの実行を監査する方法