z/OSのIPLINFOを辿る

#はじめに
z/OSではIPL時に参照されるパラメーターがあちこちに散らばっていて、それらを辿るのに恐ろしく深くて広い階層が広がっているように感じてしまいます(慣れればそうでもないのでしょうけど)。
ここでは```D IPLINFO``` コマンドで表示される情報から、各種PARMLIBなどを辿ってみます。
基本、各種パラメーターを設定するためのメンバー名のプレフィックスは固定で、後ろ2文字のサフィックスを可変にして実際どれを使うのか制御するということになっています(LOADxxとかIEASYSxxとか)。

前提: 主にミドルウェア担当者目線で個人的に良く見る所を書いてます。
環境: z/OS V2.1

#IPLINFO
SDSFで、```D IPLINFO``` でIPLに関する情報が確認できます。

```xxx:IPLINFO
D IPLINFO                                                  
IEE254I  20.01.44 IPLINFO DISPLAY 724                      
 SYSTEM IPLED AT 15.42.13 ON 07/25/2016                    
 RELEASE z/OS 02.01.00    LICENSE = z/OS                   
 USED LOADT1 IN SYS1.IPLPARM ON 00A82                      
 ARCHLVL = 2   MTLSHARE = N                                
 IEASYM LIST = 00                                          
 IEASYS LIST = T1 (OP)                                     
 IODF DEVICE: ORIGINAL(00A82) CURRENT(00A82)               
 IPL DEVICE: ORIGINAL(00A80) CURRENT(00A80) VOLUME(S1RES1) 
```

まず```USED LOADT1 IN SYS1.IPLPARM ON 00A82```という行に着目します。これは、アドレス0A82に割り当てられているVolume上のSYS1.IPLPARMデータセットのLOADT1というメンバーを参照してIPLされていることを示しています。

0A82というアドレスのVolumeの情報を見てみましょう。

```
D U,,,0A82,1                                   
IEE457I 20.24.57 UNIT STATUS 766               
UNIT TYPE STATUS        VOLSER     VOLSTATE    
0A82 3390 A             S1SYS1     STRG/RSDNT  
```

S1SYS1というVOLSER名であることが分かりました。

#LOADxx
S1SYS1上の、SYS1.IPLPARM(LOADT1)を見てみましょう。

```xxx:SYS1.IPLPARM(LOADT1)
IODF     99 SYS1                                            
SYSCAT   S1SYS1113CCATALOG.Z21S.MASTER                      
SYSPARM  T1                                                 
IEASYM   00                                                 
NUCLST   00                                                 
PARMLIB  USER.PARMLIB                                 S1CFG1
PARMLIB  ADCD.Z21S.PARMLIB                            S1SYS1
PARMLIB  SYS1.PARMLIB                                 S1RES1
NUCLEUS  1                                                  
SYSPLEX  ADCDPL                                             
```

使用するIODFやらマスターカタログの情報などがあります。
```SYSPARM  T1```という行に注目してみましょう。これは、<Font color="blue">IEASYS</font><Font color="red">T1</font> というメンバーを参照することを指しています(IEASYSは固定でサフィックスとしてここではT1を使いますよという指定)。
メンバー名は分かりましたが、どこのデータセットにあるものを使うか、というと、下に```PARMLIB ....```と指定されている行が複数ありますね。このPARMLIBで指定されたデータセットを上から順に探索し、はじめに出てくるIEASYST1が参照されます。

#IEASYSxx
2つ目のPARMLIBに指定されているADCD.Z21S.PARMLIBにIEASYST1が見つかったとしましょう。こいつを覗いてみると...

