【2020/10/24 一部追記修正】
USSの階層型ファイル・システム内のファイルは、JCLのDDステートメントで直接指定することができます。DSNパラメーターをPATHパラメーターに取り替えれば、UNIXファイルをMVSの順次データセットのようにアクセスすることができます。
階層型ファイル・システムの種類
z/OS USSがサポートする階層型ファイル・システム・データセットには、HFSデータセットとzFSデータセットの2種類があります。機能面とパフォーマンス面でzFSが推奨されていますが、階層型のファイル・システムを理解するための最初のステップとしては、簡単な手順で作成できるHFSデータセットを使ってみるといいでしょう。
RACFプロファイルへの定義
階層型ファイル・システムをバッチ・ジョブから利用するだけであれば、アクセス先のディレクトリーとファイルの定義の仕方にもよりますが、特別にRACF権限を与える必要はありません。しかしながら、HFSデータセットやzFSデータセットをマウントしたり、マウント先のディレクトリーを作成するためには、z/OS USS関連のRACFプロファイルへの登録が必要です。階層型ファイル・システム利用者のRACFユーザー・プロファイルに、OMVSセグメントが登録されていない場合はOMVSセグメントを追加します。
OMVSセグメント登録内容の照会用RACF TSOコマンド
LU userid OMVS
なお、一般ユーザーの権限では自分のIDであってもOMVSセグメントが登録済みかの確認ができません。必要であれば運用部門やシステム管理者に問い合わせます。
1 2 3 4 5 6 7 8 9 10 11 |
OMVS INFORMATION ---------------- UID= 0000000767 0 以外のUIDを与える(UID=0はスーパーユーザー権限を示す) HOME= /u/tsoad21 ホーム・ディレクトリーを指定(ホーム・ディレクトリーより下の階層を利用) PROGRAM= /bin/sh デフォルトのUSSシェル・プログラム CPUTIMEMAX= NONE ASSIZEMAX= NONE FILEPROCMAX= NONE PROCUSERMAX= NONE THREADSMAX= NONE MMAPAREAMAX= NONE |
上記の他、TSOからマウント・コマンドを使用するには、RACFのGeneralリソース(クラス:FACILITY、プロファイル:BPX.SUPERUSER)に、READ権限を追加する必要があります。
RACF定義追加用のJCLサンプル(※RACF定義の更新権限を持っているユーザーに実行を依頼する)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
//RACFDEF EXEC PGM=IKJEFT01 //SYSPRINT DD SYSOUT=* //SYSTSPRT DD SYSOUT=* //SYSTSIN DD * LU userid OMVS ※OMVSセグメントを見るには SPECIAL属性が必要 RL FACILITY BPX.SUPERUSER AUTHUSER ※MOUNTコマンド権限のチェック ALTUSER TSOAD21 OMVS(UID(767)|AUTOUID HOME(/u/tsoad21) PROGRAM(/bin/sh)) ※ユーザーIDにOMVSセグメントを追加 (UID値はシステム管理者に確認する、AUTOUIDなら自動割り当てされる) PERMIT BPX.SUPERUSER CLASS(FACILITY) ACCESS(READ) ID(TSOAD21) ※ユーザーIDにMOUNTコマンドを許可する SETROPTS RACLIST(FACILITY) REFRESH ※FACILITY/BPX.SUPERUSERのリフレッシュ // |
HFS(またはzFS)データセットの作成
UNIXディレクトリーとファイルを格納する器となるMVSデータセットを作成します。
●HFSデータセットを作成する場合
1 2 3 4 |
//IEFBR14 EXEC PGM=IEFBR14 //MKFS1 DD DISP=(,CATLG),DSN=TSOAD21.HFS.FS1, // UNIT=SYSDA,SPACE=(CYL,(50,10,1)),DSNTYPE=HFS // |
※HFSデータセットにするには、区分データセットとしてのDIRブロック数の指定が必須。ただし1ブロックでよい。DIRブロック数を指定しないと、DSORGがHFSと認識されない。
●zFSデータセットを作成する場合
1 2 3 4 5 6 7 8 9 10 11 12 13 |
//DEFINE EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //SYSIN DD * DEFINE CLUSTER (NAME(TSOAD21.ZFS.FS1) VOLUMES(volser) - LINEAR CYL(50 10) SHAREOPTIONS(2)) //* //CREATE EXEC PGM=IOEAGFMT, // PARM='-aggregate TSOAD21.ZFS.FS1 -compat -perms o777 -overwr // ite' //SYSPRINT DD SYSOUT=* //STDOUT DD SYSOUT=* //STDERR DD SYSOUT=* // |
※zFSデータセットは、AMSユーティリティーでVSAMリニア・データセットとして割り振った後に、zFSユーティリティーIOEAGFMTでフォーマットする必要があります。パーミッションの値は8進数です。先頭に英小文字のo(オー)を付けて8進数であることを明示しています。
なお、このユーティリティーを利用するには、RACFのGeneralリソース(クラス:UNIXPRIV、プロファイル:SUPERUSER.FILESYS.PFSCTL)に、READ権限を追加する必要もあります。
HFS(またはzFS)データセットのマウント
HFS(またはzFS)データセットを作成したら、アクセス可能にするためにマウント処理を行います。
1 2 3 4 5 6 7 8 9 10 11 |
//MOUNT EXEC PGM=IKJEFT01 //SYSPRINT DD SYSOUT=* //SYSTSPRT DD SYSOUT=* //SYSTSIN DD * MKDIR 'hfsds1' MODE(7,7,7) MOUNT FILESYSTEM('TSOAD21.HFS.FS1') MOUNTPOINT('/u/tsoad21/hfsds1') - TYPE(HFS) NOSECURITY ※zFSデータセットの場合は、TYPEパラメーターをZFSにすればよい MOUNT FILESYSTEM('TSOAD21.ZFS.FS1') MOUNTPOINT('/u/tsoad21/hfsds1') - TYPE(ZFS) NOSECURITY // |
TSOのバッチ・セッションを使い、自分のホーム・ディレクトリーにマウント・ポイントを作成して、そこに割り振られたHFSデータセットをマウントします。1度行えばマウントを解除するまで有効です。マウントの解除は、ISPFのオプション6(ISPFコマンド・シェル)からISHELLコマンドでダイアログ版のUSSシェルを起動してその中で行うか、バッチJCLでUNMOUNTコマンドを実行します。
1 2 3 4 5 6 |
//UNMOUNT EXEC PGM=IKJEFT01 //SYSPRINT DD SYSOUT=* //SYSTSPRT DD SYSOUT=* //SYSTSIN DD * UNMOUNT FILESYSTEM('TSOAD21.HFS.FS1') // |
バッチによるマウントの解除の例。マウントを解除しても作成したファイルはデータセットに残っているので次のマウントで再びアクセスできます。
バッチ・ジョブからUNIXファイルを作成してアクセスする
HFS(またはzFS)データセットがマウントされると、バッチ・ジョブからJCLを使用してUNIXファイルにアクセスできるようになります。もちろんTSOからのアクセスもできます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
//STEP1 EXEC PGM=IEBDG //SYSPRINT DD SYSOUT=* //SYSUT2 DD PATH='/u/tsoad21/hfsds1/test.data1', // PATHDISP=(KEEP,KEEP),PATHOPTS=(OWRONLY,OCREAT,OTRUNC), // PATHMODE=SIRWXU, // RECFM=FB,LRECL=80,BLKSIZE=32000 //SYSIN DD * DSD OUTPUT=(SYSUT2) FD NAME=F1,LENGTH=03,STARTLOC=01,PICTURE=3,'KEY' FD NAME=F2,LENGTH=06,STARTLOC=04,FORMAT=ZD,INDEX=1 FD NAME=F3,LENGTH=01,STARTLOC=10,PICTURE=1,'-' FD NAME=F4,LENGTH=70,STARTLOC=11,FORMAT=AL,ACTION=RP CREATE NAME=(F1,F2,F3,F4),FILL='<',QUANTITY=20000 END //* //STEP2 EXEC PGM=IEBGENER //SYSPRINT DD SYSOUT=* //SYSUT1 DD PATH='/u/tsoad21/hfsds1/test.data1', // PATHDISP=(KEEP,KEEP),PATHOPTS=(ORDONLY), // RECFM=FB,LRECL=80,BLKSIZE=32000 //SYSUT2 DD SYSOUT=* //SYSIN DD DUMMY // |
プログラムからアクセスするUNIXファイルは、DSNではなくPATHパラメーターで指定します。ファイル名を、ルート・ディレクトリーからの絶対パス名で指定します。UNIXファイルはカタログ管理されませんので、ファイルがどこにあるかはパスによって示す必要があります。パスには絶対パスと相対パスがありますが、JCLでは絶対パスのみが使用できます。
PATHDISPは、DISPパラメーターの第2および第3パラメーターに相当するもので、正常終了時の後処理と異常終了時の後処理を、KEEPかDELETEのいずれかで指定します。
PATHOPTSは、DISPパラメーターの第1パラメーターに相当するもので、ファイルの状況に加えアクセス方法も指定します。ファイルの状況には、NEWに相当するOCREAT、MODに相当するOAPPENDなどがあります。アクセス方法には、読み取りを行うORDONLY、書き込みを行うOWRONLY、読み書き両方のORDWRがあります。OTRUNCは、既存ファイルが存在した場合に、ファイルを先頭から破棄して上書きし直すことを指示するものです。
PATHMODEは、ファイル作成時のアクセス属性の指定です。ファイルのパーミッションになるもので、アクセスするユーザーがUIDが0のSuper Userでなければ適切なアクセス属性の指定が必要です。ファイルの作成や書き込みにはRW権限が必要なので、SIRWXU属性を指定しています。
PATHDISP、PATHOPTSおよびPATHMODEに関しては、いずれのパラメーターもその詳細をマニュアル「z/OS MVS JCL解説書」で確認して適切な値を指定する必要があります。
また、UNIXファイルにはDSCBラベル情報がないので、既存のMVSアプリケーションがデータセットとしてアクセスするために必要な、RECFM、LRECLおよびBLKSIZEをJCLで明示します。プログラム内で明示的に指定されているものを除き、読み込み書き込みいずれであっても指定が必要です。BLKSIZEはDASDやTAPEデータセットと異なりBLKSIZE=0を指定したSDB(*1)ブロックサイズは指定できません。BLKSIZE=0ではブロック化されないのでI/Oパフォーマンスが大幅に低下します。UNIXファイルはDASDのトラック長に依存しないので、DFSMSdfpが定める最大ブロック長32760に最も近い論理レコード長の倍数を指定すればいいでしょう。もしくは32760以下での適当な値、例えばLRECLの100倍や200倍とかです。
USS経由でz/Linuxなどのオープン系システムとデータ交換を行うなどを行うのでなければ、単にMVSの順次データセットをUSS内のUNIXファイルに代えてもメリットはありません。しかし、USSのファイル・システムにはFIFO特殊ファイル(名前付きパイプ)など、バッチ・ジョブでも利用できるとても有用な機能もあります。基本的な使い方を知っておいて損はありません。FIFO特殊ファイル(名前付きパイプ)については、「先行ステップと後続ステップを同時に実行する」の記事で解説しています。
*1 デバイスのトラック長に合わせてDFSMSが決定する最適なブロック長のこと。システム決定ブロックサイズ(System-Determined Block size)と呼ばれる。