コンテンツにスキップ

「デバイスファイル」の版間の差分

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
擬似デバイス: ブロックに対し、英語版サイトへの仮リンクを設定。
 
(16人の利用者による、間の29版が非表示)
1行目: 1行目:
{{出典の明記|date=2022年3月}}
'''スペシャルファイル'''({{lang-en-short|Special file}})または'''デバイスファイル'''({{lang-en-short|Device file}})は、[[ファイルシステム]]上であたかも通常の[[ファイル (コンピュータ)|ファイル]]のような形で提示される[[デバイスドライバ]]の[[インタフェース (情報技術)|インタフェース]]である。これにより、ソフトウェアが[[入出力]][[システムコール]]を通してデバイスドライバを使うことができ、作業が単純化される。
'''デバイスファイル'''({{lang-en-short|Device file}})または'''スペシャルファイル'''({{lang-en-short|Special file}})は、[[ファイルシステム]]上であたかも通常の[[ファイル (コンピュータ)|ファイル]]のような形で提示される[[デバイスドライバ]]の[[インタフェース (情報技術)|インタフェース]]である。これにより、[[ソフトウェア]]が[[入出力]][[システムコール]]を通してデバイスドライバを使うことができ、作業が単純化される。


ペシャルファイルは、プリンタなどの周辺機器への単純なインタフェースを提供する。また、[[パーティション|ディスクパーティション]]などの機器上の特定の[[計算資源|リソース]]へのアクセスにも使える。さらに、[[/dev/null]] や[[擬似乱数生成器]]といった特定の機器とは対応しないリソースへのアクセスにも使われる。
デバイスファイルは、[[プリンター]]などの[[周辺機器]]への単純なインタフェースを提供する。また、[[パーティション|ディスクパーティション]]などの機器上の特定の[[計算資源|リソース]]へのアクセスにも使える。さらに、[[/dev/null]]や[[擬似乱数生成器]]といった特定の機器とは対応しないリソースへのアクセスにも使われる。


== UNIX ==
== UNIX・Unix系 ==
[[UNIX]]系[[オペレーティングシステム]](OS)では、スペシャルファイルを'''デバイスノード'''(device node)とも呼び、'''キャラクタデバイス'''と'''ブロックデバイス'''に分類される。それらは、OSとハードウェアによるデータの[[入出力]]方法に違いがある。また、[[名前付きパイプ]]のように通常のファイルではない(スペシャルな)オブジェクトと区別するため、'''デバイススペシャルファイル'''と呼ぶこともある。
[[UNIX]]・[[Unix]][[オペレーティングシステム]] (OS) では、デバイスファイルを'''デバイスノード'''({{lang-en-short|device node}})とも呼び、'''キャラクタデバイス'''と'''ブロックデバイス'''に分類される。それらは、OSと[[ハードウェア]]によるデータの[[入出力]]方法に違いがある。また、[[名前付きパイプ]]のように通常のファイルではない(スペシャルな)[[オブジェクト (プログラミング)|オブジェクト]]と区別するため、'''デバイススペシャルファイル'''と呼ぶこともある。


=== 実装 ===
=== 実装 ===
定義上、デバイスノードはOS[[カーネル]]が既に確保済みのリソースに対応している。UNIXではそれらリソースを「メジャー番号」と「マイナー番号」で識別し、それら番号がノードの構造体の一部として格納されている。番号の割り当て方は、OSや[[プラットフォーム (コンピューティング)|プラットフォーム]]によって異なる。一般にメジャー番号が[[デバイスドライバ]]の識別に使われ、マイナー番号がそのドライバが制御する個々の機器の識別に使われる。この場合、システムはドライバに対して引数としてマイナー番号を渡す。
定義上、デバイスノードはOS[[カーネル]]が既に確保済みのリソースに対応している。UNIXではそれらリソースを「メジャー番号」と「マイナー番号」で識別し、それら番号がノードの構造体の一部として格納されている。番号の割り当て方は、OSや[[プラットフォーム (コンピューティング)|プラットフォーム]]によって異なる。一般にメジャー番号がデバイスドライバの識別に使われ、マイナー番号がそのドライバが制御する個々の機器の識別に使われる。この場合、システムはドライバに対して引数としてマイナー番号を渡す。


