"/dev" Linuxファイルはどのように生成されますか?

"/dev" Linuxファイルはどのように生成されますか?

Linuxにはいくつかの特別なファイルがありますが、実際にはファイルではありません。

最も顕著で明確な例は、dev「ファイル」フォルダにあります。たとえば、次のようになります。

  • /dev/null- ファイルに書き込んだ内容はすべて無視してください。
  • /dev/random- ファイル内容の代わりにランダムデータ出力
  • /dev/tcp- このファイルに書き込んだすべてのデータをネットワーク経由で送信します。

まず、このタイプの「ファイル」の名前は何であり、実際には一種のスクリプトまたは変装されたバイナリですか?

第二に、どのように作られますか?これらのファイルはカーネルレベルでシステムに組み込まれていますか?それとも直接「魔法ファイル」を生成する方法はありますか(それはどうですか/dev/rickroll)?

答え1

/dev/zero「特殊ファイル」、特に「デバイスノード」の例です。通常、ディストリビューションのインストールプロセスで作成されますが、次のこともできます。完全必要に応じて自分で作成できます。

あなたlsが尋ねるならば/dev/zero

# ls -l /dev/zero
crw-rw-rw- 1 root root 1, 5  Nov 5 09:34 /dev/zero

先頭の「c」は、これが「文字デバイス」であることを示します。他のタイプは「ブロックデバイス」(ls「b」として印刷される)である。概して、ハードディスクなどのランダムアクセスデバイスはブロックデバイスである傾向がありますが、テープドライブやサウンドカードなどのシーケンシャルデバイスは文字デバイスである傾向があります。

「1,5」部分は「主装置番号」と「副装置番号」である。

この情報を使用して、mknodコマンドを使用して独自のデバイスノードを作成できます。

# mknod foobar c 1 5

これにより、現在のフォルダに次のfoobarタスクを実行する新しいファイルが作成されます。正確に/dev/zero(もちろん、必要に応じて他の権限を設定できます。)この「ファイル」には、実際には上記の3つの項目(デバイスタイプ、プライマリデバイス番号、およびセカンダリデバイス番号)が含まれています。これを使用して、ls他のデバイスのコードを見つけて再作成できます。退屈する場合は、rm作成したデバイスノードを削除してください。

デフォルトでは、プライマリデバイス番号はLinuxカーネルにどのデバイスドライバと通信するかを示し、セカンダリデバイス番号はデバイスドライバにどのデバイスを使用しているかを示します。 (たとえば、SATAコントローラがありますが、複数のハードドライブが接続されている可能性があります。)

欲しいなら発明新しいことをするための新しいデバイス...まあ、Linuxカーネルのソースコードを編集し、独自のカスタムカーネルをコンパイルする必要があります。だからこんなことはしないでください! :-) しかし、すでに持っているファイルと重複するデバイスファイルを追加できます。 udev などの自動化システムは、デフォルトでデバイスイベントを監視し、mknod自動的にユーザーを呼び出します。rmこれよりも魔法のようなことはありません。

まだあるその他特殊ファイル形式:

  • Linuxはディレクトリを特別な種類のファイルと見なします。 (通常、ディレクトリを直接開くことはできませんが、可能であれば、そのディレクトリには特別にフォーマットされたデータが含まれており、そのディレクトリ内のすべてのファイルが見つかる場所をカーネルに知らせる一般的なファイルであることがわかります。)

  • シンボリックリンクは特殊ファイルです。 (ただし、ハードリンクはそうではありません。)このln -sコマンドを使用してシンボリックリンクを作成できます。 (マンページを探してください。)

  • 「名前付きパイプ」または「FIFO」(先入れ先出しキュー)というものもあります。を使用して作成できますmkfifo。 FIFOは、次の方法で開くことができる魔法のファイルです。二つ一度プログラミング - 一度読んで、一度書きます。これが起こると、通常のシェルパイプのように動作します。しかし、各プログラムを個別に起動できます。

何らかの方法で「特別」ではないファイルを「一般ファイル」と呼びます。 Unixのドキュメントでは、これについての言及を時々見ることができます。これが意味するところです。デバイスノードやシンボリックリンクなどのファイルではありません。魔法の属性を持たない普通の日常ファイルです。

答え2

ほとんどの/dev項目はブロックデバイス inode または文字デバイス inode です。Wikipediaには多くの詳細があります。この点については繰り返しません。

ただし、/dev/tcpあなたの質問に記載されている既存の答えのどれもこれを説明していません。/dev/tcpそして/dev/udp他のほとんどのアイテムとは異なります/dev。ブロックデバイスと文字デバイスはカーネルによって実装されますが、および/dev/tcp/dev/udpユーザーモードで実装されます。

/dev/tcpbashシェルは、および実装を含むプログラムです/dev/udp(からコピーされますksh93)。 Bashリダイレクト演算子を使用してパスを開こうとすると、通常のopenシステムコールは実行されません。代わりに、bashはTCPソケットを作成し、それを指定されたポートに接続します。

