Hola a todos. Vuelvo de nuevo a la carga para publicar mas recetas de mainframe. En esta ocasión, voy a explicar como activar el RMM, o lo que es lo mismo, el Removable Media Manager dentro del z/OS, para activar el sistema de gestión de medios extraibles del mainframe.
Tradicionalmente, el mainframe trabaja con unidades de cinta, no solo para hacer backup, sino también para dejar datasets y librerias en cinta, ya que el almacenamiento en disco es bastante mas caro. Podéis haceros una idea la cantidad inmensa de datos que se pueden grabar en cinta, y la cantidad inmensa de cintas con las que se trabaja. Administrar la expiración y caducidad de los datos, llevar el control de la disposición y lugar donde se almacenan las cintas, controlar el volumen de cintas de entran y salen, si se lleva de forma manual, se convierte en nada menos que un esfuerzo que los “cintotecarios” tenían que realizar, hasta la llegada del RMM.
Este sistema es un completo módulo que se engrana perfectamente dentro del DFSMS, que gestiona todas y cada una de las cintas con las que se trabaja, entradas, salidas, gestión del dato, caducidad, transmisión, almacenado de cintas, de una manera muy eficaz. Y sobre todo, aunque se puede llevar de forma manual, con la llegada de las robóticas automatizadas de cintas, es donde el RMM se ha mostrado más util, dialogando directamente con los brazos robóticos y eliminando practicamente la figura del cintotecario en la ecuación.
Como funciona?
El sistema se gestiona por pools de cintas, y cada pool tiene una serie de caracteristicas. Por ejemplo, el pool de SCRATCH es aquel donde las cintas estan disponibles para su escritura o uso, y es el pool donde se dirige el mainframe cuando necesita grabar una cinta con datos, vendria a ser el pool de cintas “virgenes”. Por otra parte, el pool MASTER es aquel donde las cintas tienen datos grabados y validos del sistema.
Las cintas tienen un ciclo de vida, el cual puede saltar de un pool a otro en función de su caducidad, expiración, etc, de forma que cuando una cinta, al final, ya no tiene datos validos por haber caducado, pueden volver al pool de SCRATCH para que se puedan reutilizar de nuevo por el sistema.
El presente texto, explica como activar el RMM, contando con el hecho de que el DFSMSrmm está instalado en nuestro sistema ADCD, por lo que seguiriamos los siguientes pasos:
1.1 Customización de miembros de la PARMLIB
1.- Lo primero de todo, hay que verificar si en el miembro IFAPRDXX, se encuentra el miembro instalado. Si lo está, deberían aparecer las siguientes líneas. Si no lo está, las añadiremos:
PRODUCT OWNER('IBM CORP')
NAME(Z/OS)
ID(5694-A01)
VERSION(*) RELEASE(*) MOD(*)
FEATURENAME(DFSMSRMM)
STATE(ENABLED)
2.- Lo siguiente es comprobar el miembro IEFSSNXX, y añadir la línea EDGSSI, para que el z/OS sepa que subsistema lanzar. Por tanto, se debería añadir una línea como esta:
SUBSYS SUBNAME(DFRM) INITRTN(EDGSSSI)
3.- Debemos modificar las autorizaciones de TSO para poder emitir comandos de RMM usando la opción 6 del ISPF, por lo que debemos añadir a la IKJTSOXX los comandos necesarios. Para averiguar que IKJTSO tenemos, con hacer un /D IKJTSO,SEND debería aparecernos la 00. De hecho, si no se le especifica nada en la IEASYS con la variable IKJTSO=XX, coge la 00 por defecto. Una vez sabido el miembro correcto (en nuestra instalación, IKJTSO00), añadiremos los siguientes comandos:
AUTHCMD NAMES( /* AUTHORIZED COMMANDS */ +
RMM /* RMM */ +
AUTHPGM NAMES( /* AUTHORIZED PROGRAMS */ +
EDGHSKP /* RMM */ +
EDGUTIL /* RMM */ +
EDGRPTD /* RMM */ +
EDGAUD /* RMM */ +
AUTHTSF NAMES( /* PROGRAMS TO BE AUTHORIZED */ +
/* WHEN CALLED THROUGH THE */ +
/* TSO SERVICE FACILITY. */ +
EDGHSKP /* RMM */ +
EDGUTIL /* RMM */ +
EDGRPTD /* RMM */ +
EDGAUD /* RMM */ +
Con esto, la lista de comandos de administración de RMM quedará autorizada en TSO.
4.- Si quisiéramos que el RMF obtuviera datos del RMM para estadísticas, deberíamos modificar el miembro SMFPRMXX, pero es un paso opcional que no seguiremos por no ser critico.
5.- Por último, debemos crear un miembro llamado EDGRMMXX (en nuestro caso, EDGRMM00), copiado de la SYS1.SAMPLIB(EDGIVPPM), que es donde se definirán los parámetros de arranque del RMM cuando su STC se inicie. Dicho contenido será similar al que se muestra a continuación:
/*-------------------------------------------------------------*/
/***************************************************************/
/* DFSMS/MVS 1.1.0 DFSMSrmm */
/* */
/*PROPRIETARY V3 STATEMENT */
/*LICENSED MATERIALS - PROPERTY OF IBM */
/*"RESTRICTED MATERIALS OF IBM" */
/*5695-DF1 */
/*(C) COPYRIGHT 1979,1993 IBM CORP. */
/*END PROPRIETARY V3 STATEMENT */
/***************************************************************/
/* */
/* RMM (JDZ1150) IVP. IVP EDGRMM00 PARMLIB MEMBER */
/* */
/* COPY THIS MEMBER TO 'SYS1.PARMLIB' AS MEMBER EDGRMM00. */
/* */
/* CHANGE THE MASTER AND JOURNAL FILE NAMES IF NECESSARY */
/* */
/*-------------------------------------------------------------*/
OPTION DSNAME(RMM.CONTROL.DSET) /* MASTER FILE NAME*/ -
JRNLNAME(RMM.JOURNAL.DSET) /* JOURNAL NAME */ -
OPMODE(M)
MNTMSG MSGID(IEF233A) ID(1) VOLUME(16) RACK(999)
MNTMSG MSGID(IEF233D) ID(1) VOLUME(16) RACK(999)
MNTMSG MSGID('IEF234E K') ID(1) VOLUME(16) RACK(999)
MNTMSG MSGID('IEF234E R') ID(1) VOLUME(16) RACK(999)
MNTMSG MSGID('IEF234E D') ID(1) VOLUME(16) RACK(999)
MNTMSG MSGID('IEF455D') ID(1) VOLUME(16) RACK(999)
MNTMSG MSGID(IEC501A) ID(1) VOLUME(16) RACK(999)
MNTMSG MSGID('IEC502E K') ID(1) VOLUME(16) RACK(999)
MNTMSG MSGID('IEC502E D') ID(1) VOLUME(16) RACK(999)
MNTMSG MSGID('IEC502E R ') ID(1) VOLUME(16) RACK(999)
MNTMSG MSGID('IEC502E RD') ID(1) VOLUME(17) RACK(999)
MNTMSG MSGID('IEC502E RK') ID(1) VOLUME(17) RACK(999)
MNTMSG MSGID(IAT5110) ID(1) VOLUME(44) RACK(999)
MNTMSG MSGID(IAT5210) ID(1) VOLUME(50) RACK(999)
MNTMSG MSGID(IAT5410) ID(1) VOLUME(20) RACK(999)
Hay que tener en cuenta los valores en Negrita. Por un lado, tenemos el DSNAME, que especifica el dataset VSAM que llevará en control del número de cintas que maneja el RMM. Por otra parte, la opción JRNLNAME especifica donde grabaremos el JOURNAL del RMM, y por último, tenemos el OPMODE u “Operation Mode” que indica el modo de trabajo del RMM (M para manual, P para protegido, R para grabación (modo normal de funcionamiento) y W para warning). En nuestro caso, lo dejamos en M de momento, que es Manual, lo que significa que el RMM de momento no realizará montajes automáticos, sino standalone (vamos, como estábamos haciéndolo hasta ahora). Los datasets los creamos luego.
1.2 Creación del la STC de la PROCLIB
Necesitamos un miembro en la PROCLIB que será en que se lance como STC para que el RMM esté bajo la supervisión del JES2. Para ello, copiaremos de SYS1.SAMPLIB el miembro EDGDFRMM y lo pegaremos en nuestra PROCLIB (ADCD.ZOSV14S.PROCLIB) pero renombrándolo como DFRMM. El contenido de dicho miembro lo listamos a continuación:
//DFRMM PROC M=00,OPT=MAIN //* //* PROCEDURE FOR DFRMM SUBSYSTEM TASK //* //* 1. M Is used to pick up the necessary PARMLIB member name suffix. //* OPT can be used to execute the EDGRESET utility to inactivate //* the DFRMM subsystem interface before stopping DFRMM procedure. //* S DFRMM,OPT=RESET //* P DFRMM //* 2. IEFRDER and PARMLIB are optional DD statements - see //* the Installation & Customization Guide for details. //* IEFRDR is only honoured for single step procedures //* 3. This procedure is designed to run as a single step procedure //* 4. If desired, the MASTER and JOURNAL DD statements can be //* added to the procedure. Refer to the I&C Guide for details. //* 5. The DFRMM startup procedure can optionally include an //* OUTPUT JCL statement to direct sticky label output. The //* statement name must match the DISPDDNAME specified in parmlib. //* If the OUTPUT statement is not specified, RMM issues the //* label as write to operator messages using route code 13. //* //********************************************************************* //* z/OS DFSMSrmm V1R3 * //* * //*PROPRIETARY V3 STATEMENT * //*LICENSED MATERIALS - PROPERTY OF IBM * //*"RESTRICTED MATERIALS OF IBM" * //*5694-A01 * //*(C) COPYRIGHT 1993,2001 IBM CORP. * //*STATUS = HDZ11G0 * //*END PROPRIETARY V3 STATEMENT * //********************************************************************* //* Change history: * //* $01=OW57435,210,021205,MWW: Increase REGION value @01A * //********************************************************************* //* //IEFPROC EXEC PGM=EDG&OPT,REGION=0M,PARM='&M',TIME=1440 @01C //*PARMLIB DD DDNAME=IEFRDER //*IEFRDER DD DISP=SHR,DSN=SYS1.PARMLIB //*MMDISP OUTPUT DEST=SYSTEMX,FORMS=LABEL,CLASS=L //EDGPDOX DD DISP=SHR,DSN=RMM.RMMPDOX //EDGPDOY DD DISP=SHR,DSN=RMM.RMMPDOY
Con M=00, le estamos diciendo que esta STC se alimente del miembro EDGRMM00 de la PARMLIB, editado anteriormente. También hay que alocar dos datasets que llevarán las trazas del RMM, llamados RMMPDOX y RMMPDOY. Como hay que crear varios datasets, el siguiente apartado muestra como crear todos los datasets que entran en juego.
1.3 Creación de Datasets, Catálogos de usuario, etc.
Este apartado explicará paso a paso los datasets que se deben crear para el correcto funcionamiento del RMM. Como intervienen varios datasets, crearemos un catálogo solo para ellos y su alias correspondiente. Para ello, seguiremos los siguientes pasos:
1.- Definiremos un catálogo llamado CATALOG.RMM, y lo conectaremos al catálogo maestro, CATALOG.OS390.MASTER, con el siguiente JCL:
//DEFCAT00 JOB CLASS=A,MSGCLASS=X,NOTIFY=&SYSUID
//DEFMCAT EXEC PGM=IDCAMS,REGION=8M
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
DEFINE -
UCAT ( -
ICFCATALOG -
NAME(CATALOG.RMM) -
VOL(OS39M1) -
CYL(10 5) -
FREESPACE(10 10) -
SHR(3 4) -
IMBED -
REPLICATE -
STRNO(3) -
) -
DATA ( -
CISZ(4096) -
BUFND(4) -
)-
INDEX( -
BUFNI(4) -
) -
CAT(CATALOG.OS390.MASTER)
//*-------------------------------------------------------------------
//* CONNECT THE DRIVING SYSTEM MASTER CATALOG INTO THE NEW TARGET
//* SYSTEM MASTER CATALOG FOR THE CATCVTM JOB
//*-------------------------------------------------------------------
//CONNECT1 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
IMPORT CONNECT -
OBJECTS((CATALOG.RMM -
DEVICETYPE(3390) -
VOLUME(OS39M1))) -
CATALOG(CATALOG.OS390.MASTER)
/*
2.- Definiremos el ALIAS para que todo lo que empiece por RMM, se vaya al catálogo CATALOG.RMM, con el siguiente JCL:
//DEFALIAS JOB CLASS=A,MSGCLASS=X,NOTIFY=&SYSUID
//PAS0001 EXEC PGM=IDCAMS,REGION=1024K
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
DEFINE ALIAS (NAME(RMM) -
RELATE(CATALOG.RMM)) -
CATALOG(CATALOG.OS390.MASTER)
/*
3.- Crearemos el dataset de Control del RMM (RMM.CONTROL.DSET) con el siguiente JCL:
//CREAVSAM JOB CLASS=A,NOTIFY=&SYSUID,MSGCLASS=X, // MSGLEVEL=(1,1) //PASO1 EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //DASD DD DISP=SHR,UNIT=SYSDA,VOL=SER=OS39M1 //SYSIN DD * DEFINE CLUSTER(NAME(RMM.CONTROL.DSET) - FILE(DASD) - FREESPACE(15 0) - KEYS(56 0) - REUSE - RECSZ(512 9216) - SHR(3 3) - KILOBYTES(4500 1500) - VOLUMES(OS39M1)) - DATA(NAME(RMM.CONTROL.DSET.DATA) - CISZ(26624)) - INDEX(NAME(RMM.CONTROL.DSET.INDEX) - CISZ(2048)) /*
Y lo inicializaremos, con el siguiente JCL:
//CDSINIT JOB CLASS=A,NOTIFY=&SYSUID,MSGCLASS=X, // MSGLEVEL=(1,1) //EDGUTIL EXEC PGM=EDGUTIL,PARM=CREATE //SYSPRINT DD SYSOUT=* //MASTER DD DSN=RMM.CONTROL.DSET,DISP=SHR //SYSIN DD * CONTROL /*
4.- Crearemos el JOURNAL del RMM, utilizando como base el JCL del la SYS1.SAMPLIB, EDGJNLAL, y le haremos las modificaciones oportunas:
//EDGJNLAL JOB CLASS=A,MSGCLASS=X,NOTIFY=&SYSUID //*************************************************************** //* DFSMS/MVS 1.4.0 DFSMSrmm * //* * //*Proprietary V3 Statement * //*Licensed Materials - Property Of IBM * //*"Restricted Materials of IBM" * //*5695-DF1 (C) COPYRIGHT 1979,1993 IBM CORP. * //*End Proprietary V3 Statement * //*************************************************************** //* * //* RMM (HDZ11D0). ALLOCATE JOURNAL FILE * //* * //* THIS JOB IS USED TO ALLOCATE A JOURNAL FILE FOR THE RMM * //* CONTROL DATA SET. * //* * //* MAKE THE FOLLOWING CHANGES TO THIS JOB BEFORE SUBMITTING * //* IT FOR EXECUTION: * //* 1.JOBCARD. Enter required job card information for your * //* installation. * //* 2.volser Set to the serial number of the volume on which* //* to allocate the JOURNAL file. * //* 3.JOURNAL.FILE.DSNAME Set to the name selected. * //* 4.store_class to a storage class with GUARANTEED SPACE * //* or delete the STORCLAS keyword. * //* 5.SPACE. Update the values for space allocation if you * //* wish to use a different sized Journal data set * //* * //*-------------------------------------------------------------* //JOURNAL EXEC PGM=IEFBR14 //SYSPRINT DD SYSOUT=* //JOURNAL DD DISP=(NEW,CATLG),DSN=RMM.JOURNAL.DSET, // UNIT=SYSDA,VOL=SER=OS39M1, // AVGREC=U,SPACE=(4096,(1000))
5.- Crearemos los datasets de trazas o PDAs, con el siguiente JCL:
//ALLOPDO JOB CLASS=A,MSGLEVEL=1,NOTIFY=&SYSUID //STEP1 EXEC PGM=IEFBR14 //DD1 DD DSN=RMM.RMMPDOX,DISP=(,CATLG), // UNIT=SYSDA, // VOL=SER=OS39M1,SPACE=(CYL,(20)) //DD2 DD DSN=RMM.RMMPDOY,DISP=(,CATLG), // UNIT=SYSDA, // VOL=SER=OS39M1,SPACE=(CYL,(20))
Con todo esto, estamos en condiciones de lanzar el RMM.
1.4 Ejecución de DFSMSrmm
Para ejecutar el RMM, basta con lanzar la STC creada en el punto 1.2, con un comando de consola S DFRMM.
1.5 Customización de DFSMSrmm
En este momento, pasaremos a configurar el RMM y definiremos los tipos de cintas que utilizaremos en nuestra instalación. Para ello, editaremos el miembro EDGRMM00 que reside en la PARMLIB y añadiremos lo siguiente:
/*-------------------------------------------------------------*/
/***************************************************************/
/* DFSMS/MVS 1.1.0 DFSMSrmm */
/* */
/*PROPRIETARY V3 STATEMENT */
/*LICENSED MATERIALS - PROPERTY OF IBM */
/*"RESTRICTED MATERIALS OF IBM" */
/*5695-DF1 */
/*(C) COPYRIGHT 1979,1993 IBM CORP. */
/*END PROPRIETARY V3 STATEMENT */
/***************************************************************/
/* */
/* RMM (JDZ1150) IVP. IVP EDGRMM00 PARMLIB MEMBER */
/* */
/* COPY THIS MEMBER TO 'SYS1.PARMLIB' AS MEMBER EDGRMM00. */
/* */
/* CHANGE THE MASTER AND JOURNAL FILE NAMES IF NECESSARY */
/* */
/*-------------------------------------------------------------*/
OPTION OPMODE(P) /* MODO PROTECCION */ -
TPRACF(A) /* AUTOMATIC */ -
NOTIFY(N) /* NO NOTIFICACION */ -
MAXHOLD(100) /* NUMBERS OR RECORDS*/ -
DSNAME(RMM.CONTROL.DSET) /* FICHERO DE CONTROL*/ -
JRNLNAME(RMM.JOURNAL.DSET) /* FICHERO JOURNAL */ -
SMFAUD(248) SMFSEC(249) /* REGISTROS SMF */ -
SMSTAPE(UPDATE(COMMAND,EXITS,SCRATCH) PURGE(ASIS)) -
VRSCHANGE(INFO) /* VERIFICACION VRS */ -
DATEFORM(E) /* FECHA EUROPEA */ -
RETPD(5) /* DEFAULT RETENCION */ -
MAXRETPD(9999) /* MAXIMA RETENCION */ -
SCRATCHPROC(RMMSCR) /* PROC DE SCRATCH */ -
CDSID(RMM1) /* CONTROL DS ID */ -
BLP(RMM) /* BYPASS LABEL PROC.*/
/* DEFINICION DE POOLES */
VLPOOL PREFIX(BCK*) TYPE(S) MEDIANAME(MEDIA2) EXPDTCHECK(N) –
RACF(Y) DESCRIPTION('CARTUCHOS DE LA INSTALACION')
MNTMSG MSGID(IEF233A) ID(1) VOLUME(16) RACK(999)
MNTMSG MSGID(IEF233D) ID(1) VOLUME(16) RACK(999)
MNTMSG MSGID('IEF234E K') ID(1) VOLUME(16) RACK(999)
MNTMSG MSGID('IEF234E R') ID(1) VOLUME(16) RACK(999)
MNTMSG MSGID('IEF234E D') ID(1) VOLUME(16) RACK(999)
MNTMSG MSGID('IEF455D') ID(1) VOLUME(16) RACK(999)
MNTMSG MSGID(IEC501A) ID(1) VOLUME(16) RACK(999)
MNTMSG MSGID('IEC502E K') ID(1) VOLUME(16) RACK(999)
MNTMSG MSGID('IEC502E D') ID(1) VOLUME(16) RACK(999)
MNTMSG MSGID('IEC502E R ') ID(1) VOLUME(16) RACK(999)
MNTMSG MSGID('IEC502E RD') ID(1) VOLUME(17) RACK(999)
MNTMSG MSGID('IEC502E RK') ID(1) VOLUME(17) RACK(999)
MNTMSG MSGID(IAT5110) ID(1) VOLUME(44) RACK(999)
MNTMSG MSGID(IAT5210) ID(1) VOLUME(50) RACK(999)
MNTMSG MSGID(IAT5410) ID(1) VOLUME(20) RACK(999)
La parte de Negrita, por ejemplo, define un POOL de cintas. Todas las cintas que empiecen por la etiqueta BCK*, entrarán dentro de este pool. Esto es util por si tenemos diferentes tamaños de cartuchos, como 3480, o 3590, asi se diferencian por etiquetas y el RMM los puedo utilizar en cada caso segun las reglas que le vengan desde el SMS.
Pues con esto, ya tenemos todo el sistema definido y listo para trabajar. Con esta configuración, hemos activado el RMM en modo manual, es decir, tendemos que montar las cintas en los cartuchos de manera manual, y el sistema NO va a aceptar ninguna cinta que no tenga como etiqueta un texto que empiece por BCK. Por lo tanto, cintas como BCK002 o BCK843 son cintas que si aceptará y trabajará con ellas, de lo contrario, cintas con cualquier otra etiqueta, las escupirá y se quedará esperando hasta que se le introduzcan las cintas que espera.
En el siguiente artículo explicaré los comandos mas utilizados, el proceso de Housekeeping, etc.