Como crear un mini-z/OS para emergencias
1.1 Introducción al mini z/OS
La generación de un mini-Sistema Operativo obedece a una problemática relacionada con la posibilidad de una catástrofe que dejaría inutilizados todos los datos del sistema. Aunque dispongamos de las herramientas de copia de seguridad adecuadas, y dispongamos de una copia en cinta de todos los volúmenes de disco mediante un ADRDSSU DUMP FULL, la restauración de estos volúmenes se hace muy tediosa y prolongada en el tiempo.
1.1.1 DFSMSDSS vs mini z/OS
La utilidad DFSMSDSS Standalone Services, te permite crear una cinta ipl-able con un mínimo sistema, que te permite introducir comandos de RESTORE de una cinta la cual ha sido grabada con un DUMP FULL y restaurar dicha cinta a disco físico. El problema que surge es que es una utilidad tan sencilla, que el interfaz es muy limitado, a saber: Si se llenan los mensajes de la consola, hasta que no se pulsa Intro, el proceso que se estaba llevando a cabo se queda congelado.
Además, es un proceso muy lento, ya que la copia se realiza físicamente, pista por pista, y por tanto, la restauración de muchos volúmenes puede volverse eterna. Tampoco existen procedimientos para volcar sucesivamente muchos volúmenes seguidos, ya que la simpleza del interfaz no da soporte a estas opciones, debiendo realizar todo el proceso a mano, con lo que las posibilidades de error se incrementan.
La creación de un mini Sistema Operativo te permite disponer de un TSO y un JES2 para ejecutar JCLs de restauración de disco, de manera desatendida e infinitamente mas rápida y eficaz que el sistema DFSMSDSS. Por tanto, en vez de restaurar muchos volúmenes 3390 con la utilidad DFSMSDSS, esa utilidad se utilizaría una única vez, para volcar este mini z/OS, y una vez hecha IPL de este mini-sistema, continuar restaurando datos de una manera mas controlada, rápida y automática.
Este sistema ni dispone de OMVS, ni TCP/IP, ni SMF, ni DB2, ni CICS, ni ningún producto que no sea estrictamente necesario. Este sistema arranca lo imprescindible: El JES2, para submitir JCLs. Los procesos LLA y VLF para las librerías mínimas que se cargan en la LINKLIB. Un VTAM con una configuración básica para poder hacer logon, y por supuesto, el TSO. Un RACF con un único usuario, IBMUSER, con su password por defecto cuando se crea la base de datos de RACF, SYS1. Y por último, el ISPF y el SDSF para edición y control de los jobs que se submitan, respectivamente.
1.1.2 V1R4 vs. Otras versiones
He creado este mini-SO en base a la versión V1R4. La elección de esta versión es que las JCLs que he utilizado para crearla, van muy bien con esta versión, ya que hago numerosas referencias a la ficha STEPCAT, que ha dejado de estar disponible en versiones más nuevas, como la V1R7 y posteriores. La otra opción es utilizar Aliases, pero a mi me gusta mas el STEPCAT, pero este sistema también se puede generar con ALIASES, modificando un poco los JCLs. Eso ya dependerá de como se quiera crear el SO y depende de cada cual.
También he elegido la Version 1 Release 4 del z/OS, porque es la última versión soportada por los mainframes CMOS 9672 o S/390 Parallel Enterprise Server, ya que, en caso de emergencia, podrían ser utilizados para restaurar los datos y ofrece una compatibilidad hacia atrás.
1.2 Creación del mini-z/OS
Para crear el mini-SO, debemos apoyarnos en un z/OS en funcionamiento, ya que se copiarán las librerías necesarias de este sistema para generar el nuestro. Por tanto, dispondremos de una partición con z/OS V1R4 y necesitaremos un usuario con los permisos adecuados para poder copiar librerías del sistema y crear catálogos y demás.
1.2.1 Inicialización de un Volumen 3390 para nuestro mini-SO
El sistema que queremos crear ocupará el 40% de un volumen 3390-3, por lo que, de ser necesario, se podría instalar también en un 3390-2 sin problemas. La razón de su poca ocupación es que vamos a grabar lo imprescindible, tal y como he explicado más arriba. Para ello, una vez elegido un volumen libre en la instalación, el cual previamente se ha puesto off-line, submitiremos el siguiente JCL:
//PASO001 JOB GODDESS,URD,CLASS=A,MSGCLASS=A,NOTIFY=&SYSUID,
// MSGLEVEL=(1,1),REGION=0M
//INIT1 EXEC PGM=ICKDSF
//SYSPRINT DD SYSOUT=*
//IPLTEXT DD DSN=SYS1.SAMPLIB(IEAIPL00),DISP=SHR
//SYSIN DD *
INIT UNIT(1010) IPLDD(IPLTEXT) NOVERIFY VOLID(RESCUE) -
VTOC(1,0,60) INDEX(0,1,14) NOCONTINUE PURGE NOCHECK
Siendo 1010 la dirección física del disco y RESCUE, el VOLSER. Si se desea que tenga otra nomenclatura, se deberá tener en cuenta para los sucesivos JCLs en los que se hace una constante referencia al campo VOL=SER en las copias de librerías del sistema. Comentar también la ficha IPLTEXT que hace que cuando se inicialice el disco, grabará el texto IPL en él, por lo que lo convertiremos en un disco ipl-able.
Si el JCL acaba con Cond. Code 00, pondremos on-line el disco con un VARY 1010,ONLINE desde la consola. Si no acaba en 00, es que el disco no se ha puesto off-line previamente. Cuidado con esto.
1.2.2 Reserva de espacio para nuestro mini-JES2,LOGREC, etc.
En este paso, reservaremos espacio para los datasets PARMLIB, HASPACE, LOGREC, HASPCKT, PROCLIB y UADS, submitiendo el siguiente JCL:
//PASO002 JOB GODDESS,URD,CLASS=A,MSGCLASS=A,NOTIFY=&SYSUID, // MSGLEVEL=(1,1),REGION=0M //ALOCODS EXEC PGM=IEFBR14 //* //DD1 DD DISP=(NEW,KEEP),VOL=SER=RESCUE,UNIT=SYSALLDA, // SPACE=(CYL,(1,1,5)),DCB=(LRECL=80,BLKSIZE=9040,RECFM=FB), // DSN=MINI.PARMLIB //DD2 DD DISP=(NEW,KEEP),VOL=SER=RESCUE,UNIT=SYSALLDA, // DCB=DSORG=PSU,SPACE=(CYL,100),DSN=MINI.HASPACE //DD3 DD DISP=(NEW,KEEP),VOL=SER=RESCUE,UNIT=SYSALLDA, // DCB=SYS1.LOGREC,SPACE=(TRK,2),DSN=MINI.LOGREC //DD4 DD DISP=(NEW,KEEP),VOL=SER=RESCUE,UNIT=SYSALLDA, // SPACE=(CYL,5),DSN=MINI.HASPCKPT //DD5 DD DISP=(NEW,KEEP),VOL=SER=RESCUE,UNIT=SYSALLDA, // SPACE=(CYL,(1,1,2)),DCB=(LRECL=80,BLKSIZE=9040,RECFM=FB), // DSN=MINI.PROCLIB //DD6 DD DISP=(NEW,KEEP),VOL=SER=RESCUE,UNIT=SYSALLDA, // SPACE=(CYL,(1,1,2)),DCB=SYS1.UADS,DSN=MINI.UADS
Los reservaremos con el HLQ MINI para no interferir con los datasets SYS1 de nuestra instalación real y en funcionamiento. Esto hará que reservemos espacio para los spooles del JES2, el acceso de usuarios al sistema y los datasets de configuración y arranque.
1.2.3 Renombrado de los nuevos datasets
En este paso, renombraremos los datasets creados en el punto 1.2.2, con su nombre final, submitiendo el siguiente JCL:
//PASO003 JOB GODDESS,URD,CLASS=A,MSGCLASS=A,NOTIFY=&SYSUID, // MSGLEVEL=(1,1),REGION=0M //RENOMBR EXEC PGM=IEHPROGM //DD1 DD DISP=SHR,UNIT=SYSALLDA,VOL=SER=RESCUE //SYSPRINT DD SYSOUT=* //SYSIN DD * RENAME DSNAME=MINI.PARMLIB,VOL=SYSALLDA=RESCUE,NEWNAME=SYS1.PARMLIB RENAME DSNAME=MINI.HASPACE,VOL=SYSALLDA=RESCUE,NEWNAME=SYS1.HASPACE RENAME DSNAME=MINI.LOGREC,VOL=SYSALLDA=RESCUE,NEWNAME=SYS1.LOGREC RENAME DSNAME=MINI.HASPCKPT,VOL=SYSALLDA=RESCUE,NEWNAME=SYS1.HASPCKPT RENAME DSNAME=MINI.PROCLIB,VOL=SYSALLDA=RESCUE,NEWNAME=SYS1.PROCLIB RENAME DSNAME=MINI.UADS,VOL=SYSALLDA=RESCUE,NEWNAME=SYS1.UADS
Como hacemos referencia siempre al volumen RESCUE, no tenemos peligro de que se interfieran con los actuales datasets de la máquina en producción.
1.2.4 Definición del MASTER CATALOG de nuestro mini – Sistema
En este paso, definiremos el que será el catálogo maestro de nuestro nuevo mini-sistema. Para ello, este JCL nos viene al pelo:
//PASO004 JOB GODDESS,URD,CLASS=A,MSGCLASS=A,NOTIFY=&SYSUID, // MSGLEVEL=(1,1),REGION=0M //DEFMCAT4 EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //CATVOL DD VOL=SER=RESCUE,UNIT=SYSALLDA,DISP=OLD //SYSIN DD * DELETE CATALOG.MINIMVS.RESCUE UCAT RECOVERY SET MAXCC = 0 DEFINE UCAT (ICFCAT - NAME(CATALOG.MINIMVS.RESCUE) - FILE(CATVOL) VOL(RESCUE) CYL(1 1) SHR(3 3))
Este paso creará un catálogo de usuario llamado CATALOG.MINIMVS.RESCUE. Se puede poner cualquier nombre, pero el cambio de este nombre deberá ser reflejado en los sucesivos JCLs a los que se le hará referencia.
También hemos añadido un DELETE UCAT, antes de la creación del catálogo, por si ese catálogo existiera, pero vamos, es una manera de controlar que el JCL no acabe con errores por si nuestra máquina tuviera referencia a él.
Comentar además que cuando se crea el catálogo de usuario, se conecta automáticamente a nuestro master catalog de nuestro SO, de modo que tendremos que tenerlo en cuenta para desconectarlo después y no dejar rastros que puedan dar problemas en nuestro sistema en producción.
1.2.5 Copia de las librerías mínimas de z/OS y productos relacionados
En este paso, copiaremos las librerías mínimas para poder arrancar un z/OS sin grandes aspiraciones:
//PASO005 JOB GODDESS,URD,CLASS=A,MSGCLASS=A,NOTIFY=&SYSUID,
// MSGLEVEL=(1,1),REGION=0M
//COPIA EXEC PGM=ADRDSSU
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
COPY DS(INC(SYS1.LINKLIB,SYS1.LPALIB,SYS1.SVCLIB,SYS1.CMDLIB, -
SYS1.NUCLEUS,SYS1.CSSLIB,SYS1.MIGLIB, -
SYS1.VTAMLIB,SYS1.SISTCLIB,CPAC.VTAMLST, -
SYS1.SHASLINK,SYS1.BRODCAST,CPAC.VTAMLIB, -
ISP.SISPEXEC,ISP.SISPLOAD, -
ISP.SISPMENU,ISP.SISPPENU, -
ISP.SISPSENU,ISP.SISPTENU, -
ISP.SISPSLIB,ISP.SISPCLIB, -
ISP.SISPLPA, -
SYS1.DAE,SYS1.HELP,SYS1.IMAGELIB,SYS1.CSSLIB, -
SYS1.MACLIB,SYS1.MODGEN,SYS1.SHASMIG, -
SYS1.SAMPLIB,CEE.SCEERUN, -
SYS1.SCBDCLST,SYS1.SCBDPENU,SYS1.SCBDMENU, -
SYS1.SCBDTENU,SYS1.SCBDHENU,SYS1.SDWWDLPA, -
ISF.SISFEXEC, -
ISF.SISFLINK,ISF.SISFLOAD,ISF.SISFLPA, -
ISF.SISFMLIB,ISF.SISFPLIB,ISF.SISFSLIB, -
ISF.SISFTLIB,ISF.SISFHELP, -
ISF.HASPINDX)) -
ODY(RESCUE) TOL(ENQF) WAIT(0,0) SHR BYPASSACS(**)
Este JCL copia los siguientes datasets:
- SYS1: Los mínimos para arrancar el z/OS.
- ISP: Las librerías ISPF obligatorias para que funcione.
- ISF: Las librerías SDSF obligatorias para que funcione.
También hemos copiado un par de librerias CPAC relacionadas con el VTAM. Esto lo he hecho así, porque en nuestra máquina de producción, el VTAM que viene por defecto cuando se instaló la máquina (CPAC: CustomPAC) es un VTAM no-SNA y no depende ni de TCP/IP, ni de definiciones adicionales de otros productos, por lo que debería arrancar sin error alguno en un terminal no-SNA directo por una 3174, una 2074 o una emulación OSA-ICC. Se debería comprobar este hecho en vuestra instalación y hacer los cambios oportunos si llegara el caso. Este paso es crucial, ya que aunque todo arranque perfectamente, sin un VTAM bien configurado, todo el esfuerzo no sirve absolutamente para nada.
1.2.6 Definición de PAGESPACES
En este paso, definiremos los ficheros de paginación necesarios e imprescindibles para que arranque nuestro SO: El PLPA, el COMON y el LOCAL, aunque este último es opcional siempre y cuando tengamos mas de 512 MB de memoria, aunque, como tenemos disco de sobra, lo definimos también y nos curamos en salud:
//PASO006 JOB GODDESS,URD,CLASS=A,MSGCLASS=A,NOTIFY=&SYSUID,
// MSGLEVEL=(1,1),REGION=0M
//DEFPGSPC EXEC PGM=IDCAMS
//STEPCAT DD DISP=SHR,DSN=CATALOG.MINIMVS.RESCUE
//SYSPRINT DD SYSOUT=*
//DD1 DD VOL=SER=RESCUE,UNIT=SYSALLDA,DISP=OLD
//SYSIN DD *
DELETE (SYS1.PAGE.VRESCUE.PLPA)
DELETE (SYS1.PAGE.VRESCUE.COMMON)
DELETE (SYS1.PAGE.VRESCUE.LOCAL)
SET MAXCC = 0
DEF PGSPC (NAME(SYS1.PAGE.VRESCUE.PLPA) -
VOL(RESCUE) FILE(DD1) TRK(1000) UNIQUE ) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF PGSPC (NAME(SYS1.PAGE.VRESCUE.COMMON) -
VOL(RESCUE) FILE(DD1) CYL(50) UNIQUE ) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF PGSPC (NAME(SYS1.PAGE.VRESCUE.LOCAL) -
VOL(RESCUE) FILE(DD1) CYL(50) UNIQUE ) -
CAT(CATALOG.MINIMVS.RESCUE)
Los ficheros los catalogaremos en nuestro catalogo recién creado en el punto 1.2.4.
1.2.7 Catalogando librerías del Sistema
Ya que hemos catalogado los ficheros de paginación, no está de más catalogar el resto de ficheros y datasets que hemos copiado en el punto 1.2.5, además de los ficheros que hemos definido al principio. Así que este JCL nos ayudará a realizarlo sin errores, ejecutando un IDCAMS, definiendo datasets Non-VSAM y relacionándolos con el catálogo adecuado:
//PASO007 JOB GODDESS,URD,CLASS=A,MSGCLASS=A,NOTIFY=&SYSUID,
// MSGLEVEL=(1,1),REGION=0M
//DEFNVSAM EXEC PGM=IDCAMS
//STEPCAT DD DISP=SHR,DSN=CATALOG.MINIMVS.RESCUE
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
DEF NVSAM(NAME(SYS1.RACFMINI) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME(SYS1.LINKLIB) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME(SYS1.LPALIB) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME(SYS1.CSSLIB) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME(SYS1.SVCLIB) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME(SYS1.CMDLIB) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME(SYS1.MIGLIB) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME(SYS1.NUCLEUS) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME(SYS1.PARMLIB) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME(SYS1.PROCLIB) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME(SYS1.UADS) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME(SYS1.BRODCAST) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME(SYS1.VTAMLIB) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME(SYS1.SISTCLIB) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME(CPAC.VTAMLST) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME(CPAC.VTAMLIB) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME( SYS1.SHASLINK ) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME( ISP.SISPLPA ) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME( ISP.SISPLOAD ) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME( ISP.SISPPENU ) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME( ISP.SISPSLIB ) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME( ISP.SISPMENU ) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME( ISP.SISPTENU ) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME( ISP.SISPSENU ) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME( ISP.SISPCLIB ) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME( ISP.SISPEXEC ) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME( SYS1.DAE ) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME( SYS1.HELP ) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME( SYS1.IMAGELIB ) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME( SYS1.MACLIB ) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME( SYS1.MODGEN ) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME( SYS1.SHASMIG ) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME( SYS1.SAMPLIB ) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME( CEE.SCEERUN ) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME( SYS1.SCBDCLST ) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME( SYS1.SCBDPENU ) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME( SYS1.SCBDMENU ) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME( SYS1.SCBDTENU ) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME( SYS1.SCBDHENU ) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME( SYS1.SDWWDLPA ) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME( ISF.SISFEXEC ) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME( ISF.SISFLINK ) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME( ISF.SISFLOAD ) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME( ISF.SISFLPA ) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME( ISF.SISFMLIB ) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME( ISF.SISFPLIB ) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME( ISF.SISFSLIB ) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME( ISF.SISFTLIB ) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME( ISF.HASPINDX ) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
DEF NVSAM(NAME( ISF.SISFHELP ) DEVT(3390) VOL(RESCUE)) -
CAT(CATALOG.MINIMVS.RESCUE)
1.2.8 Creación de miembros en la SYS1.PARMLIB
Con este JCL, crearemos los miembros imprescindibles en la SYS1.PARMLIB para que nuestra máquina arranque sin errores. El resto de miembros que no creamos, los tomará como por defecto el z/OS cuando arranque. Así pues, para crear múltiples miembros dentro de la PARMLIB, utilizaremos el truco ADD de la utility IEBUPDTE:
//PASO008 JOB GODDESS,URD,CLASS=A,MSGCLASS=A,NOTIFY=&SYSUID,
// MSGLEVEL=(1,1),REGION=0M
//PARMLIB EXEC PGM=IEBUPDTE,PARM=NEW
//SYSPRINT DD SYSOUT=*
//SYSUT2 DD DISP=SHR,DSN=SYS1.PARMLIB,UNIT=SYSALLDA,VOL=SER=RESCUE
//SYSIN DD DATA,DLM=$$
./ ADD NAME=IEASYS00
CLPA, CLPA O CVIO
CMB=(UNITR,COMM,GRAPH,CHRDR), ADDITIONAL CMB ENTRIES
CMD=00,
CON=00, SELECT CONSOL00
CSA=(2000,30000),
GRS=NONE, NO COORDINATION OF GRS REQUESTS
PROG=00,
PROD=00,
LNKAUTH=LNKLST, MVS/XA 2.1.1 DEFAULT, APFTAB IS ALT
LOGCLS=L, WILL NOT BE PRINTED BY DEFAULT
LOGLMT=999999, MUST BE 6 DIGITS, MAX WTL MESSAGES QUEUED
LPA=00,
MAXUSER=250, (SYS TASKS + INITS + TSOUSERS)
PAGTOTL=16, ALLOW ADDITION UP TO 16 PAGE DATA SETS
OPI=YES, ALLOW OPERATOR OVERRIDE TO IEASYS00
PAGE=(SYS1.PAGE.VRESCUE.PLPA,
SYS1.PAGE.VRESCUE.COMMON,
SYS1.PAGE.VRESCUE.LOCAL,L),
REAL=128, ALLOWS 2 64K JOBS OR 1 128K JOB TO RUN V=R
RSU=0, NO RECONFIG STORAGE UNITS DEFAULT
RSVSTRT=5, RESERVED ASVT ENTRIES DEFAULT
RSVNONR=5, RESERVED ASVT ENTRIES DEFAULT
SSN=00,
VAL=00,
SYSNAME=MINI,
VIODSN=IGNORE,
VRREGN=64 DEFAULT REAL-STORAGE REGION SIZE DEFAULT
./ ADD NAME=IFAPRD00
WHEN (HWNAME(*))
PRODUCT OWNER('IBM CORP')
NAME(Z/OS)
ID(5694-A01)
VERSION(*) RELEASE(*) MOD(*)
FEATURENAME(Z/OS)
STATE(ENABLED)
PRODUCT OWNER('IBM CORP')
NAME(Z/OS)
ID(5694-A01)
VERSION(*) RELEASE(*) MOD(*)
FEATURENAME(DFSMSDSS)
STATE(ENABLED)
PRODUCT OWNER('IBM CORP')
NAME(Z/OS)
ID(5694-A01)
VERSION(*) RELEASE(*) MOD(*)
FEATURENAME('SECURITY SERVER')
STATE(ENABLED)
PRODUCT OWNER('IBM CORP')
NAME(Z/OS)
ID(5694-A01)
FEATURENAME(SDSF)
VERSION(*) RELEASE(*) MOD(*)
STATE(ENABLED)
./ ADD NAME=PROG00
APF FORMAT(DYNAMIC)
APF ADD DSNAME(SYS1.LINKLIB) VOLUME(RESCUE)
APF ADD DSNAME(SYS1.SHASLINK) VOLUME(RESCUE)
APF ADD DSNAME(SYS1.VTAMLIB) VOLUME(RESCUE)
APF ADD DSNAME(CPAC.VTAMLIB) VOLUME(RESCUE)
APF ADD DSNAME(SYS1.SISTCLIB) VOLUME(RESCUE)
APF ADD DSNAME(ISP.SISPLOAD) VOLUME(RESCUE)
LNKLST DEFINE NAME(LNKLST00)
LNKLST ADD NAME(LNKLST00) DSN(SYS1.LINKLIB)
LNKLST ADD NAME(LNKLST00) DSN(SYS1.MIGLIB)
LNKLST ADD NAME(LNKLST00) DSN(SYS1.CSSLIB)
LNKLST ADD NAME(LNKLST00) DSN(SYS1.CMDLIB)
LNKLST ADD NAME(LNKLST00) DSN(ISF.SISFLOAD)
LNKLST ADD NAME(LNKLST00) DSN(ISF.SISFLINK)
LNKLST ACTIVATE NAME(LNKLST00)
./ ADD NAME=LOAD00
IODF 00 SYS1
NUCLEUS 1
SYSCAT RESCUE113CCATALOG.MINIMVS.RESCUE
SYSPARM 00
./ ADD NAME=VATLST00
VATDEF IPLUSE(PRIVATE) SYSUSE(PRIVATE)
RESCUE,1,0,3390 ,N STORAGE ** STORAGE FOR IBMUSER TO LOG ON
./ ADD NAME=IEFSSN00
JES2,,,PRIMARY,NOSTART
./ ADD NAME=IGDDFPKG
DFSMS_OFFERING=(MINI,FULL)
./ ADD NAME=COMMND00
COM='D T'
COM='S JES2,PARM='COLD,NOREQ''
COM='S VTAM,,,(LIST=00) START VTAM FOR LOCAL TERMINALS'
COM='S TSO AUTOMATIC START OF TSO'
./ ADD NAME=JES2PARM
CONDEF AUTOCMD=52,BUFNUM=300,BUFWARN=80,CONCHAR=$,
MASMSG=200,RDRCHAR=$
SMFDEF BUFNUM=10,BUFWARN=80
CKPTDEF CKPT1=(DSN=SYS1.HASPCKPT,VOL=RESCUE,INUSE=YES)
SPOOLDEF BUFSIZE=3992,DSNAME=SYS1.HASPACE,FENCE=NO,
SPOOLNUM=32,TGBPERVL=10,TGNUM=32576,TGSIZE=30,
TGWARN=90,TRKCELL=3,VOLUME=RESCU
INITDEF PARTNUM=5
I1 START,NAME=A,CLASS=X
I2 START,NAME=B,CLASS=X
I3 START,NAME=C,CLASS=X
I4 START,NAME=D,CLASS=X
I5 START,NAME=E,CLASS=X
INTRDR CLASS=B,RDINUM=25
JOBDEF ACCTFLD=IGNORE,JCLERR=NO,JOBNUM=3000,JOBWARN=80,
PRTYHIGH=10,PRTYJECL=NO,PRTYJOB=NO,PRTYLOW=1,
PRTYRATE=0,RANGE=(1-9999)
JOBCLASS(A-Y) ACCT=NO,PGMRNAME=NO,TIME=(60,0),REGION=8M,
COMMAND=DISPLAY,BLP=YES,AUTH=ALL,MSGLEVEL=(1,1),
JOURNAL=NO
STCCLASS TIME=(60,00),REGION=8M,COMMAND=DISPLAY,BLP=YES,
AUTH=ALL,MSGLEVEL=(1,1),IEFUJP=YES,IEFUSO=YES,
LOG=NO,OUTPUT=YES,PERFORM=0,PROCLIB=00,
TYPE6=YES,TYPE26=YES,MSGCLASS=Z
TSUCLASS TIME=(60,00),REGION=8M,COMMAND=DISPLAY,BLP=YES,
AUTH=ALL,MSGLEVEL=(1,1),IEFUJP=YES,IEFUSO=YES,
LOG=NO,OUTPUT=YES,PERFORM=0,PROCLIB=00,
TYPE6=YES,TYPE26=YES,MSGCLASS=Z
OUTDEF COPIES=30,DMNDSET=NO,JOENUM=3000,JOEWARN=80,
PRTYHIGH=0,PRTYLOW=0,PRTYOUT=NO,STDFORM=STD,USERSET=NO
OUTCLASS(X) OUTDISP=(HOLD),OUTPUT=PRINT,TRKCELL=YES
./ ADD NAME=TSOKEY00
USERMAX=100, +
RECONLIM=10, +
BUFRSIZE=132, +
HIBFREXT=6600, +
LOBFREXT=3300, +
CHNLEN=4, +
SCRSIZE=1920
./ ADD NAME=SMFPRM00
NOACTIVE /*NO ACTIVE SMF RECORDING*/
NOPROMPT /*DO NOT PROMPT OPERATOR FOR OPTIONS*/
./ ADD NAME=COUPLE00
COUPLE SYSPLEX(LOCAL)
./ ADD NAME=CONSOL00
INIT PFK(00) MONITOR(DSNAME) MLIM(1500) RLIM(10) UEXIT(N)
CMDDELIM(;)
DEFAULT ROUTCODE(ALL)
CONSOLE DEVNUM(700) ROUTCODE(ALL)
PFKTAB(PFKTAB1)
AUTH(MASTER)
UNIT(3270-X)
MONITOR(JOBNAMES-T)
CON(N) SEG(9) DEL(RD) RNUM(19) RTME(1) MFORM(J,T) AREA(NONE)
./ ADD NAME=DIAG00
VSM TRACK CSA(ON) SQA(ON)
VSM TRACE GETFREE(OFF)
./ ADD NAME=IEAPAK00
(IEFBR14)
./ ADD NAME=IEAABD00
SDATA=(LSQA,CB,ENQ,TRT,ERR,DM,IO,SUM),PDATA=(PSW,REGS,SPLS,ALLPA,SA)
./ ADD NAME=IEAAPP00
/* IBMUSER DEFAULTS */
./ ADD NAME=IEADMP00
SDATA=SUM
./ ADD NAME=IEADMR00
SDATA=(NUC,SQA,LSQA,SWA,TRT,RGN,SUM)
./ ADD NAME=CLOCK00
OPERATOR NOPROMPT
TIMEZONE W.00.00.00
ETRMODE NO
ETRZONE NO
ETRDELTA 10
./ ADD NAME=CTIXCF00
TRACEOPTS ON
BUFSIZE(1008K)
./ ADD NAME=CTIXES00
TRACEOPTS ON
OPTIONS('CONNECT,CONFIG,RECOVERY')
BUFSIZE(168K)
./ ADD NAME=CTIGRS00
TRACEOPTS OFF
./ ADD NAME=IGDSMS00
SMS ACDS(SYS1.ACDS)
COMMDS(SYS1.SMS.COMMDS)
INTERVAL(15)
DINTERVAL(150)
REVERIFY(NO)
ACSDEFAULTS(NO)
TRACE(ON)
SIZE(128K)
TYPE(ALL)
JOBNAME(*)
ASID(*)
SELECT(ALL)
./ ADD NAME=LPALST00
SYS1.LPALIB,
ISF.SISFLPA,
SYS1.SDWWDLPA,
./ ADD NAME=CTIOPS00
TRACEOPTS
ON
BUFSIZE(64K)
./ ADD NAME=IEACMD00
COM='CHNGDUMP SET,SDUMP=(LSQA,TRT,XESDATA),ADD'
COM='SET SLIP=00'
COM='SET DAE=00'
COM='START LLA,SUB=MSTR'
COM='START VLF,SUB=MSTR'
./ ADD NAME=CTIIEFAL
/*---------------------------------------------------------------- */
/*DEFAULT CTIIEFAL MEMBER */
/*================================================================ */
TRACEOPTS
/*---------------------------------------------------------------- */
/* ON OR OFF: PICK ONE */
/*---------------------------------------------------------------- */
ON
OPTIONS(
'FLOW0'
,'FLOW1'
,'SERIAL1'
,'DATA'
,'CONTROL0'
,'CONTROL1'
)
/*---------------------------------------------------------------- */
/* BUFSIZE */
/*---------------------------------------------------------------- */
BUFSIZE(4M)
./ ADD NAME=CTIJES01
/*---------------------------------------------------------------- */
/*DEFAULT CTIJES01 MEMBER */
/*================================================================ */
TRACEOPTS
OFF
./ ADD NAME=CTIJES02
/*---------------------------------------------------------------- */
/*DEFAULT CTIJES02 MEMBER */
/*================================================================ */
TRACEOPTS
OFF
./ ADD NAME=CTIJES03
/*---------------------------------------------------------------- */
/*DEFAULT CTIJES03 MEMBER */
/*================================================================ */
TRACEOPTS
ON
./ ADD NAME=CTIJES04
/*---------------------------------------------------------------- */
/*DEFAULT CTIJES04 MEMBER */
/*================================================================ */
TRACEOPTS
OFF
./ ADD NAME=CTISMS00
TRACEOPTS OFF
./ ADD NAME=IKJTSO00
/* LIB: CPAC.PARMLIB(IKJTSO00) */
/* DOC: THIS MEMBER IS USED AT IPL TIME TO DEFINE THE AUTHORIZED */
/* COMMAND LIST, THE AUTHORIZED PROGRAM LIST, THE NOT */
/* BACKGROUND COMMAND LIST, THE AUTHORIZED BY THE TSO SERVICE */
/* FACILITY LIST, AND TO CREATE THE DEFAULTS THE SEND COMMAND */
/* WILL USE. */
/* */
AUTHCMD NAMES( /* AUTHORIZED COMMANDS */ +
AD ADDSD /* RACF COMMANDS */ +
AG ADDGROUP /* */ +
AU ADDUSER /* */ +
ALG ALTGROUP /* */ +
ALD ALTDSD /* */ +
ALU ALTUSER /* */ +
RMM /* RMM */ +
BLKUPD /* */ +
CO CONNECT /* */ +
DD DELDSD /* */ +
DG DELGROUP /* */ +
DU DELUSER /* */ +
LD LISTDSD /* */ +
LG LISTGRP /* */ +
LU LISTUSER /* */ +
RACDCERT /* */ +
RALT RALTER /* */ +
RACLINK /* */ +
RDEF RDEFINE /* */ +
RDEL RDELETE /* */ +
RE REMOVE /* */ +
RL RLIST /* */ +
RVARY /* */ +
PASSWORD PW /* */ +
PE PERMIT /* */ +
SETR SETROPTS /* */ +
SR SEARCH /* */ +
IRRDPI00 /* */ +
DITTO /* DITTO */ +
DITTOA /* DITTO */ +
DITTOU /* DITTO */ +
IEBCOPY /* */ +
BINDDATA BDATA /* DMSMS COMMANDS */ +
LISTDATA LDATA /* */ +
SETCACHE SETC /* */ +
RECEIVE /* TSO COMMANDS */ +
CONSPROF /* */ +
TRANSMIT XMIT /* */ +
LISTB LISTBC /* */ +
SE SEND /* */ +
RACONVRT CONSPROF /* */ +
SYNC /* */ +
LISTD LISTDS /* */ +
TESTAUTH TESTA /* */ +
PARMLIB IKJPRMLB /* */ +
NETSTAT /* IP COMMANDS */ +
PING LPR /* COM SERV IP */ +
TRACERTE /* IP COMMANDS */ +
MVPXDISP /* IP COMMAND */)
/* */
AUTHPGM NAMES( /* AUTHORIZED PROGRAMS */ +
ICHUT100 /* */ +
ICHUT200 /* */ +
EDGHSKP /* RMM */ +
EDGUTIL /* RMM */ +
EDGRPTD /* RMM */ +
EDGAUD /* RMM */ +
ICHUT400 /* */ +
ICHDSM00 /* */ +
IRRDSC00 /* */ +
IRRUT100 /* */ +
IRRUT200 /* */ +
IRRUT400 /* */ +
IRRDPI00 /* */ +
CSFDAUTH /* ICSF COMMAND */ +
ICADCT /* FIREWALL */ +
ICADDCT /* FIREWALL */ +
ICADCFGS /* FIREWALL */ +
ICADPFTP /* FIREWALL */ +
ICADFTPD /* FIREWALL */ +
ICADSLOG /* FIREWALL */ +
ICADSOCK /* FIREWALL */ +
ICADSOXD /* FIREWALL */ +
ICADSTAK /* FIREWALL */ +
ICADIKED /* FIREWALL */ +
IEBCOPY /* */ +
IOEGRWAG /* DFS */ +
IOENEWAG /* DFS */ +
IOESALVG /* DFS */ +
IOEBAK /* DFS */ +
IOEBOS /* DFS */ +
IOECM /* DFS */ +
IOEDCEER /* DFS */ +
IOEDFSXP /* DFS */ +
IOEFTS /* DFS */ +
IOEMAPID /* DFS */ +
IOESCOUT /* DFS */ +
IOEUDBG /* DFS */)
/* */
NOTBKGND NAMES( /* COMMANDS WHICH MAY NOT BE */ +
/* ISSUED IN THE BACKGROUND */ +
OPER OPERATOR /* */ +
TERM TERMINAL /* */)
/* */
AUTHTSF NAMES( /* PROGRAMS TO BE AUTHORIZED */ +
/* WHEN CALLED THROUGH THE */ +
/* TSO SERVICE FACILITY. */ +
CSFDAUTH /* ICSF */ +
IEBCOPY /* */ +
ICQASLI0 /* */ +
EDGHSKP /* RMM */ +
EDGUTIL /* RMM */ +
EDGRPTD /* RMM */ +
EDGAUD /* RMM */ +
IKJEFF76 /* */)
/* */
SEND /* SEND COMMAND DEFAULTS */ +
OPERSEND(ON) /* */ +
USERSEND(ON) /* */ +
SAVE(ON) /* */ +
CHKBROD(OFF) /* */ +
LOGNAME(SYS1.BRODCAST) /* */
ALLOCATE /* ALLOCATE COMMAND DEFAULT */ +
DEFAULT(OLD) /* */
TRANSREC /* */ +
NODESMF((NODENAME,SMF)) /* */ +
CIPHER(YES) /* */ +
SPOOLCL(B) /* */ +
OUTWARN(50000,15000) /* */ +
OUTLIM(5000000) /* */ +
VIO(SYSALLDA) /* */ +
LOGSEL(LOG) /* */ +
LOGNAME(MISC) /* */ +
DAPREFIX(TUPREFIX) /* */ +
USRCTL(NAMES.TEXT) /* */ +
SYSOUT(*) /* */
./ ADD NAME=IVTPRM00
FIXED MAX(120M)
ECSA MAX(120M)
./ ADD NAME=PFKTAB00
PFKTAB TABLE(PFKTAB1)
PFK(01) CMD('D U,DASD,,000,999')
PFK(02) CMD('D U,,,660,32')
PFK(03) CMD('K')
PFK(04) CMD('K A,10')
PFK(05) CMD('D A,ALL')
PFK(06) CMD('D R,L')
PFK(07) CMD('D PFK,L=A')
PFK(08) CMD('K D,F')
PFK(09) CMD('D TS,L')
PFK(10) CMD('D A,L')
PFK(11) CMD('D J,L')
PFK(12) CMD('K E,D')
PFK(13) KEY(1)
PFK(14) KEY(2)
PFK(15) KEY(3)
PFK(16) KEY(4)
PFK(17) KEY(5)
PFK(18) KEY(6)
PFK(19) KEY(7)
PFK(20) KEY(8)
PFK(21) KEY(9)
PFK(22) KEY(10)
PFK(23) KEY(11)
PFK(24) KEY(12)
PFKTAB TABLE(JES2CMDS)
PFK(1) CMD('$DA')
PFK(2) CMD('$DI')
PFK(3) CMD('$DQ')
PFK(4) CMD('$LJ_NNNN,ALL') CON(Y)
PFK(5) CMD('$DN,Q=HOLD')
PFK(6) CMD('$DN,Q=XEQ')
PFK(7) CMD('$TPRT_N,Q=NM') CON(Y)
PFK(8) CMD('$DSPOOL,ALL')
PFK(9) CMD('$DSPOOL,JOBS=2')
PFK(10) CMD('$HJ_NNNN;$EJ_NNNN')
PFK(11) CMD('$DU,PRT_N') CON(Y)
PFK(12) CMD('$D_CCCCDEF') CON(Y)
PFK(13) KEY(1)
PFK(14) KEY(2)
PFK(15) KEY(3)
PFK(16) KEY(4)
PFK(17) KEY(5)
PFK(18) KEY(6)
PFK(19) KEY(7)
PFK(20) KEY(8)
PFK(21) KEY(9)
PFK(22) KEY(10)
PFK(23) KEY(11)
PFK(24) KEY(12)
./ ADD NAME=IEASLP00
SLIP SET,C=013,ID=X013,A=NOSVCD,J=JES2,END
SLIP SET,C=028,ID=X028,A=NOSVCD,END
SLIP SET,C=052,ID=X052,A=NODUMP,J=CATALOG,END
SLIP SET,C=058,ID=X058,A=NODUMP,DATA=(15R,EQ,4,OR,15R,EQ,8,OR,
15R,EQ,C,OR,15R,EQ,10,OR,15R,EQ,2C,OR,15R,EQ,30,OR,
15R,EQ,3C),END
SLIP SET,C=066,ID=X066,A=NODUMP,J=CATALOG,END
SLIP SET,C=070,ID=X070,A=NODUMP,J=CATALOG,END
SLIP SET,C=073,ID=X073,A=NODUMP,J=CATALOG,END
SLIP SET,C=0DX,ID=X0DX,A=NODUMP,J=CATALOG,END
SLIP SET,C=0E7,ID=X0E7,A=NOSVCD,END
SLIP SET,C=0F3,ID=X0F3,A=NODUMP,END
SLIP SET,C=13E,ID=X13E,A=NODUMP,END
SLIP SET,C=1C5,RE=00090004,ID=X1C5,A=NODUMP,END
SLIP SET,C=222,ID=X222,A=NODUMP,END
SLIP SET,C=322,ID=X322,A=NODUMP,END
SLIP SET,C=33E,ID=X33E,A=NODUMP,END
SLIP SET,C=3C4,REASON=1A,ID=S3C4,A=SVCD,END
SLIP SET,C=422,ID=X422,A=NODUMP,END
SLIP SET,C=47B,DATA=(15R,EQ,0,OR,15R,EQ,8),ID=X47B,A=NODUMP,END
SLIP SET,C=622,ID=X622,A=NODUMP,END
SLIP SET,C=71A,ID=X71A,A=NODUMP,END
SLIP SET,C=804,ID=X804,A=(NOSVCD,NOSYSU),END
SLIP SET,C=806,ID=X806,A=(NOSVCD,NOSYSU),END
SLIP SET,C=80A,ID=X80A,A=(NOSVCD,NOSYSU),END
SLIP SET,C=81A,ID=X81A,A=NODUMP,END
SLIP SET,C=91A,ID=X91A,A=NODUMP,END
SLIP SET,C=9FB,ID=X9FB,A=NOSVCD,J=JES3,END
SLIP SET,C=B37,ID=XB37,A=(NOSVCD,NOSYSU),END
SLIP SET,C=C1A,ID=XC1A,A=NODUMP,END
SLIP SET,C=D1A,ID=XD1A,A=NODUMP,END
SLIP SET,C=D37,ID=XD37,A=(NOSVCD,NOSYSU),END
SLIP SET,C=E37,ID=XE37,A=(NOSVCD,NOSYSU),END
SLIP SET,C=EC6,RE=0000FFXX,ID=XEC6,A=NODUMP,END
SLIP SET,C=EC6,RE=0000FDXX,ID=XXC6,A=NOSVCD,END
./ ADD NAME=ADYSET00
DAE=START,RECORDS(400),
SVCDUMP(MATCH,SUPPRESSALL,UPDATE,NOTIFY(3,30)),
SYSMDUMP(MATCH,UPDATE)
./ ADD NAME=COFVLF00
CLASS NAME(CSVLLA) /* CLASS NAME FOR LIBRARY LOOKASIDE @P2C*/
EMAJ(LLA) /* MAJOR NAME FOR LIBRARY LOOKASIDE @P2C*/
./ ENDUP
$$
Largo, eh?? Esto creará todos los miembros en su interior.
1.2.9 Creación de miembros en la SYS1.PROCLIB
Con este JCL, crearemos los miembros imprescindibles en la SYS1.PROCLIB para que nuestra máquina arranque con los mínimos procedimientos: El TSO, el JES2, el VTAM y el IKJS para el procedimiento que usará el usuario IBMUSER cuando haga logon:
//PASO009 JOB GODDESS,URD,CLASS=A,MSGCLASS=A,NOTIFY=&SYSUID, // MSGLEVEL=(1,1),REGION=0M //PROCLIB EXEC PGM=IEBUPDTE,PARM=NEW //SYSPRINT DD SYSOUT=* //SYSUT2 DD DISP=SHR,DSN=SYS1.PROCLIB,UNIT=SYSALLDA,VOL=SER=RESCUE //SYSIN DD DATA,DLM=$$ ./ ADD NAME=TSO //TSO PROC MBR=TSOKEY00 //STEP1 EXEC PGM=IKTCAS00,TIME=1440 //PARMLIB DD DSN=SYS1.PARMLIB(&MBR),DISP=SHR,FREE=CLOSE //PRINTOUT DD SYSOUT=*,FREE=CLOSE //* ./ ADD NAME=JES2 //JES2 PROC M=JES2PARM //IEFPROC EXEC PGM=HASJES20,TIME=1440,DPRTY=(15,15) //HASPLIST DD DDNAME=IEFRDER //HASPPARM DD DSN=SYS1.PARMLIB(&M),DISP=SHR //PROC00 DD DSN=SYS1.PROCLIB,DISP=SHR //STEPLIB DD DSN=SYS1.SHASLINK,DISP=SHR ./ ADD NAME=VTAM //VTMLCL PROC //VTMLCL EXEC PGM=ISTINM01,REGION=2048K, // DPRTY=(15,15),TIME=1440,PERFORM=8 //VTAMLST DD DSN=CPAC.VTAMLST,DISP=SHR //VTAMLIB DD DSN=SYS1.VTAMLIB,DISP=SHR // DD DSN=CPAC.VTAMLIB,DISP=SHR //SISTCLIB DD DSN=SYS1.SISTCLIB,DISP=SHR //SYSABEND DD SYSOUT=*,HOLD=YES ./ ADD NAME=IKJS //IKJACCNT PROC //IKJACCT EXEC PGM=IKJEFT01,DYNAMNBR=50,REGION=6000K,TIME=1440, // PARM=ISPF //STEPLIB DD DSN=ISP.SISPLOAD,DISP=SHR // DD DSN=ISP.SISPLPA,DISP=SHR //ISPLLIB DD DSN=ISP.SISPLOAD,DISP=SHR // DD DSN=ISP.SISPLPA,DISP=SHR //ISPPLIB DD DSN=ISP.SISPPENU,DISP=SHR // DD DSN=ISF.SISFPLIB,DISP=SHR //ISPSLIB DD DSN=ISP.SISPSLIB,DISP=SHR // DD DSN=ISP.SISPSENU,DISP=SHR // DD DSN=ISF.SISFSLIB,DISP=SHR //ISPMLIB DD DSN=ISP.SISPMENU,DISP=SHR // DD DSN=ISF.SISFMLIB,DISP=SHR //ISPTLIB DD DSN=ISP.SISPTENU,DISP=SHR // DD DSN=ISF.SISFTLIB,DISP=SHR //SYSHELP DD DSN=ISF.SISFHELP,DISP=SHR //SYSPROC DD DSN=ISP.SISPCLIB,DISP=SHR // DD DSN=ISF.SISFEXEC,DISP=SHR //SDSFMENU DD DSN=ISF.SISFPLIB,DISP=SHR //ISPPROF DD DISP=(NEW,DELETE),UNIT=SYSALLDA,VOL=SER=RESCUE, // SPACE=(TRK,(5,1,1)),DCB=(LRECL=80,BLKSIZE=6160,RECFM=FB) //ISPTABL DD DDNAME=ISPPROF //SYSPRINT DD TERM=TS,SYSOUT=* //SYSTERM DD TERM=TS,SYSOUT=* //SYSIN DD TERM=TS $$
1.2.10 Copia de algunos miembros puntuales de la PROCLIB y LPALIB
Después de probar en varias ocasiones, en tiempo de IPL se veía como el sistema reclamaba varios miembros que no habíamos copiado, y en tiempo del NIP, la LPALIB se quejaba por un módulo que no teníamos. Así que este JCL copia los miembros que nos hacen falta, aunque no son imprescindibles:
//PASO010 JOB GODDESS,URD,CLASS=A,MSGCLASS=A,NOTIFY=&SYSUID,
// MSGLEVEL=(1,1),REGION=0M
//COPIPROC EXEC PGM=IEBCOPY
//SYSUT3 DD UNIT=SYSALLDA,SPACE=(CYL,(1,1))
//SYSUT4 DD UNIT=SYSALLDA,SPACE=(CYL,(1,1))
//PROCIN DD DISP=SHR,DSN=SYS1.PROCLIB
//PROCOUT DD DISP=SHR,DSN=SYS1.PROCLIB,UNIT=SYSALLDA,VOL=SER=RESCUE
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
COPY I=PROCIN,O=PROCOUT
S M=LLA
S M=VLF
S M=DUMPSRV
S M=IEESYSAS
S M=IEEVMPCR
S M=INIT
/*
//COPILPA EXEC PGM=IEBCOPY
//SYSUT3 DD UNIT=SYSALLDA,SPACE=(CYL,(1,1))
//SYSUT4 DD UNIT=SYSALLDA,SPACE=(CYL,(1,1))
//LPAIN DD DISP=SHR,DSN=ADCD.ZOSV14S.LPALIB
//LPAOUT DD DISP=SHR,DSN=SYS1.LPALIB,UNIT=SYSALLDA,VOL=SER=RESCUE
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
COPY I=LPAIN,O=LPAOUT
S M=DFSMRCL0
/*
En mi caso, el z/OS de producción tenía un módulo fuera de la SYS1.LPALIB llamado DFSMRCL0 que estaba en ADCD.ZOS14S.LPALIB, así que lo he copiado también.
1.2.11 Preparación del RACF del mini-SO
Este JCL tiene dos pasos bien diferenciados: Por una parte, genera en ensamblador el código necesario para crear una base de datos RACF que se llamará SYS1.RACFMINI y le dará una serie de atributos y por otra, linkeditará lo ensamblado para preparar esa BD :
//PASO011 JOB GODDESS,URD,CLASS=A,MSGCLASS=A,NOTIFY=&SYSUID,
// MSGLEVEL=(1,1),REGION=0M
//RACF11A EXEC PGM=ASMA90,PARM='OBJECT,NODECK,ALIGN'
//SYSPRINT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//SYSUT1 DD UNIT=VIO,SPACE=(CYL,(4,3))
//SYSUT2 DD UNIT=VIO,SPACE=(CYL,(4,3))
//SYSUT3 DD UNIT=VIO,SPACE=(CYL,(4,3))
//SYSLIB DD DSN=SYS1.MACLIB,DISP=SHR
//SYSLIN DD DSN=&&OBJ,DISP=(,PASS),
// UNIT=VIO,SPACE=(CYL,(1,1))
//SYSIN DD *
ICHRDSNT CSECT
DC AL1(1) INDICATES ONE RACF DATA SET
DC CL44'SYS1.RACFMINI' PRIMARY RACF DS NAME
DC CL44' ' BACKUP RACF DS NAME
DC AL1(255) # RESIDENT INDEX AND DATA BLOCKS
DC X'81' UPDATES DUPLICATED ON BACKUP DS
END
//*
//RACF11B EXEC PGM=IEWL,PARM='XREF,LIST'
//SYSPRINT DD SYSOUT=*
//SYSUT1 DD UNIT=VIO,SPACE=(CYL,(1,1))
//SYSLIN DD DSN=*.RACF11A.SYSLIN,DISP=(OLD,DELETE)
// DD *
NAME ICHRDSNT(R)
//SYSLIB DD DSN=SYS1.LINKLIB,DISP=SHR,
// UNIT=SYSALLDA,VOL=SER=RESCUE
//SYSLMOD DD DSN=SYS1.LINKLIB,DISP=SHR,
// UNIT=SYSALLDA,VOL=SER=RESCUE
1.2.12 Creación del RACF del mini-SO
Con los datos del punto anterior, inicializaremos la base de datos de RACF con este JCL:
//PASO012 JOB GODDESS,URD,CLASS=A,MSGCLASS=A,NOTIFY=&SYSUID, // MSGLEVEL=(1,1),REGION=0M //RACF12 EXEC PGM=IRRMIN00,PARM='NEW' //SYSPRINT DD SYSOUT=* //SYSTEMP DD DSN=SYS1.MODGEN(IRRTEMP1),DISP=SHR //SYSRACF DD DSN=SYS1.RACFMINI,DISP=(NEW,KEEP,DELETE), // UNIT=SYSALLDA,VOL=SER=RESCUE, // SPACE=(TRK,(30),,CONTIG), // DCB=(RECFM=F,BLKSIZE=4096,DSORG=PSU)
Una vez inicializada, el único usuario que existe es IBMUSER con la password SYS1, password que la primera vez que se entra al TSO, pide cambiar.
1.2.13 Definición del Usuario IBMUSER en el SYS1.UADS
Para tener acceso al TSO, definiremos un usuario llamado IBMUSER, que debe coincidir con el IBMUSER del RACF. Por tanto, este JCL añadirá al SYS1.UADS la información necesaria para entrar la TSO:
//PASO013 JOB GODDESS,URD,CLASS=A,MSGCLASS=A,NOTIFY=&SYSUID, // MSGLEVEL=(1,1),REGION=0M //UADS14 EXEC PGM=IKJEFT01 //SYSTSIN DD * ACCOUNT A (IBMUSER S A IKJS) SIZE(4000) JCL OPER NOMOUNT ACCT UNIT(SYSALLDA) L (IBMUSER) END //SYSTSPRT DD SYSOUT=* //SYSUADS DD DISP=SHR,DSN=SYS1.UADS,UNIT=SYSALLDA,VOL=SER=RESCUE //SYSLBC DD DISP=SHR,DSN=SYS1.BRODCAST,UNIT=SYSALLDA,VOL=SER=RESCUE
1.2.14 Formateo del SYS1.LOGREC
Con este JCL, formatearemos el dataset SYS1.LOGREC para todo el tema de logs de la máquina:
//PASO014 JOB GODDESS,URD,CLASS=A,MSGCLASS=A,NOTIFY=&SYSUID, // MSGLEVEL=(1,1),REGION=0M //LOGREC14 EXEC PGM=IFCDIP00 //SERERDS DD DSN=SYS1.LOGREC,UNIT=SYSALLDA,DISP=SHR,VOL=SER=RESCUE //FRAMES DD DDNAME=IEFRDER
1.2.15 Copia del IODF
Este paso es muy importante, ya que de su ejecución dependerá el arranque de la máquina. Este JCL tiene dos pasos, por un lado hace un REPRO del fichero VSAM que contiene el IODF (en nuestro caso, el IODF activo es el SYS1.IODF00), y el paso siguiente realiza la definición del SYS1.IODF en nuestro volumen del mini-SO y luego, lo rellena con el REPRO del paso anterior:
//PASO015 JOB GODDESS,URD,CLASS=A,MSGCLASS=A,NOTIFY=&SYSUID,
// MSGLEVEL=(1,1),REGION=0M
//IODF15 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//IODFOLD DD DISP=SHR,DSN=SYS1.IODF00.CLUSTER
//OUT DD DSN=&&OUT,DISP=(NEW,PASS),SPACE=(CYL,(25,0)),
// UNIT=SYSALLDA,DSORG=PS,LRECL=4096,RECFM=F
//SYSIN DD *
REPRO INFILE(IODFOLD) OUTFILE(OUT)
//*-----------------------------------------------------------------*
//* IODF: CREAMOS EL IODF00 DESDE EL IODF00 ORIGINAL
//*-----------------------------------------------------------------*
//IODF15A EXEC PGM=IDCAMS
//STEPCAT DD DISP=SHR,DSN=CATALOG.MINIMVS.RESCUE
//SYSPRINT DD SYSOUT=*
//OUT DD DSN=&&OUT,DISP=(OLD,DELETE)
//SYSIN DD *
DEL SYS1.IODF00.CLUSTER -
CAT(CATALOG.MINIMVS.RESCUE)
SET MAXCC = 0
DEF CL(NAME(SYS1.IODF00.CLUSTER) LINEAR CYLINDERS(25 0) -
VOLUME(RESCUE)) -
DATA(NAME(SYS1.IODF00)) -
CAT(CATALOG.MINIMVS.RESCUE)
IF LASTCC = 0 THEN -
REPRO ODS(SYS1.IODF00.CLUSTER) INFILE(OUT)
Esta copia implica que si queremos arrancar satisfactoriamente este sistema, la configuración de consolas, discos y canales debe ser la misma (lógicamente, este mini-sistema correrá en la misma máquina ya que lo se pretende es utilizarlo única y exclusivamente en caso de catástrofe o pérdida irremediable de discos.
1.2.16 Borrado de referencias del z/OS a nuestro mini-SO
Con todo esto, ya tenemos lo necesario para hacer IPL del nuevo sistema. Para ello, desconectaremos el catálogo de nuestro mini-sistema del Master Catalog, y luego podemos ir a una LPAR y hacer IPL del disco. Para ello, debemos ejecutar el siguiente comando desde la opción 6 del ISPF:
EXPORT ‘CATALOG.MINIMVS.RESCUE’ DISCONNECT
1.2.17 Salvado en cinta de nuestro Mini-SO
Por último, vamos a salvaguardar los datos del volumen en el que hemos creado el mini-SO. Para ello, ejecutaremos el siguiente JCL:
//PASO016 JOB GODDESS,URD,CLASS=A,MSGCLASS=A,NOTIFY=&SYSUID,
// MSGLEVEL=(1,1),REGION=0M
//* CREAMOS UN CARTUCHO DFDSS STAND-ALONE
//DFDSSSA EXEC PGM=ADRDSSU,PARM='UTILMSG=YES'
//SAMODS DD DSN=SYS1.SADRYLIB,DISP=SHR
//CARDDD DD UNIT=3490,LABEL=(1,NL,EXPDT=98000),DISP=(,KEEP),
// DCB=(RECFM=F,LRECL=80,BLKSIZE=80),DSN=D,VOL=(,RETAIN,SER=TAPE00)
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
BUILDSA INDD(SAMODS) OUTDD(CARDDD)
//******************************************************************
//SALVADO EXEC PGM=ADRDSSU
//SYSPRINT DD SYSOUT=*
//CINTA DD DSN=SAVE.RESCUE,VOL=SER=TAPE00,DCB=TRTCH=COMP,
// DISP=(NEW,KEEP),UNIT=3490,LABEL=(2,NL,EXPDT=98000)
//DASD DD UNIT=SYSALLDA,VOL=SER=RESCUE,DISP=SHR
//SYSIN DD *
DUMP FULL INDD(DASD) OUTDD(CINTA) CANCELERROR OPT(4)
IF LASTCC = 0 -
THEN WTO '** BACKUP DE SISTEMA DE RESCATE COMPLETADO OK!! **'
Este JCL tiene dos pasos: En el primero, grabamos en una cinta NL (Importante) la utilidad DFSMSDSS STAND ALONE en el primer registro, que arranca el mini-programa que nos permitirá restaurar desde cinta, y el segundo paso, graba en el segundo registro todo el disco que aloja el mini-sistema, de forma que en una cinta tengamos todo salvado.
La razón de utilizar una cinta NL (No Label) en vez de SL (Standard Label) es que si hacemos IPL desde cinta con una SL, como el primer registro guarda la etiqueta, y dado que el hecho de hacer IPL desde cinta implica la única lectura del primer registro de cinta, la carga IPL daría error. Al ser NL, el primer registro contendrá directamente el programa DFSMSDSS Stand Alone, por lo que la IPL desde cinta tendrá éxito.
1.3 IPL del mini-SO
Para hacer IPL del sistema que acabamos de crear, partiremos desde el supuesto que hemos perdido toda la información del disco, por lo que lo que pretendemos es arrancar el mini-SO para poder restaurar la información que anteriormente ha sido grabada en cinta.
1.- Si no tenemos el volumen creado en nuestro mainframe, pero disponemos de la cinta que hemos creado en el punto 1.2.17, introduciremos dicha cinta en una boca que esté on-line en nuestra instalación, y anotaremos la dirección de dicha boca (en nuestro ejemplo, la 0500).
2.- Iremos a la HMC y elegiremos la LPAR en la que queremos arrancar el sistema, y daremos al botón de LOAD.
3.- En el cuadro de diálogo que se muestra al dar a LOAD, introduciremos en el campo de LOAD ADDRESS la dirección de la boca donde hemos introducido la cinta, y daremos a intro (en nuestro ejemplo, escribiremos 0500). El campo LOAD PARAMETER no se utiliza en este caso que cargamos desde cinta. Al de unos segundos, debería aparecer un mensaje diciendo que la carga ha tenido exito.
4.- Nos iremos a un terminal que esté on-line en esa LPAR (puede ser la master console mismamente). Daremos a Intro, con lo que por pantalla, abajo, nos debe aparecer el siguiente mensaje:
CLEAR SCREEN WHEN READY
Daremos a Intro. Saldrá el siguiente mensaje:
5694-A01 DFSMSDSS STAND-ALONE V1.03.0
ALL RIGHTS RESERVED. 5694-A01 (C) COPYRIGHT IBM CORP. 1980, 2001.
LICENSED MATERIAL – PROGRAM PROPERTY OF IBM.
US GOVERNMENT USERS RESTRICTED RIGHTS –
USE, DUPLICATION, OR DISCLOSURE RESTRICTED BY
GSA ADP SCHEDULE CONTRACT WITH IBM CORP.
ADRY005E DEFINE INPUT DEVICE, REPLY ‘DDDD,CCUU’ OR ‘CONSOLE’
ENTER INPUT/COMMAND:
Significa que si queremos que los comandos que vayamos a introducir, queremos que se den desde un terminal concreto. Volveremos a dar al Intro, que cogerá nuestro terminal por defecto, y saldrá entonces el siguiente mensaje:
ADRY006E DEFINE OUTPUT DEVICE, REPLY ‘DDDD,CCUU’ OR ‘CONSOLE’
ENTER INPUT/COMMAND:
Ahora nos pregunta si queremos que la salida salga por otra dirección de pantalla. Le daremos nuevamente al Intro para que coja nuestro terminal. Por tanto, saldrá ya el siguiente mensaje:
SA/XA/ESA 5694-A01 DFSMSDSS STAND-ALONE V1.03.0 TIME: 12:57:49
02/01/08 PAGE 1
ENTER INPUT/COMMAND:
Estamos en condiciones de poder introducir comandos STAND-ALONE para restaurar los datos. Por tanto, introduciremos lo siguiente:
RESTORE FRMDEV(TAPE) FRMADDR(500) TOADDR(1000) NVFY FILE(2)
Significa que queremos restaurar desde cinta, cuya dirección es la 500 y queremos grabarlo en el disco con dirección 1000, No verificaremos el VOLSER de ese disco y diremos que lea el registro número 2, que es precisamente el registro donde en esa cinta guardamos el contenido del volumen 3390 que es el mini-SO. Si no hemos equivocado ninguna letra al transcribir el comando, debería aparecer lo siguiente:
ADRY003D 1000 REPLY Y TO ALTER VOLUME CONTENTS, ELSE N
ENTER INPUT/COMMAND:
Por lo que si damos a Y, y pulsamos Intro, comenzará a leer la cinta y grabarla en el volumen. Irán apareciendo mensajes de pistas grabadas y demás:
ADRY0500I NEXT TRACK TO WRITE:
TRACK CCHH = X’01A1 0000′
12:58:53 02/01/08
ADRY0500I NEXT TRACK TO WRITE:
TRACK CCHH = X’0342 0000′
12:59:32 02/01/08
ADRY0500I NEXT TRACK TO WRITE:
TRACK CCHH = X’04E3 0000′
13:00:04 02/01/08
Puede ocurrir que se nos llene la pantalla de este tipo de mensajes. Si esto ocurre, volverá a aparecer un mensaje de CLEAR SCREEN WHEN READY el cual si no damos a Intro, hará que el proceso se congele, y de ahí que haya que estar pendiente de esta consola. Cuando veamos el siguiente mensaje:
ADRY0001I FUNCTION COMPLETED, HIGHEST CONDITION CODE WAS 0
13:00:08 02/01/08
ENTER INPUT/COMMAND:
Significa que el proceso ha terminado bien. Por lo que ahora sabemos que tenemos un disco en la dirección 1000 el cual tiene un mini-SO listo para ser cargado.
5.- Ahora toca el turno de arrancar el mini-SO. Para ello, volver a la HMC, elegir la LPAR donde se quiera arrancar este sistema, y pulsar sobre LOAD. Esto abrirá una ventana la cual deberemos rellenar dos campos:
LOAD ADDRESS: 1000
LOAD PARAMETER: 100000M1
Esto significa que queremos que haga IPL del disco 1000, y en los parámetros, ponemos la dirección del disco donde está el IODF (que coincide, porque lo tenemos todo grabado en el mismo disco), que cargue el LOAD00 de la SYS1.PARMLIB, y la M1 del final es que queremos que salgan los mensajes y que el núcleo alternativo sea el 1.
6.- Por último, si damos a Intro, en la Master Console de esa LPAR aparecerán los mensajes de arranque, primero del NIP y luego de z/OS. Unicamente comentar que el JES2 arranca por defecto en frio, por lo que la primera pregunta que debemos responder es que debamos confirmar la formateo del spool. Seguidamente, se lanzará el TSO, pero como arranca antes que el VTAM, aparecerá un mensaje preguntando que si se quiere reintentar o cancelar, respondiendo RETRY cuando hayamos visto que el VTAM está activo.
1.4 Customización Final
Una vez que tenemos el TSO funcionando, y hemos conseguido entrar automáticamente al ISPF, veremos que no tenemos opción de entrar al SDSF.
Esto se soluciona de una manera muy rápida:
1.- Con el ISPF, entraremos en la librería ISP.SISPPENU que es la libraría de todos los paneles de ISPF y editaremos un miembro llamado ISR@PRIM (recomiendo hacer una copia de seguridad por si acaso).
2.- Hacia los alrededores de la fila 210, se ve la lista de opciones que aparecen en el menú principal. Pues bien, añadiremos una más repitiendo la fila donde aparece 6 Commands y escribiremos encima:
S SDSF Spool Search And Display Facility
Dejando lo que antes era esto:
.4 .Foreground .Interactive language processing . .5 .Batch .Submit job for language processing . .6 .Command .Enter TSO or Workstation commands . .7 .Dialog Test .Perform dialog testing . .9 .IBM Products .IBM program development products .
Por esto otro:
.4 .Foreground .Interactive language processing . .5 .Batch .Submit job for language processing . .6 .Command .Enter TSO or Workstation commands . .S .SDSF .Spool Search and Display Facility . .7 .Dialog Test .Perform dialog testing . .9 .IBM Products .IBM program development products .
3.- Nos situaremos unas 100 filas mas abajo, y veremos la lista de comandos que se relacionan con la vista de menú que hemos visto en el punto 2. Así pues, repetiremos la línea del “6 Commands” y escribiremos lo siguiente:
S,’PGM(ISFISP) NOCHECK NEWAPPL(ISF) PARM(&NEXTOPT)’
Dejando lo que antes era:
3,'PANEL(ISRUTIL) SCRNAME(UTIL)' 4,'PANEL(ISRFPA) SCRNAME(FOREGRND)' 5,'PGM(ISRJB1) PARM(ISRJPA) SCRNAME(BATCH) NOCHECK' 6,'PGM(ISRPTC) SCRNAME(CMD)' 7,'PGM(ISPYXDR) PARM(&ZTAPPLID) SCRNAME(DTEST) NOCHECK' 9,'PANEL(ISRDIIS) ADDPOP' 10,'PGM(ISRSCLM) SCRNAME(SCLM) NOCHECK'
Por esto:
3,'PANEL(ISRUTIL) SCRNAME(UTIL)' 4,'PANEL(ISRFPA) SCRNAME(FOREGRND)' 5,'PGM(ISRJB1) PARM(ISRJPA) SCRNAME(BATCH) NOCHECK' 6,'PGM(ISRPTC) SCRNAME(CMD)' S,’PGM(ISFISP) NOCHECK NEWAPPL(ISF) PARM(&NEXTOPT)’ 7,'PGM(ISPYXDR) PARM(&ZTAPPLID) SCRNAME(DTEST) NOCHECK' 9,'PANEL(ISRDIIS) ADDPOP' 10,'PGM(ISRSCLM) SCRNAME(SCLM) NOCHECK'
4.- Salvaremos el miembro y saldremos del TSO, para volver a entrar de nuevo, viendo la nueva opción aparecer en el menú principal.
A partir de aqui, se pueden submitir simultáneamente varios trabajos de restauración, dependiendo de las bocas disponibles y las hebras del JES2, con lo que la restauración de todo un sistema se simplifica mucho en el tiempo.









