2010年10月19日 mt & ddコマンドによるメインフレームで作成したテープの取り扱い [長年日記]
_ mt & ddコマンドによるメインフレームで作成したテープの取り扱い
メインフレームで作成したテープ、たとえば...
- ラベル付き
- 2つのファイルが格納されたマルチデータセット
- 各ファイルはブロック化された固定長レコードデータセット
の構造は以下のようになっている。
一つ目のファイルのLABEL情報(開始) [mtの認識するファイル1] EOM 一つ目のファイルのデータ [mtの認識するファイル2] EOM 一つ目のファイルのLABEL情報(終了) [mtの認識するファイル3] EOM 二つ目のファイルのLABEL情報(開始) [mtの認識するファイル4] EOM 二つ目のファイルのデータ [mtの認識するファイル5] EOM 二つ目のファイルのLABEL情報(終了) [mtの認識するファイル6] EOM EOM
EOMはラベルやファイル本体の区切りを示すデータで、ドライバで処理され、ユーザランドに渡されることはない(と思う...)。
ここでのポイントは、メインフレーム的には[LABEL(開始)]、[ファイル本体]、[LABEL(終了)]のセットで一つのファイルと認識するのだが、mt(Unix)的にこれらは独立した3つのファイルとして認識するというところ。
よって、たとえばメインフレームで作成した1つめのファイルのデータを読み込む場合
mt -f /dev/nst0 fsf 1 dd if=/dev/st0 of=出力ファイル ibs=ブロックサイズ cbs=レコードサイズ conv=ascii,unblock
とする。同様に、2つめのファイルのデータを読み込む場合は
mt -f /dev/nst0 fsf 4
としてからddを実行する。
各パラメータは以下のような意味を持つ。
- fsf n で不要なラベル情報やファイルデータをスキップ
- ibs=ブロックサイズ でメインフレーム側で指定したブロックサイズを指定
- cbs=レコードサイズ でメインフレーム側で指定したレコードサイズを指定
- ascii でEBCDICからASCIIへコード変換
- unblock で行末の連続した空白を改行1個に変換
逆に、Unix側で作成したテキストファイルをメインフレームに渡す場合は、
dd if=入力ファイル of=/dev/st0 obs=ブロックサイズ cbs=レコードサイズ conv=ebcdic,block
とする。
各パラメータは以下のような意味を持つ。
- obs=ブロックサイズ でメインフレーム側で参照されるブロックサイズを指定
- cbs=レコードサイズ でメインフレーム側で参照されるレコードサイズを指定
- ebcdic でASCIIからEBCDICへコード変換
- block で行末の改行を削除し、cbsで指定したレコードサイズを満たすまで空白を埋める
出来上がるテープは、(当然)ラベル無し(NL)形式となる。
あっ、もちろん漢字を含んだデータは化け化けになるので注意。