                     Network Block Device (TCP バージョン)
                                       
   注記 - Network Block Device (NBD) は現在実験的なもので、私のコンピュー
   タと学校でも一台のコンピュータでは、ほぼ動作しています。
   
   NBD とは：カーネルに組み込むと、Linux はブロックデバイスとしてリモー
   トサーバを使えます。したがって、クライアントコンピュータが /dev/nd0
   を読出したい時はいつでも TCP でサーバへ要求を送り、サーバはデータ読
   出しの応答をします。この方法は、ディスク領域の少ないステーション
   (あるいはフロッピーからブートするならディスクレスでも) で、別のコン
   ピュータのディスク領域を借用するのに利用できます。NFS とは異なり、
   その領域にどんなファイルシステムでも置くことができます。しかし、NBD
   はユーザレベルプログラムの起動が必要なので、ルートファイルシステム
   には利用できません。さらに、ユーザランドでブロックデバイスの実行が
   できます (物理的に同じコンピュータをサーバとクライアントとし、ルー
   プバックを使用して通信します)。
   
   現状：現在動作します。NBD はかなり安定しているように見えます。元々
   TCP 上で swap はできないと考えていました。しかし、それは真実でない
   ことが判明しました - 現在 TCP 上での swap は動作し、デッドロックも
   起きないようですが、このためには Linux のネットワーク層に相当な量の
   パッチをあてる必要があります。
   
   デバイス：NBD はメジャー番号 43, マイナー番号 0..n を使用します (こ
   の n は nbd.h で設定可能です)。必要な時、mknod でこれらのファイルを
   作成します。作成後、ls -l /dev/ の結果は次のようになります -

brw-rw-rw-   1 root     root      43,   0 Apr 11 00:28 nd0
brw-rw-rw-   1 root     root      43,   1 Apr 11 00:28 nd1
...

   プロトコル：ユーザランドプログラムは TCP ソケットが接続しているファ
   イルハンドルを実際のカーネルドライバに渡します。この方法で、カーネ
   ルは接続などの注意を払う必要がありません。プロトコルは思ったより単
   純です - ドライバがブロックデバイスから読むよう依頼されれば、次の形
   式の "要求" パケットを送ります (データはすべてネットワークバイト順
   です) -
   
  __u32 magic;        0x12560953 でなければなりません
  __u32 from;         読出しもしくは書込みのバイト位置
  __u32 len;          読出しもしくは書込みのバイト数
  __u64 handle;       操作するハンドル
  __u32 type;         0 = 読出し
                      1 = 書込み
  ...                 書込み操作の場合、このすぐ後にデータのバイト長が
                      続きます。

   操作が完了すると、サーバは次の構造の "応答" パケットを返します -
   
  __u32 magic;        要求と同じ
  __u64 handle;       要求からコピーされたハンドル
  __u32 error;        0 = 操作が成功
                      0 以外はエラーコード
  ...                 読出し操作でエラーがなかった場合、このすぐ後にデー
                      タのバイト長が続きます。

   詳しくは http://atrey.karlin.mff.cuni.cz/~pavel を参照してください。
----------------------------------------------------------------------
日本語訳：野本浩一 <hng@ps.ksky.ne.jp>
    校正：中谷千絵さん <jeanne@mbox.kyoto-inet.or.jp>
          堀田倫英さん <hotta@net-newbie.com>