システムはデバイスノードが通常[[ファイル (コンピュータ)|ファイル]]であるかのように扱い、標準的な[[システムコール]]を使ってアクセスする。
システムはデバイスノードが通常ファイルであるかのように扱い、標準的なシステムコールを使ってアクセスする。


=== キャラクタデバイス ===
=== キャラクタデバイス ===
キャラクタデバイス(またはキャラクタスペシャルファイル)は、システムが一文字ずつデータを転送する機器に対応している。キャラクタデバイスは、[[テレタイプ端末]]、[[モデム]]、[[仮想コンソール]][[擬似端末]]などのような[[バイトストリーム]]型機器を扱い、データの[[ランダムアクセス]]はサポートしていないのが普通である。
[[画像:Nuvola-fs-chardev.svg|64px|right]]
キャラクタデバイス(またはキャラクタスペシャルファイル)は、システムが一文字ずつデータを転送する機器に対応している。キャラクタデバイスは、[[テレタイプ端末]]/[[仮想端末]]/[[モデム]]などのような[[バイトストリーム]]型機器を扱い、データの[[ランダムアクセス]]はサポートしていないのが普通である。


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


=== ブロックデバイス ===
=== ブロックデバイス ===
[[画像:Nuvola-fs-blockdev.svg|64px|right]]
ブロックデバイス(またはブロックスペシャルファイル)は、[[ブロック (データ)|ブロック]]形式でデータをやり取りする機器に対応している。ブロックデバイスは、[[ハードディスクドライブ]]/[[CD-ROM]]ドライブ/[[記憶装置|メモリ領域]]などのアドレス指定可能な機器を扱う。
ブロックデバイス(またはブロックスペシャルファイル)は、[[ブロック (データ)|ブロック]]形式でデータをやり取りする機器に対応している。ブロックデバイスは、[[ハードディスクドライブ]]/[[CD-ROM]]ドライブ/[[記憶装置|メモリ領域]]などのアドレス指定可能な機器を扱う。


24行目: 23行目:


=== 擬似デバイス ===
=== 擬似デバイス ===
UNIX系システムでは、実際の周辺機器とは対応しないデバイスノードもある。そのようなデバイスノードを「擬似デバイス; pseudo-device」と呼ぶ。これらはOSが制御する各種機能を提供する。以下に、よくある擬似デバイスを列挙する。
UNIX・UnixOSでは、実際の周辺機器とは対応しないデバイスノードもある。そのようなデバイスノードを「擬似デバイス({{lang-en-short|pseudo-device}})」と呼ぶ。これらはOSが制御する各種機能を提供する。以下に、よくある擬似デバイスを列挙する。


;<code>[[/dev/null]]</code>:あらゆる入力を受け付け、それを捨てる。出力はしない。[[ビットバケツ]]の一種。
;<code>[[/dev/null]]</code>:あらゆる入力を受け付け、それを捨てる。出力はしない。[[ビットバケツ]]の一種。
;<code>[[/dev/zero]]</code>:[[ASCII]]のNUL文字(値がゼロ)の列を生成する。
;<code>[[/dev/zero]]</code>:[[ASCII]]のNUL文字(値がゼロ)の列を生成する。
;<code>[[/dev/random]]</code>:可変長の擬似乱数文字列を生成する(ブロックする
;<code>[[/dev/random]]</code>:可変長の擬似乱数文字列を生成する({{仮リンク|ブロッキング(コンピューティング)|en|Blocking (computing)|label=ブロック}}する))
;<code>[[/dev/urandom]]</code>:可変長の擬似乱数文字列を生成する(ブロックしない)。
;<code>[[/dev/urandom]]</code>:可変長の擬似乱数文字列を生成する(ブロックしない)。


=== 慣習的な命名 ===
=== 慣習的な命名 ===
以下に列挙したのは、[[Linux]]系システムでよく使われるデバイスノード名のプレフィックスである<ref>比較のため http://www.yiluda.net/manual/linux/rute/node21.html を参照。2007年9月4日閲覧</ref>
以下に列挙したのは、[[Linuxディストリビューション]]でよく使われるデバイスノード名のプレフィックスである<ref>比較のため http://www.yiluda.net/manual/linux/rute/node21.html を参照。2007年9月4日閲覧{{リンク切れ|date=2022年3月}}</ref>


