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 バイトである。
- -q
- 問合わせモード。
raw
は新たなバインドを設定する代わりに、
既存のバインドに対する問合わせを行う。
- -a
-
-q
オプションとともに用い、既存のバインド済み
raw
デバイスすべてに対して問合わせを行う。
- -h
- 使用方法の要約を表示する。
Linux の
dd(1)
コマンドは、現在のところバッファを正しくアラインしない。
したがって raw
デバイスには用いることができない。
raw I/O デバイスは、 Linux
ブロックデバイスのバッファキャッシュとの
キャッシュの整合性を管理しない。バッファキャッシュに既に存在するデータを
raw I/O
を用いて上書きすると、そのバッファキャッシュの指す記憶装置の
デバイスの実際の内容との不整合が発生する。
これは恣意的なものであるが、
質問した人によって、回答はバグであったり仕様であったりするだろう!
Stephen Tweedie (
[email protected])