デバイスファイル

デバイスファイルとは



デバイスファイル(またはスペシャルファイル)とは、ファイルシステム上で、あたかも通常のファイルのように扱われるデバイスドライバのインターフェースです。これにより、ソフトウェア入出力システムコールを通してデバイスドライバを簡単に利用でき、作業が効率化されます。

デバイスファイルは、プリンターなどの周辺機器への簡単なアクセスを提供し、ディスクパーティションなどの特定の機器リソースへのアクセスにも使用されます。さらに、/dev/nullや擬似乱数生成器のように、特定の機器には対応しないリソースへのアクセスも可能です。

UNIXUnix系OSにおけるデバイスファイル



[UNIX]]やUnix系オペレーティングシステム]では、デバイスファイルを「デバイスノード」と呼びます。これらはキャラクタデバイスとブロックデバイスに分類され、OSと[[ハードウェア間のデータ入出力方法に違いがあります。また、名前付きパイプなどの特殊なオブジェクトと区別するために、「デバイススペシャルファイル」と呼ばれることもあります。

実装



デバイスノードは、OSのカーネルが既に確保しているリソースに対応します。UNIXでは、これらのリソースは「メジャー番号」と「マイナー番号」で識別され、ノードの構造体の一部として格納されます。これらの番号の割り当て方はOSやプラットフォームによって異なりますが、一般的にメジャー番号がデバイスドライバを識別し、マイナー番号がそのドライバが制御する個々の機器を識別するために使われます。システムはドライバに対し、マイナー番号を引数として渡します。

システムはデバイスノードを通常ファイルのように扱い、標準的なシステムコールを使ってアクセスします。

キャラクタデバイス



キャラクタデバイス(またはキャラクタスペシャルファイル)は、システムがデータを一文字ずつ転送する機器に対応します。テレタイプ[[端末]]、モデム、仮想コンソール、擬似端末などのバイトストリーム型機器を扱い、データのランダムアクセスは通常サポートされていません。

多くの実装では、キャラクタデバイスはバッファを使用しない入出力を行います。システムは文字単位で逐次的に読み書きを行います。

ブロックデバイス



ブロックデバイス(またはブロックスペシャルファイル)は、ブロック形式でデータをやり取りする機器に対応します。ハードディスクドライブCD-ROMドライブ、メモリ領域などのアドレス指定可能な機器を扱います。

ブロックデバイスはランダムアクセスとシークが可能であることが多く、一般的にバッファを使った入出力を行います。OSは個々の入出力用に1つのブロックを保持するためのバッファを確保します。プログラムがデータの読み書きを要求すると、システムは適切なバッファを用意してデータを保持します。バッファが一杯になると適切な操作(データ転送)が行われ、システムがバッファをクリアします。

擬似デバイス



UNIXUnix系OSでは、実際の周辺機器に対応しないデバイスノードも存在します。これらは「擬似デバイス」と呼ばれ、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`はネットワーク経由の端末セッションを表します。Fedoraなどの一部のLinuxディストリビューションでは、sdがあらゆるディスクドライブに使われるようになっています。

MS-DOS・Windowsにおけるデバイスファイル



MS-DOSは、UNIXからスペシャルファイルの概念を導入し、それをデバイスファイルと呼びました。初期のMS-DOSディレクトリ階層をサポートしていなかったため、デバイスファイルを通常のファイルと区別するために、それらの名称を予約語として扱いました。つまり、特定のファイル名はデバイスファイル用に予約されており、同じ名前のファイルやディレクトリを新たに作成することはできませんでした。

予約された名称は、CP/M|CP_MのPIPコマンドでの「スペシャルファイル」と互換性があるように選ばれました。この仕組みはWindowsにも引き継がれ、予約デバイス名とも呼ばれています。

予約語拡張子を付与した場合でも、同様に予約されたデバイスとして解釈されます。例えば、`nul.doc`や`con.htm`はファイル名ではなく、それぞれNULとCONデバイスとして扱われます。また、`C:\WINDOWS\CON`のようにパス名の一部に含まれていても予約デバイス名として解釈されます。MSCDEXとCD-ROMドライバ間で使用されるデバイス名も、同様に予約デバイス名として扱われます。

CONCON問題



CONCON問題は、Windows 9x系の予約名の扱いにおけるバグを悪用し、対象コンピュータをフリーズさせる攻撃として知られています。例えば、`C:\CON\CON`へのリンクを含むウェブページを用意し、それをクリックさせるといった手法が用いられました。これは、9x系OSにおいて、予約デバイス名が複数回現れるパスを指定してファイルを開こうとすると、システムがフリーズしてしまうというバグを利用したものです。

関連項目



ブロック (データ)
バッファ
* ファイルシステム

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。