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