```xxx:ADCD.Z21S.PARMLIB(IEASYST1)
CLOCK=00,                     SELECT CLOCK00                            
CLPA,                                                                   
CMB=(UNITR,COMM,GRAPH,CHRDR), ADDITIONAL CMB ENTRIES                    
CMD=T1,                                                                 
CON=(00,NOJES3),              SELECT CONSOL00                           
COUPLE=00,                    RRS                                       
CSA=(3000,400000),            CSA RANGE                                 
DIAG=00,                      SELECT DIAG00, DIAGNOSTIC COMMANDS        
DUMP=DASD,                    PLACE SVC DUMPS ON DASD DEVICES           
FIX=00,                       SELECT IEAFIX00, FIX MODULES SPECIFIED    
GRS=NONE,                     NO COORDINATION OF GRS REQUESTS           
ILMMODE=NONE,                 EXPLICITLY DISABLE LICENSE MANAGER        
LNKAUTH=LNKLST,               AUTHORIZE LNKLST00, APFTAB IS ALTERNATE   
LOGCLS=L,                     WILL NOT BE PRINTED BY DEFAULT            
LOGLMT=999999,                MAX WTL MESSAGES QUEUED, MUST BE 6 DIGITS 
LOGREC=SYS1.LOGREC,           ERROR RECORDING                           
LPA=T1,                       SELECT LPALSTCI                           
MAXUSER=250,                  SYS TASKS PLUS INITS PLUS TSOUSERS        
MLPA=00,                      SELECT IEALPA00, MLPA PARAMETERS          
MSTRJCL=00,                   SELECT MSTJCLEX, MASTER JCL               
OMVS=(00,BP,IZ,BL,CI),           SELECT BPXPRMXX                        
OPI=YES,                      ALLOW OPERATOR OVERRIDE                   
PAGE=(SYS1.PLPA.PAGE,                                                   
      SYS1.COMMON.PAGE,                                                 
      SYS1.LOCALA.PAGE,                                                 
      SYS1.LOCALB.PAGE,L),                                              
PAK=00,                       SELECT IEAPAK00                           
PLEXCFG=ANY,                  RRS                                       
PROG=T1,                      SELECT PROGCI, DYNAMIC APF LIST           
PROD=(00,01),                 PLEASE NOTE IFAPRD01                      
REAL=128,                     ALLOWS 2 64K OR 1 128K JOB TO RUN V=R     
RSU=0,                        NO RECONFIG STORAGE UNITS                 
RSVNONR=100,                  RESERVED ASVT ENTRIES                     
RSVSTRT=5,                    RESERVED ASVT ENTRIES                     
SCH=DB,                       SELECT SCHED00                            
...(略)
```

こんな感じでパラメーターのリストがありますが、これも実は各メンバーのサフィックスが指定してあるだけなんです。こいつが各種パラメーターの親玉みたいなもんです。
例えば、```CMD=T1```はCOMMNDxxのサフィックスがT1である、すなわちCOMMNDT1というメンバーを参照しますよという指定です。
例えば、```OMVS=(00,BP,IZ,BL,CI)``` というようにサフィックスが複数指定されているものもあります。OMVSの場合BPXPRMという固定のプレフィックスが付きますので、BPXPRM00, BPXPRMBP, BPXPRMIZ, BPXPRMBL, BPXPRMCI というメンバーを使用する、ということになります。用途によってメンバーを分ける場合などこのように複数メンバーに分けて管理されます。
データセットはIEASYSxxと同様、LOADxxに指定されたPARMLIBから探索されます。

#JES
JES関連のパラメーターを追ってみます。
IEASYSxxの```MSTRJCL=00```の行を見ます。これはマスターJCLとしてMSTJCL00を参照することを意味します。同じADCD.Z21S.PARMLIBにあるものとしましょう。

```xxx:ADCD.Z21S.PARMLIB(MSTJCL00)
//MSTJCL00 JOB MSGLEVEL=(1,1),TIME=1440            
//         EXEC PGM=IEEMB860,DPRTY=(15,15)         
//STCINRDR DD SYSOUT=(A,INTRDR)                    
//TSOINRDR DD SYSOUT=(A,INTRDR)                    
//IEFPDSI  DD DSN=ADCD.&SYSVER..PROCLIB,DISP=SHR   
//         DD DSN=SYS1.PROCLIB,DISP=SHR            
//SYSUADS  DD DSN=SYS1.UADS,DISP=SHR               
//SYSLBC   DD DSN=SYS1.BRODCAST,DISP=SHR           
```

ここで、IEFPDSIというDDにコンカチされているデータセット(ADCD.&SYSVER..PROCLIB, SYS1.PROCLIB)に着目します。このDDを上から探索していって最初に見つかったJES2というメンバーがJES2のプロシージャーとして使用されます。
JES2の中身を見てみましょう。

```xxx:ADCD.Z21S.PROCLIB(JES2)
//JES2      PROC MEMBER=JES2PARM,ALTMEM=JES2BACK                
//IEFPROC   EXEC PGM=HASJES20,DPRTY=(15,15),TIME=1440,PERFORM=9 
//ALTPARM   DD   DSN=ADCD.&SYSVER..PARMLIB(&ALTMEM),DISP=SHR    
//HASPPARM  DD   DSN=ADCD.&SYSVER..PARMLIB(&MEMBER),DISP=SHR    
//PROC00    DD   DSN=USER.PROCLIB,DISP=SHR                      
//          DD   DSN=ADCD.&SYSVER..PROCLIB,DISP=SHR             
//          DD   DSN=CEE.SCEEPROC,DISP=SHR                      
//          DD   DSN=CSQ710.SCSQPROC,DISP=SHR                   
//          DD   DSN=IOE.SIOEPROC,DISP=SHR                      
//          DD   DSN=EOY.SEOYPROC,DISP=SHR                      
//          DD   DSN=HLA.SASMSAM1,DISP=SHR                      
//          DD   DSN=CBC.SCCNPRC,DISP=SHR                       
//          DD   DSN=SYS1.PROCLIB,DISP=SHR                      
//HASPLIST  DD   DDNAME=IEFRDER                                 
```

