トップ «前の日記(2010年10月09日) 最新 次の日記(2010年10月21日)» 編集

Masa's blog

検索キーワード:

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)形式となる。

あっ、もちろん漢字を含んだデータは化け化けになるので注意。