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/tcp
bashシェルは、および実装を含むプログラムです/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
使用しないことです。bash
source
.
答え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、真珠、PHP、Python、 ルビー、錆、など。。
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/mixer
PulseAudioまたはdmixを介してルーティングできます。
私が見つけることができる唯一のCUSEバインディングは次のとおりです。クセフィ2010年以降は更新されませんでした。
ディ。新しい特別なファイルはまったく必要ないかもしれません。
たとえば、次のコマンドを使用してUSBデバイスとの生の通信を開くことができます。libusb(ページのバインディングリスト)次に、他のメカニズム(TCP / UDPソケット、stdin / stdout、またはディスク上の一般的なファイルの読み書きなど)を介して他のプログラムと通信します。