PROC00というDDにコンカチされているデータセット(USER.PROCLIBなど)に注目して下さい。STARTコマンドで起動されるSTCタスクのプロシージャーなどは、ここにコンカチされているデータセットを順に探索して実行されます。

#VTAM
VTAMが使用するパラメーターはVTAM起動時オプションで指定されるのでVTAM起動コマンドを確認する必要があります。VTAM起動方法は環境によって異なりますが、COMMNDxxで起動される場合そこから辿れます。

COMMANDxxを参照

```xxx:ADCD.Z21S.PARMLIB(COMMNDT1)
COM='S JES2,PARM='WARM,NOREQ''        
COM='S VLF,SUB=MSTR'                  
COM='S VTAM,,,(LIST=00)'                       
COM='S VTAMT1'                        
COM='S DLF,SUB=MSTR'                  
COM='DD ADD,VOL=S1SYS1'               
COM='DD NAME=SYS1.&ADCDLVL..DMP&SEQ'  
COM='DD ALLOC=ACTIVE'                 
```

ここで```COM='S VTAM,,,(LIST=00)' ```という行に着目します。ここでVTAMというプロシージャーをオプション付きでスタートさせています。
(VTAMという分かりやすいプロシージャー名が使われているのでよいですが、環境によっては全く異なる名前のプロシージャーを使っていることもあるので注意。)
LIST=00という指定は、ATCSTR00というメンバーをVTAM起動オプションとして参照することを指します。このメンバーの探索パスは、VTAM起動プロシージャーを参照する必要があります。
VTAMプロシージャーはJESの章で示したとおり、JES2のDDにコンカチされているデータセットから探索されます。

```xxx:ADCD.Z21S.PROCLIB(VTAM)
//VTAM   PROC                                          
//* DOC: THIS IS THE CATALOGED PROCEDURE USED FOR      
//*      STARTING ACF/VTAM.                            
//*                                                    
//*      THE VTAMLST DD STATEMENT IDENTIFIES WHERE     
//*      VTAM NETWORK DEFINITION STATEMENTS AND START  
//*      OPTIONS ARE LOCATED.                          
//*                                                    
//*      THE VTAMLIB DD STATEMENT IDENTIFIES WHERE THE 
//*      VTAM LOAD MODULES USED ONLY IN VTAM'S PRIVATE 
//*      ADDRESS SPACE ARE TO BE FOUND.                
//*                                                    
//*                                                    
//VTAM     EXEC PGM=ISTINM01,REGION=0M,                
//         DPRTY=(15,15),TIME=1440,PERFORM=8           
//VTAMLST  DD DISP=SHR,                                
//            DSN=USER.VTAMLST                         
//         DD DISP=SHR,                                
//            DSN=ADCD.&SYSVER..VTAMLST                
//         DD DISP=SHR,                                
//            DSN=SYS1.VTAMLST                         
//VTAMLIB  DD DISP=SHR,                                
//            DSN=USER.VTAMLIB                         
//         DD DISP=SHR,                                
//            DSN=ADCD.&SYSVER..VTAMLIB                
//         DD DISP=SHR,                                
//            DSN=SYS1.VTAMLIB                         
//SISTCLIB DD DISP=SHR,                                
//            DSN=SYS1.SISTCLIB                        
//SYSABEND DD SYSOUT=*,HOLD=YES                        
//DSDBCTRL DD DSN=SYS1.DSDBCTRL,DISP=SHR               
//DSDB1    DD DSN=SYS1.DSDB1,DISP=SHR                  
//DSDB2    DD DSN=SYS1.DSDB2,DISP=SHR                  
//TRSDB    DD DSN=SYS1.TRSDB,DISP=SHR                  
```

このVTAMLSTというDDにコンカチされているデータセットからATCSTRxxが探索されます。