* fd: [[フロッピーディスク]]
* fd: [[フロッピーディスク]]
39行目: 38行目:
* par: [[パラレルポート]]
* par: [[パラレルポート]]
* pt: [[擬似端末]](仮想端末)
* pt: [[擬似端末]](仮想端末)
* s: [[Small Computer System Interface|SCSI]]デバイス一般。特にハードディスク
* s: [[Small Computer System Interface|SCSI]]デバイス一般。特に[[ハードディスクドライブ]]。
* scd: SCSI 接続の音声用光ディスク装置
* scd: SCSI 接続の音声用光ディスク装置
* sd: SCSI 接続のハードディスク
* sd: SCSI 接続のハードディスク
47行目: 46行目:
* tty: (物理)[[端末]]
* tty: (物理)[[端末]]


多くの場合、これらプレフィックスの後に特定の機器に対応した固有の番号が付与される。ハードディスクドライブでは、ドライブを特定する番号の後に[[パーティション]]を特定する番号が付与される。従って例えば、<code>/dev/sda3</code> はディスク上の領域であり、<code>/dev/pts/14</code> に対応してネットワーク経由の端末セッションがある。
多くの場合、これらプレフィックスの後に特定の機器に対応した固有の番号が付与される。[[ハードディスクドライブ]]では、ドライブを特定する番号の後に[[パーティション]]を特定する番号が付与される。従って例えば、<code>/dev/sda3</code>はディスク上の領域であり、<code>/dev/pts/14</code>に対応してネットワーク経由の端末セッションがある。


