スケーラブルデータベースサーバ HiRDB Version 8 コマンドリファレンス(UNIX(R)用)

[目次][索引][前へ][次へ]

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

<この項の構成>
(1) 主な媒体
(2) ファイル名の例
(3) ファイル名の作成
(4) 概略
(5) 作成例

(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用に新たに作成するテープ