```xxx:ADCD.Z21S.VTAMLST(ATCSTR00)
CONFIG=00,SUPP=NOSUP,                                    
SSCPID=06,NOPROMPT,                                      
HOSTSA=6,MAXSUBA=31,                                     
SSCPNAME=ADCDSSCP,HOSTPU=ADCD$PUC,                       
NETID=NETD,                                              
NODETYPE=NN,                                             
DYNLU=YES,                                               
CRPLBUF=(208,,15,,1,16),                                 
IOBUF=(400,508,19,,1,20),                                
LFBUF=(104,,0,,1,1),                                     
LPBUF=(64,,0,,1,1),                                      
SFBUF=(163,,0,,1,1)                                      
*/*                                                      
*/* LIB: SYS1.VTAMLST(ATCSTR00)                          
*/* GDE: CBIPO COMMUNICATIONS                            
*/* DOC: THIS MEMBER CONTAINS THE ACF/VTAM DEFAULT       
*/*      START OPTIONS ON THE MODEL INSTALLATION SYSTEM. 
*/*                                                      
```

ここに起動時パラメーターがいくつか指定されていますが、まだ階層は続きます。```CONFIG=00```という指定は、ATCCON00というメンバーが参照されることを示しています。探索場所はATCSTRxxと同じです。

```xxx:ADCD.Z21S.VTAMLST(ATCCON00)
A0600,NSNA70X,DYNMODEL,COSAPPN,       
A0TCP,OSATRL2,IMS11APL,IMS12APL,      
IMS13APL,DB9GLU,CICSAPPL,DBAGLU,DBBGLU
```

ここに使用されるVTAM資源(TRL大ノードやらAPPL大ノードやら)のメンバー名が指定されています。

例えば...

```xxx:ADCD.Z21S.VTAMLST(OSATRL1)
OSATRL1 VBUILD TYPE=TRL                                                 
OSATRL1E TRLE LNCTL=MPC,READ=(0400),WRITE=(0401),DATAPATH=(0402),      X
               PORTNAME=ADM1ETP,                                       X
               MPCLEVEL=QDIO                                            
```

```xxx:ADCD.Z21S.VTAMLST(CICSAPPL) 
CICSAPPL VBUILD  TYPE=APPL                                              
CICSTS52 APPL AUTH=(ACQ,VPACE,PASS),EAS=100,HAVAIL=YES,                X
               PARSESS=YES,SONSCIP=YES,VPACING=5                        
CICSTS51 APPL AUTH=(ACQ,VPACE,PASS),EAS=100,HAVAIL=YES,                X
               PARSESS=YES,SONSCIP=YES,VPACING=5                        
CICSTS42 APPL AUTH=(ACQ,VPACE,PASS),EAS=100,HAVAIL=YES,                X
               PARSESS=YES,SONSCIP=YES,VPACING=5                        
CT51*    APPL AUTH=(ACQ,VPACE,PASS),EAS=100,HAVAIL=YES,                X
               PARSESS=YES,SONSCIP=YES,VPACING=5          
```

ふー、長かった。           

#TCPIP
TCPIPのパラメーターについてもVTAMと辿り方は似ています。
COMMNDxxから起動されているそれっぽいプロシージャーを見つけて、プロシージャーの中身を確認します。

```xxx:ADCD.Z21S.PROCLIB(TCPIP)  
//TCPIP    PROC PARMS='CTRACE(CTIEZB00)'                                
//*                               
//TCPIP    EXEC PGM=EZBTCPIP,REGION=0M,TIME=1440,                       
//             PARM='&PARMS'                                        
//*                                                                     
//STEPLIB  DD DSN=ADCD.&SYSVER..VTAMLIB,DISP=SHR                        
//*                                                                     
//SYSPRINT DD SYSOUT=H,DCB=(RECFM=VB,LRECL=132,BLKSIZE=136)             
//ALGPRINT DD SYSOUT=*,DCB=(RECFM=VB,LRECL=132,BLKSIZE=136)             
//CFGPRINT DD SYSOUT=*,DCB=(RECFM=VB,LRECL=132,BLKSIZE=136)             
//SYSOUT   DD SYSOUT=H,DCB=(RECFM=VB,LRECL=132,BLKSIZE=136)             
//CEEDUMP  DD SYSOUT=*,DCB=(RECFM=VB,LRECL=132,BLKSIZE=136)             
//SYSERROR DD SYSOUT=*                                                  
//*                                                           
//PROFILE  DD DISP=SHR,DSN=ADCD.&SYSVER..TCPPARMS(PROF2)  
//SYSTCPD  DD DSN=TCPIP.TCPIP.DATA,DISP=SHR     
```

末尾2行のDDが参照されるProfile, TCPDATAです。

#その他
あとはこの辺↓注目してみることが多いですが、IEASYSxxから辿るだけなので割愛。
PROGxx => APFとかLINKLSTとか
BPXPRMxx => zFS, MOUNT, Network関連とか

それから、所々出てくるシンボル(&xx.という書式のいわゆる変数ですね)は、IEASYMxxに定義されていたりします。