バージョン 7 以降の [[Fedora Core|Fedora]] などの Linux ディストリビューションでは、<code>sd</code> をあらゆるディスクドライブに使っている([[:en:LibATA|LibATA]])<ref>{{cite web |url=http://docs.fedoraproject.org/release-notes/f7/en_US/sn-Installer.html |title=Installation Notes |accessdate=2007年9月22日 |date=[[2007年]][[5月31日]] |publisher=Red Hat, Inc. |work=Fedora 7 Release Notes}}</ref>。
バージョン7以降の[[Fedora]]などのLinuxディストリビューションでは、<code>sd</code>をあらゆるディスクドライブに使っている ([[:en:libATA|libATA]])<ref>{{cite web |url=https://docs.fedoraproject.org/en-US/Fedora/7/html/Release_Notes/sn-Installer.html |title=Installation Notes |accessdate=2022-03-07 |date=2007年5月31日 |publisher=Red Hat, Inc. |work=Fedora 7 Release Notes}}</ref>。


== MS-DOS ==
== MS-DOS・Windows ==
[[MS-DOS]] UNIX からスペシャルファイルの概念を導入したが、これを'''デバイスファイル'''と呼んだ。ごく初期のMS-DOSは[[ディレクトリ]]階層をサポートしていなかったため、デバイスファイルを通常のファイルと区別するためにそれらの名称を[[予約語]]にしていた。つまり、特定のファイル名がデバイスファイル用に予約されており、同じ名前のファイルやディレクトリを新たに作成できないようになっていた。予約された名称は、[[CP/M]] [[Peripheral Interchange Program|PIP]] コマンドでの「スペシャルファイル」と互換になるよう選ばれている。
[[MS-DOS]]はUNIXからスペシャルファイルの概念を導入したが、これを'''デバイスファイル'''と呼んだ{{Sfn| MSDOShandbook|1984|p=30,57}}。ごく初期のMS-DOSは[[ディレクトリ]]階層をサポートしていなかったため、デバイスファイルを通常のファイルと区別するためにそれらの名称を[[予約語]]にしていた。つまり、特定の[[ファイル名]]がデバイスファイル用に予約されており、同じ名前のファイルやディレクトリを新たに作成できないようになっていた。予約された名称は、[[CP/M]]の[[Peripheral Interchange Program|PIP]]コマンドでの「スペシャルファイル」と互換になるよう選ばれている。これは[[Microsoft Windows|Windows]]にも引き継がれ、'''予約デバイス名'''とも呼ばれる。


主なものを下の表に示すが、ほかにも予約デバイス名は存在する<ref>{{Cite web|author=マイクロソフト|authorlink=マイクロソフト|date=2003-05-12|url=http://support.microsoft.com/kb/74496/en-us|title=MS-DOS Device Driver Names Cannot be Used as File Names|work=Microsoftサポート技術情報|language=英語|accessdate=2008-11-30}}{{リンク切れ|date=2022年3月}}</ref>
主なデバイスファイルを下表に示す。
<ref>{{Cite web|和書|author=マイクロソフト|authorlink=マイクロソフト|date=2021-09-23|url=https://docs.microsoft.com/ja-JP/troubleshoot/windows-client/backup-and-storage/fat-hpfs-and-ntfs-file-systems|title=FAT、HPFS、NTFSファイルシステムについて|work=Microsoft のテクニカル ドキュメント|accessdate=2022-03-06}}</ref>。
{| class="wikitable" cellpadding=4
{| class="wikitable" cellpadding=4
!ファイル名
!ファイル名
78行目: 78行目:
|}
|}


予約語に[[拡張子]]を付与しても同様に予約されたデバイスを意味する。つまり、"nul.doc" や "con.htm" はファイル名ではなく、それぞれNULとCONデバイスと解釈される。
予約語に[[拡張子]]を付与しても同様に予約されたデバイスを意味する。つまり、"nul.doc" や "con.htm" はファイル名ではなく、それぞれNULとCONデバイスと解釈される。また、"C:\WINDOWS\CON" などのようにパス名の体を成していても予約デバイス名として扱われる。さらに、MSCDEXとCD-ROMドライバ間で使用するデバイス名も同様に予約デバイス名として扱われる。

=== CONCON問題 ===
CONCON問題は、[[Windows 9x系]]の予約名の扱いのバグを突いて、対象のコンピュータをフリーズさせる攻撃を行えるという問題である。例えば、"C:\CON\CON" へのリンクのあるウェブページを用意して、それをクリックさせるなどという風に悪用された。これは、9x系に予約デバイス名が複数回現れるパスを指定してファイルを開こうとするとシステムがフリーズしてしまうバグが存在したためである<ref>{{Cite web|和書|author=マイクロソフト|authorlink=マイクロソフト|date=2007-07-18|url=http://support.microsoft.com/kb/256015/ja|title=パスに複数の MS-DOS デバイス名が含まれていると致命的な例外 0E が発生する|work=Microsoftサポート技術情報|accessdate=2008-11-30}}{{リンク切れ|date=2022年3月}}</ref>。


== 関連項目 ==
== 関連項目 ==
* [[ブロックサイズ]]
* [[ブロック (データ)]]
* [[バッファ]]
* [[バッファ]]
* [[ファイルシステム]]
* [[ファイルシステム]]
88行目: 91行目:
{{Reflist}}
{{Reflist}}


== 参考文献 ==
{{DEFAULTSORT:すへしやるふあいる}}
* {{Cite book|和書
| author=発行者 塚本慶一郎
| title=標準MS-DOSハンドブック
| publisher=株式会社アスキー
| date=1984-7-10
| isbn=4-87148-742-3
| ref={{Sfnref| MSDOShandbook|1984}}
}}

{{DEFAULTSORT:てはいすふあいる}}
[[Category:OSのファイルシステム]]
[[Category:OSのファイルシステム]]
[[Category:UNIX]]
[[Category:UNIX]]


[[de:Devfs]]
[[cs:Zařízení (soubor)]]
[[ko:장치 파일]]
[[es:Device Filesystem]]
[[pl:Plik urządzenia]]
[[fr:Devfs]]
[[it:DEVFS]]
[[pt:Arquivo de dispositivo]]
[[pl:Device Filesystem]]

2023年12月18日 (月) 00:15時点における最新版

デバイスファイル: Device file)またはスペシャルファイル: Special file)とは、ファイルシステム上であたかも通常のファイルのような形で提示されるデバイスドライバインタフェースである。これにより、ソフトウェア入出力システムコールを通してデバイスドライバを使うことができ、作業が単純化される。

デバイスファイルは、プリンターなどの周辺機器への単純なインタフェースを提供する。また、ディスクパーティションなどの機器上の特定のリソースへのアクセスにも使える。さらに、/dev/null擬似乱数生成器といった特定の機器とは対応しないリソースへのアクセスにも使われる。

UNIX・Unix系

[編集]

UNIXUnix系オペレーティングシステム (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ディストリビューションでよく使われるデバイスノード名のプレフィックスである[1]

多くの場合、これらプレフィックスの後に特定の機器に対応した固有の番号が付与される。ハードディスクドライブでは、ドライブを特定する番号の後にパーティションを特定する番号が付与される。従って例えば、/dev/sda3はディスク上の領域であり、/dev/pts/14に対応してネットワーク経由の端末セッションがある。

バージョン7以降のFedoraなどのLinuxディストリビューションでは、sdをあらゆるディスクドライブに使っている (libATA)[2]

MS-DOS・Windows

[編集]

MS-DOSはUNIXからスペシャルファイルの概念を導入したが、これをデバイスファイルと呼んだ[3]。ごく初期のMS-DOSはディレクトリ階層をサポートしていなかったため、デバイスファイルを通常のファイルと区別するためにそれらの名称を予約語にしていた。つまり、特定のファイル名がデバイスファイル用に予約されており、同じ名前のファイルやディレクトリを新たに作成できないようになっていた。予約された名称は、CP/MPIPコマンドでの「スペシャルファイル」と互換になるよう選ばれている。これはWindowsにも引き継がれ、予約デバイス名とも呼ばれる。

主なものを下の表に示すが、ほかにも予約デバイス名は存在する[4] [5]

ファイル名 用途
CON コンソール
PRN プリンター
AUX 補助(予備)デバイス
COM0 COM1 COM2 COM3 COM4 COM5 COM6 COM7 COM8 COM9 シリアルポート
LPT1 LPT2 PRN パラレルポート
NUL ビットバケツ

予約語に拡張子を付与しても同様に予約されたデバイスを意味する。つまり、"nul.doc" や "con.htm" はファイル名ではなく、それぞれNULとCONデバイスと解釈される。また、"C:\WINDOWS\CON" などのようにパス名の体を成していても予約デバイス名として扱われる。さらに、MSCDEXとCD-ROMドライバ間で使用するデバイス名も同様に予約デバイス名として扱われる。

CONCON問題

[編集]

CONCON問題は、Windows 9x系の予約名の扱いのバグを突いて、対象のコンピュータをフリーズさせる攻撃を行えるという問題である。例えば、"C:\CON\CON" へのリンクのあるウェブページを用意して、それをクリックさせるなどという風に悪用された。これは、9x系に予約デバイス名が複数回現れるパスを指定してファイルを開こうとするとシステムがフリーズしてしまうバグが存在したためである[6]

関連項目

[編集]

脚注

[編集]
  1. ^ 比較のため http://www.yiluda.net/manual/linux/rute/node21.html を参照。2007年9月4日閲覧[リンク切れ]
  2. ^ Installation Notes”. Fedora 7 Release Notes. Red Hat, Inc. (2007年5月31日). 2022年3月7日閲覧。
  3. ^ MSDOShandbook 1984, p. 30,57.
  4. ^ マイクロソフト (2003年5月12日). “MS-DOS Device Driver Names Cannot be Used as File Names” (英語). Microsoftサポート技術情報. 2008年11月30日閲覧。[リンク切れ]
  5. ^ マイクロソフト (2021年9月23日). “FAT、HPFS、NTFSファイルシステムについて”. Microsoft のテクニカル ドキュメント. 2022年3月6日閲覧。
  6. ^ マイクロソフト (2007年7月18日). “パスに複数の MS-DOS デバイス名が含まれていると致命的な例外 0E が発生する”. Microsoftサポート技術情報. 2008年11月30日閲覧。[リンク切れ]

参考文献

[編集]
  • 発行者 塚本慶一郎『標準MS-DOSハンドブック』株式会社アスキー、1984年7月10日。ISBN 4-87148-742-3