RAW(8) | System Manager's Manual | RAW(8) |
raw - Linux raw キャラクタデバイスをバインドする
raw /dev/raw/raw<N> <major> <minor>
raw /dev/raw/raw<N> /dev/<blockdev>
raw -q /dev/raw/raw<N>
raw -qa
raw は Linux raw キャラクタデバイスを ブロックデバイスにバインドするために用いられる。 どんなブロックデバイスでも利用できる。 またバインドする時にデバイスドライバがアクセス可能でなくてもかまわない (つまりオンデマンドでロードされるカーネルモジュールであってもかまわない)。
raw の利用法には 2 つのモードがある。一つは raw デバイスのバインドを 設定する動作であり、もう一つは存在しているバインドに対する問合わせをする 動作である。 raw デバイスの設定をするときは、 /dev/raw/raw<N> はファイルシステム中に存在している raw デバイスのノードのデバイス名である。 バインド先のブロックデバイスは、 major と minor 番号で示しても良いし、存在しているブロックデバイスファイルのパス名 /dev/<blockdev> で示しても良い。
既に存在しているバインドに対して、 -q オプションによって問合わせを行うことができる。 この際には、問合わせる raw デバイスのファイル名を指定しても良いし、 -a オプションを用いればバインド済みの全ての raw デバイスが対象となる。
major と minor を 0 に指定することにより、アンバインドすることができる。
いったん raw デバイスをブロックデバイスにバインドすると、 その raw デバイスはバインド先のブロックデバイスと同じように オープンしたり read/write できる。しかし raw デバイスの動作は ブロックデバイスと全く同じではない。特に違う点としては、 raw デバイスへのアクセスは、 カーネルのブロックバッファキャッシュを全く用いない。 全ての I/O は、その I/O を行ったプロセスのアドレス空間に対して 直に行われる。もし下層にあるブロックデバイスドライバが DMA をサポートしていると、データコピーを全く行わなくても I/O を完了することができる。
raw I/O では、プロセスのアドレス空間が割り付けられた物理メモリに 直接的なハードウェアアクセスを行うので、例外的な制限がいくつか存在する。 全ての I/O はメモリやディスク上で正しくアラインされていなければならない。 すなわちディスク上のセクタ先頭から始まり、セクタ長の整数倍で、 かつ仮想メモリ上のデータバッファもセクタ長の整数倍でなければならない。 ほとんどのデバイスでは、セクタのサイズは 512 バイトである。
Linux の dd(1) コマンドは、現在のところバッファを正しくアラインしない。 したがって raw デバイスには用いることができない。
raw I/O デバイスは、 Linux ブロックデバイスのバッファキャッシュとの キャッシュの整合性を管理しない。バッファキャッシュに既に存在するデータを raw I/O を用いて上書きすると、そのバッファキャッシュの指す記憶装置の デバイスの実際の内容との不整合が発生する。 これは恣意的なものであるが、 質問した人によって、回答はバグであったり仕様であったりするだろう!
Stephen Tweedie (sct@redhat.com)
Aug 1999 | Version 0.1 |