これはユーザーモードで実装され、一部のプログラムでのみ実装されます。次の例は、letbashとtry to opencatの違いを示しています。/dev/tcp/::1/22

$ cat /dev/tcp/::1/22
cat: /dev/tcp/::1/22: No such file or directory
$ cat < /dev/tcp/::1/22
SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.3

違いは、TCP接続にのみリダイレクト演算子を使用し、ファイルを開くことができる他の場所(または組み込みなど)ではksh93使用しないことです。bashsource.

答え3

他の回答に記載されているデバイスノードに加えて(使用マクノルド(2)または一部で提供ファイルシステムの開発)、Linuxには特別に提供されている他の「魔法」ファイルもあります。仮想ファイルシステム、特に/proc/(参照工程(5)、読むプロセスファイルシステム)と/sys/(について読んでください。システムファイルシステム)。

これらの擬似ファイル(look -eg統計(2)- デバイスではなく通常のファイルとして)は、特にカーネルが提供する仮想ビュー/proc/ですcat /proc/$$/mapsオープン(2)-ing /proc/self/status)は通常、ディスクやネットワークの物理I / Oを含まないため、非常に高速です。

追加の擬似ファイルを作成するには、/proc/通常は独自の擬似ファイルを作成する必要があります。カーネルモジュールそしてそれを読み込む(例えばこれ)。

答え4

他のユーザーがすでに詳しく説明したように、特別なファイルをバックアップするにはコードが必要です。しかし、Linuxがユーザー空間でコードを書くためのいくつかの方法を提供しているという事実には誰も言及していないようです。

ㅏ。 ヒューズ(USERspaceのファイルシステム)を使用すると、カーネルをクラッシュさせることなくこのようなものを書くことができ、/proc必要な言語/ランタイムで実行できます。行くNode.js真珠PHPPythonルビーなど。

sudoまた、FUSEファイルシステムは、ユーザーがインストールを実行するのと同じ方法で動作するため、インストールする必要がないという利点もあります。

以下は、人々がFUSEを使用して書いたもののいくつかの例です。

  • mp3fs(FLACファイルをMP3ファイルとして見ることができ、MP3プレーヤーにコピー/クリックしてドラッグすると即座に生成されます)
  • PyTagsFS(メタデータタグで構築された仮想フォルダツリーでメディアを表示)
  • ヒューズジッパー(Zipファイルをフォルダとしてインストール)
  • ヒューズISO(ISOをマウントするためにroot権限は必要ありません)
  • ヒューズ(i機器の設置)
  • ヒューズ DAV(WebDAV共有マウント)
  • ヒューズ-exfat(exFAT形式のファイルシステムマウント)
  • NTFS-3GこれLinux NTFSドライバ)

雨。キーボード、マウス、ジョイスティックなどの仮想入力デバイスを作成する場合(たとえば、使用しているUSBデバイス用のユーザースペースドライバを作成するなど)、次のlibusbものを使用できます。入力

バインディングを見つけるのは難しいですが、それが存在する理由を知っています。行く(キーボードのみ)、Pythonルビー (2)

uinputの使用の実際の例は次のとおりです。

  • G15デーモン(Logitech G15ゲームキーボードのLCDおよびゲームキー用のLinuxドライバ)
  • ds4drv(Sony DualShock 4コントローラ用ドライバ)
  • Xboxドライバ(交換用Xbox 360コントローラドライバとLinuxクラスx360ce次のように正しく設計されていないゲームランナー2:フューチャーリズムエイリアンレジェンド私は実際のXboxコントローラと話していると思うかもしれませんが、実際にはそうではありません。)
  • Wiimoteベテランドライバーが好き西部帝国誰かが最終的にカーネルWiimoteドライバを作成する前にこれを行う必要があるため、デフォルトでサポートが提供されます。

氏。汎用文字デバイスの場合、次のものがあります。クサイ(USERspaceの文字デバイス)。しかし、それほど人気はありません。

個人的に知っている限り、CUSE APIの唯一のユーザーはCUSE APIを生成したのと同じプログラムです。オスフード/dev/dsp/dev/adspおよび(OSS Audio API)をユーザースペースに実装して、/dev/mixerPulseAudioまたはdmixを介してルーティングできます。

私が見つけることができる唯一のCUSEバインディングは次のとおりです。クセフィ2010年以降は更新されませんでした。

ディ。新しい特別なファイルはまったく必要ないかもしれません。

たとえば、次のコマンドを使用してUSBデバイスとの生の通信を開くことができます。libusb(ページのバインディングリスト)次に、他のメカニズム(TCP / UDPソケット、stdin / stdout、またはディスク上の一般的なファイルの読み書きなど)を介して他のプログラムと通信します。

関連情報