デバイスファイル

デバイスファイル（英: Device file）またはスペシャルファイル（英: Special file）とは、ファイルシステム上であたかも通常のファイルのような形で提示されるデバイスドライバのインタフェースである。これにより、ソフトウェアが入出力システムコールを通してデバイスドライバを使うことができ、作業が単純化される。 デバイスファイルは、プリンターなどの周辺機器への単純なインタフェースを提供する。また、ディスクパーティションなどの機器上の特定のリソースへのアクセスにも使える。さらに、/dev/nullや擬似乱数生成器といった特定の機器とは対応しないリソースへのアクセスにも使われる。 UNIX・Unix系オペレーティングシステム (OS) では、デバイスファイルをデバイスノード（英: device node）とも呼び、キャラクタデバイスとブロックデバイスに分類される。それらは、OSとハードウェアによるデータの入出力方法に違いがある。また、名前付きパイプのように通常のファイルではない（スペシャルな）オブジェクトと区別するため、デバイススペシャルファイルと呼ぶこともある。 定義上、デバイスノードはOSのカーネルが既に確保済みのリソースに対応している。UNIXではそれらリソースを「メジャー番号」と「マイナー番号」で識別し、それら番号がノードの構造体の一部として格納されている。番号の割り当て方は、OSやプラットフォームによって異なる。一般にメジャー番号がデバイスドライバの識別に使われ、マイナー番号がそのドライバが制御する個々の機器の識別に使われる。この場合、システムはドライバに対して引数としてマイナー番号を渡す。 システムはデバイスノードが通常ファイルであるかのように扱い、標準的なシステムコールを使ってアクセスする。 キャラクタデバイス（またはキャラクタスペシャルファイル）は、システムが一文字ずつデータを転送する機器に対応している。キャラクタデバイスは、テレタイプ端末、モデム、仮想コンソール、擬似端末などのようなバイトストリーム型機器を扱い、データのランダムアクセスはサポートしていないのが普通である。 多くの実装では、キャラクタデバイスはバッファを使わない入出力を行う。システムは文字単位に逐次的に読み書きを行う。 ブロックデバイス（またはブロックスペシャルファイル）は、ブロック形式でデータをやり取りする機器に対応している。ブロックデバイスは、ハードディスクドライブ/CD-ROMドライブ/メモリ領域などのアドレス指定可能な機器を扱う。 ブロックデバイスはランダムアクセスとシークが可能なことが多く、一般にバッファを使った入出力を行う。OSが個々の入出力用に1つのブロックを保持するためのバッファを確保する。プログラムがデータの読み書きを要求すると、システムは適当なバッファを用意してそのデータを保持する。バッファが一杯になると適切な操作（データ転送）が行われ、システムがそのバッファをクリアする。 UNIX・Unix系OSでは、実際の周辺機器とは対応しないデバイスノードもある。そのようなデバイスノードを「擬似デバイス（英: pseudo-device）」と呼ぶ。これらはOSが制御する各種機能を提供する。以下に、よくある擬似デバイスを列挙する。 /dev/null あらゆる入力を受け付け、それを捨てる。出力はしない。ビットバケツの一種。 /dev/zero ASCIIのNUL文字（値がゼロ）の列を生成する。 /dev/random 可変長の擬似乱数文字列を生成する（ブロック（英語版）する））。 /dev/urandom 可変長の擬似乱数文字列を生成する（ブロックしない）。 以下に列挙したのは、Linuxディストリビューションでよく使われるデバイスノード名のプレフィックスである。 fd: フロッピーディスク hd: IDE ハードディスクドライブ lp: プリンター par: パラレルポート pt: 擬似端末（仮想端末） s: SCSIデバイス一般。特にハードディスクドライブ。 scd: SCSI 接続の音声用光ディスク装置 sd: SCSI 接続のハードディスク sg: SCSI 接続の汎用装置 sr: SCSI 接続のデータ用光ディスク装置 st: SCSI 接続の磁気テープ tty: （物理）端末 多くの場合、これらプレフィックスの後に特定の機器に対応した固有の番号が付与される。ハードディスクドライブでは、ドライブを特定する番号の後にパーティションを特定する番号が付与される。従って例えば、/dev/sda3はディスク上の領域であり、/dev/pts/14に対応してネットワーク経由の端末セッションがある。 バージョン7以降のFedoraなどのLinuxディストリビューションでは、sdをあらゆるディスクドライブに使っている (libATA)。 MS-DOSはUNIXからスペシャルファイルの概念を導入したが、これをデバイスファイルと呼んだ。ごく初期のMS-DOSはディレクトリ階層をサポートしていなかったため、デバイスファイルを通常のファイルと区別するためにそれらの名称を予約語にしていた。つまり、特定のファイル名がデバイスファイル用に予約されており、同じ名前のファイルやディレクトリを新たに作成できないようになっていた。予約された名称は、CP/MのPIPコマンドでの「スペシャルファイル」と互換になるよう選ばれている。これはWindowsにも引き継がれ、予約デバイス名とも呼ばれる。 主なものを下の表に示すが、ほかにも予約デバイス名は存在する 。 予約語に拡張子を付与しても同様に予約されたデバイスを意味する。つまり、"nul.doc" や "con.htm" はファイル名ではなく、それぞれNULとCONデバイスと解釈される。また、"C:\WINDOWS\CON" などのようにパス名の体を成していても予約デバイス名として扱われる。さらに、MSCDEXとCD-ROMドライバ間で使用するデバイス名も同様に予約デバイス名として扱われる。 CONCON問題は、Windows 9x系の予約名の扱いのバグを突いて、対象のコンピュータをフリーズさせる攻撃を行えるという問題である。例えば、"C:\CON\CON" へのリンクのあるウェブページを用意して、それをクリックさせるなどという風に悪用された。これは、9x系に予約デバイス名が複数回現れるパスを指定してファイルを開こうとするとシステムがフリーズしてしまうバグが存在したためである。 ブロック (データ) バッファ ファイルシステム ^ 比較のため http://www.yiluda.net/manual/linux/rute/node21.html を参照。2007年9月4日閲覧[リンク切れ] ^ “Installation Notes”. Fedora 7 Release Notes. Red Hat, Inc. (2007年5月31日). 2022年3月7日閲覧。 ^ MSDOShandbook 1984, p. 30,57. ^ マイクロソフト (2003年5月12日). “MS-DOS Device Driver Names Cannot be Used as File Names” (英語). Microsoftサポート技術情報. 2008年11月30日閲覧。[リンク切れ] ^ マイクロソフト (2021年9月23日). “FAT、HPFS、NTFSファイルシステムについて”. Microsoft のテクニカル ドキュメント. 2022年3月6日閲覧。 ^ マイクロソフト (2007年7月18日). “パスに複数の MS-DOS デバイス名が含まれていると致命的な例外 0E が発生する”. Microsoftサポート技術情報. 2008年11月30日閲覧。[リンク切れ] 発行者 塚本慶一郎『標準MS-DOSハンドブック』株式会社アスキー、1984年7月10日。ISBN 4-87148-742-3。