Hitachi

ノンストップデータベース HiRDB Version 9 コマンドリファレンス(UNIX(R)用)


付録E.2 可変長ブロックテープでの作成方法

〈この項の構成〉

(1) 主な媒体

DAT,CGMT,OMT

(2) ファイル名の例

/dev/dat/vdat010(内蔵DAT),

/dev/cgmt/vcgmt160(カートリッジ磁気テープ),

/dev/omt/vomt055(オープンリール磁気テープ)

(3) ファイル名の作成

可変長ブロックデバイスは,導入時には作成されていません。そのため,事前に作成する必要があります。

スーパユーザが,次のコマンドを実行します。

 /etc/mknod /dev/dat/vdat010   c 119 0x010001
 /bin/chmod 0666 /dev/dat/vdat010
(説明)

通常はこのコマンドを実行すれば,内蔵DATに対する可変長ブロックアクセスデバイスが作成されます。

/dev/dat/vdat010:

デバイス名称

c :

キャラクタスペシャルファイル

119:

メジャー番号(DATの可変長ブロック使用を示します)

0x010001:

マイナー番号(内蔵DATを圧縮モードで使用することを表します)

なお,用語,概念などについては,次のmanを参照してください。

mknod及びchmod:man 1m mknod及びman chmod

メジャー番号,マイナー番号,及びデバイス名称の命名規則:man 6 mt

(4) 概略

可変長ブロックテープは,任意のブロック長で書き込まれたテープです。

任意のブロック長での書き込みができるため,DAT形式のほかにバイナリ形式のデータも直接扱えます。ただし,書き込みと同じブロック長で読む必要があります(例えば,64キロバイトで書いたブロックを32キロバイトで読むと,残りの32キロバイトは読まれません)。レコードごとに長さを変更しても,それを読む方に伝える手段がないため,通常最終ブロック以外は同じブロック長で書き込み,最終ブロックだけ端数のブロック長で書くようにします。

データベース作成ユティリティ(pdload)はそのブロック長を32キロバイトとしているので,それより大きいブロック長で作成されたテープの正常読み取りはできません。

[図データ]

そのため,作成時はブロック長を32キロバイト以下にする必要があります。

次の作成例では,ブロック長を32キロバイトに設定しています。

(5) 作成例

DAT形式もバイナリ形式も同じように作成します。

(a) 通常ファイル→可変長ブロックテープ

cpコマンドはバッファ長を指定できないので使用できません。代わりにddコマンドを使用します。

/usr/bin/vi/dev/dat/vdat010という可変長ブロックテープに出力する場合】
 dd if=/usr/bin/vi of=/dev/dat/vdat010 bs=32k
 
→7+1 入力レコード
→7+1 出力レコード
(凡例)

→:システムの出力

(説明)

7+1というのは,32キロバイトブロックを7個と32キロバイト未満のブロックを1個処理したということを示しています。

(b) プログラムを作成する場合

次のようなプログラムを作成すると,任意長のデータ(data_lenで指定)をブロック長32キロバイトで可変長ブロックテープに出力します(32キロバイトのwrite_bufをシステムバッファに割り当ててから,フルバッファリング(_IOFBF)指定で出力します)。

 #define PROC_BUFSIZ     1024 * 32
 FILE*   fp;
 int     data_len;               /* データ長(バイナリ時必要)*/
 char    write_buf[PROC_BUFSIZ]; /* システムコールのbuf  */
 char    data_buf[PROC_BUFSIZ];  /* ユーザのbuf          */
     :
 fp = fopen("/dev/dat/vdat010","w")
 setvbuf(fp, write_buf, _IOFBF, PROC_BUFSIZ)
     :
 while(データのある間) {
     データ書き込み処理
 }
     :
 fclose(fp);
[説明]
データ書き込み処理:
  • DAT形式

    data_bufにデータを作成します。データ+¥n+¥0

    fputs(data_buf, fp);

  • バイナリ形式

    data_bufにデータを作成します。データ長data_len

    fwrite(data_buf, data_len, 1,fp);

(c) cpコマンドでテープを作成した場合

元データが通常ファイルの場合,(a)の方法で作成し直します。

DAT装置が2台ある場合は,次の方法でバッファ長を変換できます。

 dd if=/dev/vdat010 ibs=64k of=/dev/vdat011 obs=32k
(説明)
/dev/vdat010:

cpコマンドで作成したデータ

/dev/vdat011:

pdload用に新たに作成するテープ