Minor z/OS notes
This chapter is not intended as a general z/OS guide, or as a guide to the AD-CD systems. However, several common questions or problems are discussed here.
12.1 How much storage for z/OS?
Starting with z/OS 2.3 a minimum of 2 GB storage (memory) is required when running z/OS under zPDT. (A minimum of 8 GB is required on other systems.) This does not mean that 2 GB is a practical system; it very much depends on what you are running with z/OS. The 2 GB size might be practical for a simple TSO system, with a few users and with no major subsystems running. It is probably not a practical system for someone using WebSphere, DB2, and significant Java applications. As always, paging levels in z/OS and the base Linux should be monitored. We observe that most zPDT users have at least 8 GB for z/OS and some are much larger.
12.2 zEDC emulation
zPDT GA9 provides limited zEDC emulation for z/OS. The limitations are these:
1. The compressed (“deflated”) data produced by the emulated zEDC is likely to be a different size than what would be produced with a hardware zEDC feature. The emulated zEDC compressed files are often smaller than those produced with the “real” hardware.
2. Data compressed with the zPDT emulated zEDC cannot be uncompressed (“inflated”) by a hardware zEDC feature. However, data compressed by a “real” zEDC can be inflated by the zPDT emulation.
3. Use with z/VM (or z/OS running under z/VM) is not supported.
Other than these limitations, the zPDT zEDC functions in the same way as a hardware zEDC feature on a large z System. This includes the automatic deflation and inflation during routine data use by z/OS, assuming DFSMS is properly set up. In general, the only time actual deflated data is seen is when dumping data or volumes with ADRDSSU or a similar product. The second limitation means that data dumped with ADRDSSU (or a similar product) cannot be moved to a “real” zEDC system and inflated there. Otherwise, zEDC usage is the same as it would be on a large z System.
To use zEDC the devmap needs a stanza such as the following:
[pcipchid]
name awszedc 120 zedc
function 0c0 3
The “120” in the example is a pchid number, the “0c0” is a function identifier, and the “3” is a virtual function number. The pchid and function identifiers are 3 or 4 arbitrary hex digits and the virtual function number must be in the range 1 to 15. These values are used internally in zEDC emulation but have no connection to any other configuration parameters. If more than one emulated zEDC is defined, the pchid and function identifiers must differ.
We have found that the zEDC does not need to be included in the IODF; z/OS discovers it automatically. To use zEDC, a software feature must be enabled in PARMLIB member IFAPRDxx, as follows:
PRODUCT OWNER('IBM Corp')
NAME('z/OS')
ID(5650-ZOS)
VERSION(*) RELEASE(*) MOD(*)
FEATURENAME(ZEDC)
STATE(ENABLED)
We also specified PARMLIB member IQPPRM00 as follows, and added an IQP=nn statement to the relevant IEASYSxx member:
ZEDC,MAXSEGMENTS=4,DEFMINREQSIZE=4,INFMINREQSIZE=16
Once started, z/OS commands D IQP, D PROD,REG,FEATURENAME(ZEDC), and D PCIE can be used to verify that z/OS has detected it correctly.
12.3 Maintenance for AD-CD z/OS systems
Users of the AD-CD z/OS systems have long requested a method of downloading PTFs. A method is in place to allow bulk downloading of PTFs in a format somewhat equivalent to the “PUT tapes” that were formerly used for z/OS maintenance. (These are no longer in tape format, but the terminology remains. PUT stands for Program (or product) update tape.) These downloads are not provided by zPDT; they are provided by the AD-CD team. In principle, anyone who has authority to download the z/OS AD-CD volumes from the IBM Dallas site can also download the material described here.
This optional service provides software maintenance for the products in the z/OS AD-CD package. This service is for experienced z/OS systems programmers and is not intended for casual AD-CD users. Most AD-CD users will elect to obtain z/OS product maintenance through the periodic AD-CD releases as they have in the past. This facility might not be appropriate for all zPDT users for two key reasons:
•The PUTs are large, typically in the range of 8 GB for each PUT. The PUTs are not cumulative, meaning that you might need to download and maintain multiple PUT releases.
•Substantial SMP/E skills are needed to use the materials. There are multiple ways the material can be handled by the user and by SMP/E.
Each PUT is divided into several approximately 1 GB files on the Dallas site. These files would normally be concatenated for use by z/OS. PUTs have names such as PUT1812 representing PUT number 12 for 2018.
The Dallas site is at this address:
A user name and password are required; this user name is unique to the Dallas download site and must be authorized for AD-CD z/OS downloads to be accessed. The Dallas group intends to maintain eight PUT levels on this site, but circumstances might vary this number. Navigating this site provides selection of various PUT levels, such as PUT1811 for example. Selecting a PUT level lists the download files for that level, as in this example:
‘HTTPD1.fz206.f140.PUT1812.TRS10.BIN’
These can be downloaded through your browser download function. We suggest you rename the files when downloading them. As an example, one recent PUT file contain 999 PTFs in 78 million records, and is typical of recent PUTs. The large size of these files is usually due to very large PTFs for UNIX System Services programs, especially for Java functions.
At the time of writing, the first file in a PUT level is small and contains only ALIAS statements for SMP/E. The remaining files tend to be large and are separated at PTF boundaries. After the multiple files for a given PUT are downloaded to Linux, they should be transferred (with FTP) to z/OS files in a specific format. The receiving z/OS file (from the FTP transfer) must be RECFM=FB and LRECL=1024; the block size does not matter. The FTP transfer must be binary. After transferring each file to z/OS, each must be processed by AMATERSE.
We found the easiest way to download the PUT files is to allocate a single receiving data set (RECFM=FB, LRECL=1024) for FTP. After each FTP we ran an AMATERSE job to uncompress the data set and assign it a logical dataset name. The first data set in the PUT (in the TRS1 file) contains SMP/E ALIAS statements and this data set is RECFM=VB, LRECL=255. The remainder of the data sets (containing the PTFs) are RECFM=FB, LRECL=80. The job we use is as follows:
//UNPK JOB 1,OGDEN,MSGCLASS=X
// EXEC PGM=AMATERSE,PARM=UNPACK
//SYSPRINT DD SYSOUT=*
//SYSUT1 DD DISP=SHR,DSN=OGDEN.PUTUP
//SYSUT2 DD DISP=(NEW,CATLG),UNIT=3390,VOL=SER=WORK09,
// DCB=(LRECL=80,RECFM=FB,BLKSIZE=8000), for PTF files
// SPACE=(CYL,(1500,50),RLSE),DSN=PUT1812.TRS2
//* DCB=(LRECL=255,RECFM=VB,BLKSIZE=8000) for TRS1 file only
We use FTP to transfer a file from Linux to OGDEN.PUTUP (which was allocated with 1500 cylinders, RECFM=FB, LRECL=1024); we then alter the AMATERSE job to have the right output data set name, and run the job. We repeat this cycle for all the files in the PUT. The final result is a series of data sets, PUT1812.TRS1, PUT1812.TRS2, and so forth. For a different PUT level we create a new high level qualifier, such as PUT1901 and so forth.
12.4 z/OS CP and memory display
The z/OS d m=cpu and d m=stor commands display information similar to the following examples:
d m=cpu
ID CPU SERIAL
00 + 000971090
CPC SI = 1090.306.IBM.02.000000000000097
d m=stor
REAL STORAGE STATUS
ONLINE-NOT RECONFIGURABLE 0M-3500M
In the example, 1090 is the z System machine type and 00097 is the z System serial number assigned by our 1090 USB hardware key. Each zPDT hardware key assigns a different z System serial number.
12.5 Java performance
z/OS Java performance might be a problem under zPDT. The basic cause lies with the very heavy system overhead (CPU and I/O) involved when starting z/OS Java applications, especially applications that load many classes. The following notes might help improve performance in some cases; the improvements can be substantial in some cases.
General base system
Even simple Java applications tend to perform heavy zFS I/O during startup, as the Java virtual machine loads the class libraries from the disk archives. If this I/O is contained mostly in the zFS cacne and/or the Linux disk cache, general performance is improved. In other words, more PC memory can help. There are no specific Linux parameters for tuning the disk cache. The Linux free -m command can be used to monitor PC memory use, although interpretation of the data produced can be a little difficult.
The raw performance of the base PC is an obvious concern, as is anything that can detract from this such as virutalization at the Linux level or at the z/VM level.
Basic Java tuning
There are a variety of approaches to tune the JVM start-up, depending on your application characteristics, deployment pattern and performance metrics. JVM features, like Quick Start and Sharedclasses caching, along with tuning of garbage collection settings, can improve https://jazz.net/wiki/bin/view/Main/SetupBuildForPerformance#Java_startup_time_and_ant_tuning
Current Java implementations use SIMD (“vector”) instructions to accelerate string, crypto and arithmetic operations on “real” hardware. The performance of these instructions varies with zPDT and, in some cases, Java performance might be better if the SIMD instructions are not used. This can be done by including the statement -Xjit:disableAutoSIMD in the jvm.options parameters used for your Java application.
DBB release 1.03 (and later) contain a persistent JVM that can substantially improve performance. Verify that you are at least at level 1.03.
RTC usage
We have noted that LAN performance between an RTC client system (that is, a separate PC) and the RTC server (z/OS) can be very dependent on LAN speed -- much more so than you might expect. We suggest you review the material in
7.6, “Performance problems” on page 142.
RESOLVER timeouts
With current z/OS Java levels an unexpected Java performance problem can occur if you enable the z/OS RESOLVER, specifying one or more external name server IP addresses, and if the RESOLVER fails to connect to the name servers. In this case any Java application that is started (including javac) hangs until the RESOLVER experiences a time out trying to connect to the name servers. This is true even for Java applications that have no LAN or TCPIP usage. The length of the application hang depends on the timeout parameter in the RESOLVER, but is typically something like 60 seconds.
This issue can be resolved by simply not running the RESOLVER, or by not specifying external IP addresses of name servers for it, or by verifying it connects to a working name server. With IBM SDK for z/OS, Java Technology Edition, Version 8 SR5 FP35 (8.0.5.35) or newer, the JVM option -XX:-ReadIPInfoForRAS will instruct the JVM to not query IP information during start up, and will bypass this RESOLVER issue
zOSMF
Recent z/OS AD-CD systems automatically start zOSMF. This startup, using default parameters, takes considerable time (both CPU and elapsed). If you do not want zOSMF started automatically, you can take two approaches:
•Prevent any zOSMF startup. To do this, edit member IZUPRMNO in the ADCD PARMLIB to read as follows:
AUTOSTART(CONNECT)
AUTOSTART_GROUP(‘NONE’)
•Allow zOSMF to connect to a running zOSMF elsewhere in your sysplex (if it exists), but do not permit it to start on your current z/OS. To do this, use PARMLIB member IZUPRM00
In both cases, edit the IEASYSxx member(s) that you use in the ADCD PARMLIB, and change the IZU=xx parameter to IZU=NO or IZU=00.
If you want to use zOSMF there are a number of tuning steps that can help performance depending on exactly how you want to use zOSMF. You can reduce zOSMF startup time by reducing the number of plugins and/or removing the help function. Removing the help function can be done as follows (working within OMVS):
cd /usr/lpp/zosmf/installableApps
mv izughelp.ear izughelp.ear.bak
We found this change reduced the zOSMF startup CPU time by about 50% and the elapsed startup time by about 40%. It also resulted in more of the elapsed time working in a single thread mode and having less effect on other system activity. At the time of writing, APAR PH06678 was planned to address the startup time associated with the help function and this might be incorporated in AD-CD systems released in 2019.
One of the tables used with zOSMF can be increased in size, reducing zOSMF startup time substantially. In /var/zosmf/configuration/local_override.cfg add the following line:
JVM_OPTIONS=-Xscmx72m -Xscmaxaot30m
Additional Java tuning options specific to zOSMF are in the following OMVS file:
/var/zosmf/configuration/servers/zosmfServer/jvm.options
This file is in ASCII. Within OEDIT the commands SOURCE ASCII and RESET SOURCE can be used to work with ASCII data.
12.6 Excessive Health Checker messages
The Health Checker is started automatically under z/OS 2.1 and later version. It is a useful tool, but it might check for details that are not relevant to zPDT users. As an example, when running a parallel sysplex system we might see the following message on the MVS console:
05.38.33 S0W1 STC00783 HZS0002E CHECK(IBMXCF,XCF_CF_STR_NONVOLATILE):
IXCH0222E A coupling facility structure user request for non-volatility
and failure-isolation from connectors is not satisfied.
The message is repeated at intervals. You can delete this health check as follows:
1. In the AD-CD z/OS 2.1 system IBMUSER has only read access to the Health Checker controls. You need update access. Issue the following commands (when logged on as IBMUSER) in the ISPF option 6 panel:
PERMIT HZS.** CLASS(XFACILIT) ID(IBMUSER) ACC(CONTROL)
SETROPTS RACLIST(XFACILIT) REFRESH
2. Go the SDSF primary option menu and select option CK to access the Health Checker. Scroll through checks looking at the Status column on the right of the screen. This column contains text such as SUCCES, INACTI, and EXCEPT. Enter the letter “S” at the beginning of any line to see more detail about it. The EXCEPT text means that the Health Checker found a problem with this item.
3. Find the check for the NONVOLATILE condition and enter the letter “H” on the line to make the check inactive or “P” to delete the check.
12.7 z/OS spin loop timeouts
A z/OS spinloop might time out and produce an S071 ABEND. This can be triggered by many different circumstances. You can change this time value by creating or altering member EXSPATxx in PARMLIB:
member EXSPAT00
SPINRCVY ABEND
SPINTIME=60
The most common reasons for SPINLOOP problems are an overcommitted virtual environment, disk cache writes when very large PC memory is used, or very high I/O rates from multiple application tasks. In rare cases, a situation with Hyper-Threading has produced SPINLOOP delays.
12.8 Larger 3270 display
The x3270 terminal emulator can be started with an optional parameter, as follows:
$ x3270 -port 3270 -oversize 133x60 localhost &
This produces a 3270 window with 133 columns and 60 lines. (Other sizes may be specified; this is simply an example.) Basic TSO does not use the “extra” window space. ISPF can use it if max is specified for the window format in the ISPF option 0 panel. (ISPF does not use the extra width unless a data set being displayed or edited has records that can use the extra width.)
Another method is to define a model 5 3270 terminal:
$ x3270 -model 3270-5 localhost:3270 & (ampersand not needed if in devmap)
However, the “standard” 3279-5 has only 27 lines.
12.9 z/OS disk STORAGE space
In some circumstances, z/OS functions use STORAGE volumes for disk allocations. The distributed z/OS AD-CD systems generally have only a single STORAGE volume, usually named xxSYS1. For anything beyond trivial z/OS usage, we strongly recommend that at least one additional 3390 volume should be defined and mounted as a STORAGE volume. A STORAGE volume is created by statements in the VATLSTxx member in PARMLIB. For example,
VATDEF IPLUSE(PRIVATE),SYSUSE(PRIVATE) <===default values; do not change
D2SYS1,0,0,3390 ,Y
GEORGE,0,0,3390 ,N <==we added this
WORK* ,0,0,3390 ,N <==we added this
The format is fixed and the spaces shown are important. Briefly, the parameters for volumes are:
1. The volume serial number, in six columns. An asterisk matches any volser with the specified characters.
2. The first ‘0’ is the mount attribute and is normally set to ‘0’ unless there are complex mount circumstances.
3. The second ‘0’ is the use attribute. This is important. The value ‘0’ defines a STORAGE volume. Value ‘1’ defines a PUBLIC volume and value ‘2’ defines a PRIVATE volume. The VATDEF statement sets the default use attribute to PRIVATE.
4. The device type, in eight columns, left justified and padded with blanks.
5. An indicator whether z/OS should issue a MOUNT request for the volume. The value ‘Y’ indicates that z/OS will request this volume to be mounted at IPL time if it is not already mounted. Generally, ‘N’ is appropriate for local STORAGE volumes.
The placement of SVC dump dataset can create a problem. By AD-CD default they are on the xxSYS1 volume. An MVS command can be used to direct SVC dumps to new volume(s); the command would be similar to DUMPDS ADD,VOL=(volser,volser,volser). Much more sophisticated controls are available through SMS functions, but these require administrative work to create the desired environment.
12.10 Stand-alone z/OS dump
The z/OS stand-alone dump (SAD) is a program that is started (IPLed) from tape or disk. It does not run under z/OS. However, it assumes that z/OS is present in z System memory at the time the stand-alone dump is started. The stand-alone dump program is sensitive to the release of z/OS that is being used and must match the z/OS release. A new version of the stand-alone dump program should be generated whenever a new release of z/OS is installed.
This section describes a simplified use of stand-alone dump based on the AD-CD z/OS system release 2.2, but the comments should apply to any recent z/OS release. The dump program is placed on an “IPLable” disk volume and the dump output must be directed to a different disk volume. The stand-alone dump program (and dumped output) can be used with tape volumes, but this is not further described here.
Disk volumes
Two disk volumes are referenced here. One is for the dump program itself, which is relatively small (about 100 tracks). This volume also contains IPL text to start the stand-alone dump program. This volume must be mounted as PRIVATE to run the dump generation job, but can be in any mount status when IPLing the dump program. An additional rule is that the SAD IPL volume cannot contain a paging dataset for the system being dumped.
The other volume is for the dump itself. A stand-alone dump can be large: hundreds of cylinders up to many thousands of cylinders. In our example we assume a suitable volume is mounted at address AC0. Before using the stand-alone dump program, you must create the dump output data set on this volume using an IPCS or REXX utility function.
The dump program (that you IPL) cannot be on the same volume that is to receive the dump data.
12.10.1 Generating a stand-alone dump program
The following job generates the stand-alone dump program and writes it on volume LOCAL1. You later IPL it from this volume when you want to take a stand-alone dump.
//SADBILL JOB 1,OGDEN,MSGCLASS=X,REGION=40M
// EXEC PGM=AMDSAOSG
//SYSLIB DD SYS1.MACLIB,DISP=SHR
// DD SYS1.MODGEN,DISP=SHR
//DSFSYSIN DD DSN=&DSFSYSIN,DISP=(,PASS),
// SPACE=(80,(9,1)),UNIT=SYSDA
//TRK0TEXT DD DSN=&TRK0TEXT,DISP=(,PASS),
// SPACE=(4096,(4,1)),UNIT=SYSDA
//GENPRINT DD SYSOUT=*
//GENPARMS DD *
AMDSADMP IPL=D3390,VOLSER=LOCAL1,CONSOLE=(700,3279),OUTPUT=DAC0
END
/*
//PUTIPL EXEC PGM=ICKDSF
//IPLDEV DD DISP=OLD,UNIT=3390,
// VOL=(PRIVATE,RETAIN,SER=LOCAL1)
//TRK0TEXT DD DSN=&TRK0TEXT,DISP=(OLD,DELETE)
//SYSIN DD DSN=&DSFSYSIN,DISP=(OLD,DELETE)
//SYSPRINT DD SYSOUT=*
Check the JES2 output when the job ends to ensure that it completed correctly. This is a somewhat unusual job. If there are error messages (perhaps about PUTIPL SYSIN problems or a message from ICKDSF) you must delete the dump program data set (on volume LOCAL1 in this example) before trying the job again. It will have data set name SYS1.PAGEDUMP.VLOCAL1. The format of the GENPARMS input conforms to basic assembly language rules, with the continuation indicator in column 72 and the continued text starting in column 16.
If you have already written IPL text on the dump program volume (LOCAL1 in this example), there will be an operator message and reply needed before the IPL text is replaced. Remember that this volume (LOCAL1 in the example) must be mounted PRIVATE when this job is run.
The error messages (or non-zero return codes) seen when attempting to run this job are not always helpful. There appears to be three common problems:
•The target volume for the dump program (the “IPL volume”) must be mounted PRIVATE while installing the dump program.
•The dump program and the target for the dump output cannot go on the same volume. You will always have at least two disk volumes involved. In the example job, the IPL text and dump program are placed on volume LOCAL1. The dump output is placed on the volume at address AC0. This volume must have preallocated space for the dump output.
•The dump program (on the IPL volume you designate) must be deleted before you can try the job again.
12.10.2 Stand-alone dump output dataset
Output (“the dump”) from the Stand Alone Dump program requires a preallocated dataset. This can be created with IPCS or with a REXX program named AMDSADDD. Briefly, the REXX program can be used by going to ISPF option 6, entering “AMDSADDD” and replying to the prompts as follows:
What function do you want .....
define
Please enter the volume serial ....
BIGVOL (assume BIGVOL is at address AC0 in our example)
Please enter device type .....
3390
Please number number of cylinders.....
3000 (this might be a reasonable size...)
Do you want the dataset cataloged...
n
Specify the DSNTYPE. Reply BASIC, or LARGE or EVTREQ...
large
Specify additional attributes
no
Data set SYS1.SADMP is allocated on volume BIGVOL
As described here the dump dataset can be used for only one dump. To reuse it you must reset or clear it. This is done with the same AMDSADDD program, selecting a different option at the first prompt.
12.10.3 Operating a stand-alone z/OS dump
We assume you have been running z/OS and need to take a stand-alone dump for some reason:
$ stop all (stop the CPs)
$ ipl AB3 (assume volume LOCAL1 is mounted at this address)
Wait about 10 seconds and press Enter on the 3270 console at address 700. This produces console messages similar to these:
AMD083I AMDSADMP: STAND-ALONE DUMP INITIALIZED. IPLDEV: 0580 LOADP:
AMD001A SPECIFY OUTPUT DEVICE ADDRESS (1): (press Enter)
AMD101I OUTPUT DEVICE: 0AC0
SENSE ID DATA: FF 3490 10 3490 40 BLOCKSIZE: 29,120
AMD011A TITLE=my dump stuff
AMD005I DUMPING OF READ STORAGE NOW IN PROGRESS
AMD005I DUMPING OF PAGE FRAME TABLE COMPLETED
etc
AMD029D REPLY W TO WAIT AFTER NEXT FULL SCREEN, ELSE REPLY N; REPLY=n
etc
12.11 Moving 3390 volumes
The following text describes a generic method of moving 3390 volumes between z/OS systems (including z/OS on zPDT). Another method, using a client/server application provided with zPDT, is described in
Chapter 15, “DASD volume migration” on page 295.
zPDT-emulated DASD volumes can be transferred to other systems in several ways. Sending a volume to another zPDT system is especially easy. The Linux file that holds the emulated 3390 volume can simply be copied. Optionally, the copy could be compressed (with gzip, for example) for transmission. The transmission could be by FTP, by a USB thumb drive, by burning a CD or DVD, or by various other means. The key concept is that a large Linux binary file is being transferred.
Moving an emulated 3390 volume to (or from) a non-zPDT system is a little more complex, because it must be handled in a z System format instead of a Linux format. The traditional method is to dump the volume to tape (using the ADRDSSU program) and then restore the tape on the target system. This method can also be used with emulated tapes (in awstape format), provided that both the sending and receiving systems can use this format.
The following example assumes both systems cannot use awstape format (otherwise we would use the easier method of creating a dump tape in awstape format). We assume there is a network connection between the source z/OS and the target z/OS system. We also assume that the target system is a zPDT system, although this is not a requirement for the technique described. See
Figure 12-1.
Figure 12-1 Overview of our example
Preparation
We need z/OS disk space to hold a 3390 volume dump and to hold a reformatted volume dump. These can be large data sets. You might have sufficient space on existing z/OS volumes; we elected to create three new volumes for holding large temporary data sets. We did this using normal zPDT techniques. First we created three new emulated 3390 volumes using the alcckd command (done while zPDT is not operational). The placement (/z directory), model (3390-3), and names of the files (TEMPnn) are all arbitrary.
$ alcckd /z/TEMP01 -d3390-3
$ alcckd /z/TEMP02 -d3390-3
$ alcckd /z/TEMP03 -d3390-3
We then added these volumes to our devmap. The addresses specified (AA0, AA1, and AA2) are unused address that are known as 3390 devices for our z/OS. (That is, z/OS has these addresses specified as 3390 devices in the IODF it uses during IPL. The AAx addresses are suitable for the default IODF in the z/OS AD systems.)
[manager]
name awsckd 0001
....
....
device AA0 3390 3990 /z/TEMP01
device AA1 3390 3990 /z/TEMP02
device AA2 3390 3990 /z/TEMP03
We then started zPDT and IPLed z/OS. During z/OS startup the new devices are recognized as uninitialized volumes and are varied offline. When z/OS was ready, we ran a job to initialize the volumes:
//BILL123 JOB 1,OGDEN,MSGCLASS=X
// EXEC PGM=ICKDSF,REGION=40M
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
INIT UNIT(AA0) NOVALIDATE NVFY VOLID(TEMP01) PURGE -
VTOC(0,1,05)
INIT UNIT(AA1) NOVALIDATE NVFY VOLID(TEMP02) PURGE -
VTOC(0,1,05)
INIT UNIT(AA2) NOVALIDATE NVFY VOLID(TEMP03) PURGE -
VTOC(0,1,05)
/*
The z/OS operator must reply U to a ICK003D message for each volume. The volsers (TEMP01, and so forth) are the same as the Linux file names; this is not required but is a good practice. After the volumes are initialized, they can be varied online to z/OS, using the MVS console:
vary aa0-aa2,online
12.11.1 Create a source dump
A normal ADRDSSU job is used to dump the source volume. Our example uses WAS001 as the volser of the source volume:
//BILL456 JOB 1,OGDEN,MSGCLASS=X
// PGM=ADRDSSU,REGION=40M
//SYSPRINT DD SYSOUT=*
//IN DD UNIT=3390,VOL=SER=WAS001,DISP=SHR
//OUT DD UNIT=3390,VOL=SER=TEMP01,DISP=(NEW,CATLG),
// DSN=OGDEN.OUT.DUMP,SPACE=(CYL,(200,200))
//SYSIN DD *
DUMP INDD(IN) OUTDD(OUT) ADMINISTRATOR COMPRESS OPTIMIZE(4)
/*
The space specified in the output DD statement might need to be adjusted, depending on the contents of the source volume. We next created another data set with specific DCB attributes. (This step could be done using ISPF 3.2 functions, but we used a batch job to provide better documentation.)
//BILL567 JOB 1,OGDEN,MSGCLASS=X
// PGM=IEFBR14
//MAKEIT DD UNIT=3390,VOL=SER=TEMP02,DISP=(NEW,CATLG),
// DSN=OGDEN.XMIT.DUMP,SPACE=(CYL,(200,200)),
// DCB=(LRECL=80,RECFM=FB,BLKSIZE=3120)
We then used the TSO xmit command to reformat the dump:
xmit x.y ds('ogden.out.dump') outdsn('ogden.xmit.dump')
This command can take considerable time if a full volume is being processed. The result of these steps is a volume dump in a format known to z/OS, but also in a format (fixed block) that can be handled by FTP. The x.y positional operand is needed in xmit, but is meaningless in this example. Note that the terse program could be used instead of xmit.
It is important to understand the reason for the xmit step. In the general case, FTP does not understand the block and record structure of a z/OS file (such as the ADRDSSU output file). This information is lost during FTP and the resulting file is not usable. The xmit program changes the ADRDSSU dump file into a fixed block, fixed record format. The general FTP process does not understand this either. However, if the transferred (with FTP) file is stored in the receiving z/OS with the same fixed block and LRECL size, the file is usable.
Some FTP situations allow additional parameters such that the original block and record characteristics of a file are retained and the xmit step could be skipped. This can be done in a z/OS to z/OS FTP transfer. The method presented in this section assumes the more general case in which the FTP transfer does not retain the original block/record information.
12.11.2 Send dump to Linux
We then sent the xmit-formatted dump to Linux, using an FTP connection from Linux to z/OS. We used the zPDT tunnel facility for the connection in our example, but any TCP/IP connection to z/OS could be used. The IP address for z/OS is 10.1.1.2 in this example:
$ ftp 10.1.1.2
Name (10.1.1.2:ibmsys1): ibmuser
Password: xxxxxx
Remote system type is MVS
ftp> cd 'ogden'
ftp> lcd /tmp
ftp> bin
ftp> get 'xmit.dump'
ftp> bye
This example has the FTP connection initiated from the Linux side. It could be done from the z/OS side, provided the Linux system has an FTP server running.
The dump is now in /tmp/xmit.dump as a normal (large) Linux file. It can be transmitted elsewhere using any technique suitable for a large Linux file. It could be compressed (using gzip, for example.) At this point the dump (OGDEN.OUT.DUMP) and the reformatted dump (OGDEN.XMIT.DUMP) on the source z/OS system can be deleted if disk space is a concern.
You can skip this intermediate Linux step if there is a direct FTP connection between the source z/OS system and the target z/OS system.
12.11.3 Receive dump
There are fewer complications if two data sets are preallocated on the receiving z/OS system. One data set is the target of an FTP transfer from Linux (or some other source) and the other is for the output of the TSO RECEIVE function. This last data set is then the input to a RESTORE job.
//BILL678 JOB 1,OGDEN,MSGCLASS=X
// PGM=IEFBR14
//D1 DD UNIT=3390,VOL=SER=TEMP01,DISP=(NEW,CATLG),
// SPACE=(CYL,(200,200)),DSN=OGDEN.XMITR.DUMP,
// DCB=(LRECL=80,RECFM=FB,BLKSIZE=3120)
//D2 DD UNIT=3390,VOL=SER=TEMP02,DISP=(NEW,CATLG),
// SPACE=(CYL,(200,200)),DSN=OGDEN.UNXMIT.DUMP
The dump file can be sent from Linux to z/OS using FTP. (If the file was compressed in Linux it must be uncompressed before sending it to z/OS.) Our example uses IP address 10.1.1.2 for z/OS because, for demonstration purposes, we used the same zPDT z/OS system that we used to create the dump volume. In practice, this is likely to be a different z/OS system that might not be in a zPDT environment.
$ ftp 10.1.1.2
Name (10.1.1.2:ibmsys1): ibmuser
Password: xxxxxx
Remote system type is MVS
ftp> cd 'ogden'
ftp> lcd /tmp
ftp> bin
ftp> put xmit.dump xmitr.dump
ftp> bye
We then used TSO to reformat the dump into the original format created by ADRDSSU:
receive indsn('ogden.xmitr.dump')
(reply to the prompt with) DSN('ogden.unxmit.dump')
Finally, the volume can be restored in z/OS:
//BILL890 JOB 1,OGDEN,MSGCLASS=X
// PGM=ADRDSSU,REGION=40M
//SYSPRINT DD SYSOUT=*
//IN DD UNIT=3390,DSN=OGDEN.UNXMIT.DUMP,DISP=SHR
//OUT DD UNIT=3390,VOL=SER=TEMP03,DISP=OLD
//SYSIN DD *
RESTORE INDDNAME(IN) OUTDDNAME(OUT) PURGE ADMINISTRATOR COPYVOLID
/*
You might not want the COPYVOLID parameter in this job, depending on your circumstances. You cannot have two disk volumes with the same volser online to z/OS at the same time. If you do not specify COPYVOLID, the existing volser (TEMP03 in the example) is retained. If you specify COPYVOLID and a volume with this volser is already online, the restored volume is taken offline after the restore operation is complete. (In our example, the restored volser would be WAS001.)
Comments
Many variations are possible in this general process. For example, some of the z/OS preallocation of data sets can be skipped if your FTP supports site and locsite subcommands. While perhaps a bit longer than absolutely necessary, we think the process shown here should work in almost any situation.
12.12 IODF Changes with zPDT
When working with a larger z System, IODF and IOCDS creation are almost always done at the same time, working with HCD. This typically starts as follows:
HCD (usually started from an ISPF panel)
1. Define, modify, or view configuration data
3. Processors
4. Control Units
5. I/O Devices
The HCD functions verify that an allowable configuration is specified. That is, the processor (type and model), CHPIDs, and I/O devices must all be mutually allowable. This is a useful check for a larger z System, but it creates problems with zPDT.
A zPDT system does not use an IOCDS and does not understand many hardware CHPID details. Furthermore, typical zPDT configurations are not compatible with the normal HCD verification and processing we would use with a larger z System. At the time of writing, I/O device configuration for a z/OS system on zPDT consists of a software only IODF generation, followed by the creation of a matching devmap. Many z/OS users are not immediately familiar with a software only IODF and we provide an overview of the topic here; it is considerably simpler than a “normal” IODF.
Assume we want to add 15 OSA devices starting at address 410 and an OSAD device at address 41F. Using the IODF99 that is provided with the current z/OS AD-CD system, we could proceed as follows:
HCD (started via ISPF menu item M.4)
1. Define, modify, or view configuration data
I/O DEFINITION FILE 'SYS1.IODF99'
1. Operating System Configuration
/ OS390 (select configuration named 'OS390')
7. Work with attached devices
(This should produce a list of current devices)
F11 - Add
At this point you should have a panel to enter a new work IODF name. We entered the name SYS1.IODF77.WORK and volser C2SYS1 in this panel. The data set name should follow this pattern (although the 77 portion of the name is arbitrary) and the volser should be the volume that is specified in the IPL parameter (C2SYS1 in the z/OS 2.2 AD system).
This is followed by a panel to add devices to the new work IODF. We entered the following information:
Specify or revise the following values.
Device number. . . . . . . 410 + (0000 - FFFF)
Number of devices . . . . 15
Device type. . . . . . . . OSA +
Serial number. . . . . . .
Description. . . . . . . .
Volume serial number . . . ______ (for DASD)
Connected to CUs . . ____ ____ ____ ____ ____ ____ ____ ____
Press Enter and again select (with a / character) the OS390 configuration. Select option 1 (to connect or change the new I/O devices). This is followed by a panel allowing you to alter default device parameters; you should take the default options unless you have a particular reason for changing them. Press Enter. This is followed by a panel to associate esoteric names with the new devices; you might use this for DASD or tape devices but probably not for any other types of devices. Press Enter and then select (with a / character) the OS390 configuration again.
Press F3 to return to the device list, and you should now see 410,15 in the list. Again select F11 (to add devices) and add a single OSAD device at address 41F, following the same steps used for the 15 OSA devices.
When your new I/O devices have been added to the list, use F3 three times to return to the initial HCD menu. You then need to process your new IODF file.
2. Activate or process configuration data
I/O DEFINITION FILE 'SYS1.IODF77.WORK'
1. Build production I/O definition file
(This may produce some warning messages, usually about esoteric
tokens. Ignore these messages. F3 to exit the warning panel.)
Command ==>
Date & Time . . . . . . : 2008-07-14 13:14:51
User . . . . . . . . . .: IBMUSER
I/O Definition file. . .: SYS1.IODF77.WORK
Change reference number.: 00018
****** ************************TOP OF DATA **************************
.......
****** ************************BOTTOM OF DATA ***********************
Press F3 to exit this panel. The next panel allows you to name the new production IODF file:
Specify the following values, and chose how to continue.
Work IODF name . . . . . . : 'SYS1.IODF77.WORK'
Production IODF name . .: 'SYS1.IODF77'
Continue using as current IODF:
1 1. The work IODF in use at present
2. The new production IODF specified above (not valid for zPDT)
The next panel allows you to specify or revise these values; press Enter. This should produce the message PRODUCTION IODF SYS1.IODF77 CREATED. Use F3 several times to exit from HCD.
To use the new IODF you must alter one or more of the LOADxx members in SYS1.IPLPARM to refer to the new IODF. For example, edit member LOAD00 in SYS1.IPLPARM:
IODF 99 SYS1 <--change this line
SYSCAT Z9SYS1113CCATALOG.Z19.MASTER
SYSPARM 00
IEASYM 00
NUCLST 00
PARMLIB USER.PARMLIB Z9SYS1
PARMLIB ADCD.Z112.PARMLIB Z9RES1
PARMLIB SYS1.PARMLIB Z9RES1
NUCLEUS 1
SYSPLEX ADCDPL
Change the 99 in the first line to 77 (or whatever number you used for your IODF). The format of this statement is odd, but it results in the name SYS1.IODF77. Be certain to place your changed characters in the same columns as the original characters. Do not change anything else in the LOADxx member unless you are certain about your actions.
The new IODF is now ready to use the next time you IPL z/OS with the parameter:
$ ipl 0a80 0a8200 (The 00 corresponds to the LOAD00 member)
Assuming you are satisfied with the results, you will probably want to change all the LOADxx members that you use. You must also change your devmap to use the new devices you added to your z/OS system.
12.13 Many COBOL Compilations
If you run a large number of COBOL compilations every day you can substantially improve compiler performance by moving some compiler modules into LPA. For COBOL 6.2 we moved IGYCPGEN, IGYCSCAN, IGYDRV, IGYQCBE, and IGYZQDRV to LPA and removed them from the IGY620.SIGYCOMP library. It is necessary to remove them from this library because the library is used as a STEPLIB during compilation and a STEPLIB is searched before LPA. The named modules use about 1500 tracks and are program objects, not load modules. They cannot be simply placed in one of the LPA libraries; instead they can be handled by “LPA” statements in a PROG member in PARMLIB.
12.14 Local printing
There is often less need for hard copy printed output in today’s working environments, but it is sometimes needed. There are a variety of ways to approach this. The following material describes only one of these ways.
Background
Basic z/OS printing is closely related to the hardware available on the original S/360 machines. The most common printer at that time was the IBM 1403. It printed lines with 120 characters (or 132 characters, with an optional feature) and was normally set to print 6 lines per inch on fan-fold paper that was 11 inches long. This meant a full page held 66 lines. In practice, many programs counted output lines and skipped to a new page after 60 or 61 lines.
Much of the utility software with the system, such as JCL processors, assemblers, compilers, system report programs, and so forth was designed to fit these pages. That is, they printed lines of up to 120 characters (sometimes up to 132 characters) with about 60 lines per page. This default convention is still with us today.
Later hardware replaced the line printers (such as the 1403) with laser printers. These were devices such as the IBM 3800, 3820, 3825, 3900, and so forth. These could accept a variety of paper sizes, but were most commonly used with “letter size” paper. With proper programming, these printers can produce sophisticated output using many fonts and graphics components. However, the system utilities (compilers, for example) continued to produce listings in “1403 format.” Software for these laser printers can accept this 1403-format data and list it. These listings typically are two-sided, landscape mode, and contain up to 66 lines of 132 characters on each page.
Real 1403 printers are historical items, but there are many uses for pseudo-1403 devices. z/OS and JES2 still support 1403 printers and zPDT can emulate 1403 printers. This is all that is needed for printed output from utilities, compilers, and many existing applications.
Using a PC printer
Our goal was to use a common PC laser printer and have utility output produced in the format just described: landscape mode, 66 lines per page, 132 characters per line. If the PC printer provides duplex printing (printing on both sides of the paper), this would be used. The flow is illustrated in
Example 12-2.
Our tests used a Lexmark OptraS1250 and Optra L printers (both with duplex printing features). We have not tried the techniques described here with other printers, but we expect the same or similar techniques could be used. However, remember that z/OS printed output typically contains separator pages, JCL listings and messages, and so forth; the smallest job usually has multiple pages of printed output. This may not be suitable for use with a small inkjet printer. We assume the use of a fairly heavy-duty laser printer for z/OS printing.
Figure 12-2 General flow for printing
12.14.1 Setup
We need to provide the setup for Linux, the zPDT devmap, a shell script, and JES2.
Linux setup
We first configured our (very old) Lexmark Optra S1250 for Linux. This printer has a parallel input; our computer had no parallel ports. We purchased a USB-to-parallel cable and this provided the needed connectivity. We used YAST (running under openSUSE) to configure the printer. A print queue named optras1250 was created automatically by YAST. We verified that the printer worked by using commands such as:
$ lpr /home/ibmsys1/prof12 (to print one of our devmaps)
Devmap setup
We added the appropriate 1403 definition to the zPDT devmap:
[manager]
name awsprt 4321 --windows
device 00E 1403 2821 /tmp/1403a
The --windows option is needed to place CR/LF characters in the output; without this option, NL characters are used and a PC printer may not be happy with NL characters. The output file name (/tmp/1403a in the example) is arbitrary. In our case, we did not expect much printed output and /tmp seemed a reasonable place to put it. The output file may also be assigned or changed with the awsmount command.
Shell script
We created a Linux shell script named prt00E (the name is arbitrary) and placed it in our home directory (/home/ibmsys1, in our case). The shell script contained the following lines:
CTL=” 33105 33 50163 60160 61 66 56 66 67150 70 56166
60163 60142124 33 46154 61157 61163 65 56 64143
55 61 60 60 60132”
CTL2=” 14 33105”
(/bin/echo -ne $CTL; cat /tmp/1403a; /bin/echo -ne $CTL2) | lpr -P optras1250
The CTL and CTL2 definition constants are printer control characters, written in octal. The octal format was the most convenient for use in a shell script. If you have good script writing skills you can do this several ways. The particular control characters shown here are for the Lexmark printers we mentioned. Your printer may require different controls. If you are printing to the default Linux printer you do not need the -P parameter (and queue name) of the lpr command.
The logic in the shell script is simple. It sends data (via a pipe and lpr) to the queue we defined earlier. It sends the CTL string (using echo), then sends the print data from the output file we named in the devmap or awsmount command (using cat), and then sends the CTL2 string (using echo) to flush the printer buffer and reset the printer.
The CTL control string (for our Lexmark printers) resets the printer, switches to a fixed font, sets a small type size pitch, changes to 8 lines/inch, uses a Courier font, uses landscape, duplex printing, uses 5.4/48 line height, and a small line offset to better center the data. The only unique requirement is that the format must use exactly 66 lines per page in order to synchronize with the pages produced by the 1403 emulator.
In the following strings 33 is the ESC character that is used to begin printer command strings, and this is shown as a bold-face E in the character equivalents of the string. The octal constants are the equivalent of the characters shown and the CTL string could be written with characters (except for the ESC byte).
The CTL commands are as follows:
OCTAL constant....... Characters Comment