You are on page 1of 10

Mainframe

Mainframe dla początkujących – podstawowe pojęcia wyrwane z wykładów 


(takie tam notatki sprzed kilku lat… ale może wybierzecie coś dla siebie)

© Copyright by Oskar Grot


Mainframe - scentralizowany system komputerowy kluczowy dla firmy (o wielkiej mocy obliczeniowej).
System wielozadaniowy, wieloużytkownikowy. Choć początkowo było kolejkowanie, a nie wielozadaniowość.

IBM S/360
S/370 24-bitowe, adresowanie 24bit
s/390 32-bitowe, adresowanie w 2 trybach (31bit/24bit), 1 bit na rozróżnienie trybu pracy
z/Series 64-bitowe, adresowanie zgodne z poprzednimi trybami + 64bit

Cechy mainframe:
- dostępność (jednoczesny dostęp tysięcy, a nawet dziesiątek tysięcy użytkowników)
- niezawodność (dostępność 24/7/365, statystycznie 52min/rok niedostępny dla użytkowników zewnętrznych)
- bezpieczeństwo danych (brak włamań, procedury backupowania, uprawnienia dostępu, szyfrowanie sprzętowe, dobre odseparowanie
różnych zadań)
- skalowalność (bez zmian w oprogramowaniu można ulepszać system, łatwo dokładać sprzęt wewnętrzny bez konieczności
wyłączania systemu)

ponadto:
- dostęp narzędzi do pamięci realizowany sprzętowo (bez sterowników)
- Channel - procesor obsługujący I/O

Emulatory (uwaga „wywalają” się)


 Emulator S/390 - Hercules.
System operacyjny S/390 v2r10
terminal 3270 (telnet 3270) - dostęp tekstowy (komendy TSO), możliwość pisania skryptów JCL, panel ISPF/POF)
emulatory terminala 3270: x3270, c3270, Mocha 3270
łączenie: c3270 host:port
np. c3270 10.0.1.43:3270

obsługa: TSO
login (enter userid): USERnr (np.USER8)
działa tylko "del", nie działa "backspace", "tab" służy do zmiany pola
hasło: ECTS
następnie nowe hasło, po potwierdzeniu którego się zalogujemy do znaku "***", dalej przechodzimy za pomocą "Enter", gdzie jest menu
z opcjami
aby się wylogować, wpisujemy "x", dostajemy komunikat READY i wpisujemy "LOGOFF"

Klawisze odpowiadają opcjom:


PF1 - F1 (można napisać f1)
PF3 - EXIT (można napisać exit)
PF12 - CANCEL
PF10 - LEFT
PF11 - RIGHT
PF7 - UP
PF8 - DOWN
PF2 - SPLIT (na 2 panele)
PF9 - SWAP (między panelami)
PF5 - RFIND
PF6 - RCHANGE
PF4 - RETURN TO SPF MENU
RESET - usuwa tryb dopisywania (INSERT)
CLEAR - czyści ekran
PA2 - przywraca ekran (wyczyszcony)
PA1 - przerywa wykonywanie poleceń TSO
TSO HELP - pomoc
TSO HELP ALLOCATE - pomoc do polecenia ALLOCATE
Erase EOF
Delete
HELP
Insert - tryb dopisywania
Utilities -> Dslist -> Dsname Level -> Usernr
User*

Nazwa Data Seta


Nazwa składa się z kwalifikatorów oddzielonych kropkami.
Każdy kwalifikator ma od 1 do 8 znaków.
Znakami mogą być litery, cyfry, $,#,@,-, przy czym na początku nie może być myślnik, ani cyfra. Wszystkich znaków maksymalnie
(łącznie z kropkami) może być 44.

Nazwy kwalifikowane to nazwy składające się z trzech kwalifikatorów:


prefix.kwalifikator.typ

prefix - najczęściej USERID użytkownika


typ - rozszerzenie mówiące o typie danych
W TSO problematyczne jest odwołanie się do kwalifikatora o innym prefiksie niż nasz własny

Możemy przejrzeć:
SYS1.P*
Po przewinięciu w bok widać: Dsorg, Recfm
Dsorg: PS (physically sequenced)
Zbiór SYS1.IODF00.ACTLOG

Stworzenie nowego pustego zbioru na wzór już istniejącego:


opcja 6 COMMAND w głównym panelu:
ALLOCATE DA(zbior1.text) LIKE('SYS1.IODF00.ACTLOG')
DA - skrót od DataSet

Edycja:
Menu główne: -> 2

Data Set Name: nazwa, np. ZBIOR1.TEXT

ISPF Library:
Project: prefix
Group:
Type:
Member:

Przechodzimy do:
start -> Utilities -> Data Set

Tam bierzemy:
Data Set Name: nazwa, np. ZBIOR1.TEXT
Volume Serial:
Data Set Password:
Option: A (czyli Allocate)

Następnie przechodzimy do menu Allocate New Data Set:


Space Units (jednostki w jakich wyrażamy ilość potrzebnego miejsca dla utworzenia zbioru)

Wracamy (F12)

Wracamy do Utilities -> Dslist


Tam szukamy w Dsname Level zbioru: SYS1.IODF00.ACTLOG

*/ W tym momencie koniec pracy z serwerem, bo emulator padł :> /*

UNIT
Możliwe jednostki: TRKS, CYLS, BLKS
dla urządzeń 3390:
TRKS (rozmiar ścieżki: 56664 B)
CYLS (rozmiar cylindra: 15 * 56664 B = 849960 B
BLKS (bloki)
PRIMARY ALLOCATION
SECONDARY ALLOCATION (do 15 sztuk)

RECFM
Rekordy: F, FB, V, VB, U
LRECL (Logical Record Length) - długość rekordu, standard 80

DIR - możliwości: 0/liczba_naturalna, gdzie 0 - oznacza, że zbiór jest sekwencyjny, gdy coś innego, to oznacza ilość bloków katalogu
zbioru PDS

DSORG (PS / PDS) - PS oznacza sekwencyjny, daje to możliwość wpisania sprzecznych wartości w DIR i DSORG

W zbiorach PDS mieszczą się zbiory sekwencyjne o tej samej strukturze oraz wewnętrzny katalog (W PDSE organizuje, by nie było dziur
w zbiorach).
Na katalog przydzielone są 256 B bloki. Ilość bloków jest definiowana w pozycji DIR. W jednym bloku katalogu PDS może być wiele
wpisów (średnio 4-6 pozycji).

ASM - kod źródłowy assemblera

CLIST - skrypt w języku CLIST (wzbogacony język TSO)

COBOL - kod źródłowy języka COBOL (obsługa starych baz danych)

DATA - tekst (tylko duże litery)

FORT - kod źródłowy języka FORTRAN

LIST - listingi

LOAD - moduły ładowalne

PLI - kod źródłowy PL/I

TEXT - tekst (małe i duże litery)

3 -> Utilities
2 -> Data Set

Date Set Name: zbior1.text


Option: A (allocate)

Następnie:
Space units: KB
Primary quantity: 40
Secondary quantity: 10
Directory blocks: 0
Record format: FB
Record length: 80
Block size: 0
Data set name type:

Następnie tak samo tworzymy bibl1.text zmieniając jedynie:


Dir Blocks: 10
Secondary quantity: 40
Data set name type: PDS

Możemy utworzone Data Set przejrzeć z menu Dslist


3 -> Utilities
4 -> Dslist

EDYCJA:
2 -> Edit
Tam w Data Set Name wpisujemy nazwe zbioru (np. zbior1.text)
Następnie przechodzimy do menu edycji

Literką "d" wpisaną na czerwonym znaku "=" powodujemy, że znika to, co zaznaczymy
==> RECOVERY ON
I - Insert
D - Deleat
R - Repeat (kopia wiersza poniżej)
Dodając liczbę przy danym poleceniu można zastosować je do wielu linii, np. I3, D5, R2
C - Copy (takze mozna podac ilosc linii)
M - Move (także można podać ilość linii)
B - Before
A - After
Operacje kończące:
F3 - Exit (zapis i koniec)
F12 - Cancel (koniec bez zapisu)
SAVE - zapis (==> SAVE)
menu File -> Save
=> RECOVERY ON
=> UNDO (przywraca stan z przed wykonania ostatniego polecenia
Operacje na kolumnach tekstu:
COLS - pokazuje podział tekstu na kolumny
)n - przesunięcie o n kolumn w prawo
(n - przesunięcie o n kolumn w lewo
n - liczba
podwójne nawiasy przesuwają ograniczony nimi blok tesktu:
((n - w lewo o n kolumn
((

))n - w prawo o n kolumn


))
Podobnie:
>n
<n
>>n
<<n

Kopiowanie/przesuwanie niepustych obszarow z danej linii do pustych obszarów innej linii:


Uwaga: źródło może być tylko jedno, a obszarów docelowych wiele.
C/M
O
OO
OO

Operacje na zbiorze (z menu Dslist):


slash przed nazwa pliku (trzeba zostawic spacje), tzn.:
/ BANASIP.ZBIOR1.TEXT
Otwiera się menu: Data Set List Actions
gdzie wybieramy -> 17 copy
a następnie wpisujemy
Data Set Name: zbior2.text
Okazuje się, że dany zbiór nie jest zaalokowany, więc trzeba go było najpierw utworzyć

x -> Keep Data Set -> logoff

Aby skopiować zbiór, to docelowy też musi istnieć.


Skopiować zbiór sekwencyjny: ZBIOR1.TEXT do zbioru PDS'owego BIBL1.TEXT

Z menu Dslist wypisujemy wszystkie zbiory i wybieramy slashem ZBIOR1.TEXT


Z menu wybieramy -> 17 copy
Następnie jako nową nazwę:
Data Set Name: BIBL1.TEXT
a potem pole:
New Member Name: EL1

Uwaga: zamiast podawać Data Set Name można podać:


Project: BANASIP
Group: BIBL1
Type: TEXT

Podane przez nas EL1 lub EL2 jest zbiorem, który kopiujemy.

W tym momencie padł emulator :>...

Inne metody kopiowania:


SM (zamiast TSO)
SMCOPY - alokuje(tworzy) dane zbiory
FDS(nazwa1) - skrót od FROMDATASET
TDS(nazwa2) - skrót od TODATASET -- można zamiennie stosować krótkie/długie nazwy poleceń
dodatkowy operator NOTRANS (no translation), który powoduje, że nie jest wykonywana domyślna podmiana małych liter na duże

Ograniczenia:
Rekordy formatu tylko F->F lub V->V (nie da się z niezdefiniowalnym formatem, czyli U), zblokowane lub nie
Drogi kopiowania:
PS -> PS lub PS -> member PDS
member PDS -> member PDS lub member PDS -> PS
Nie można: PDS -> PDS -- potrzebny jest do tego IEBCOPY
Długość rekordów <= 256 B

Przykład polecenia:
COPY FDS ('SYS1.PARMLIB(ABC)') TDS ('MOJA.KOPIA1') NOTRANS

TRANSMIT:
- nodeid.userid
gdzie nodeid -> parametr pozycyjny (nazwa komputera znana użytkownikowi, np. TSTMVS01)
a userid -> nazwa logowania
potem:
- DA(nazwa) - skrót od DATASET

RECEIVE

DELETE - usuń
END - na później (wstrzymaj)
[enter]
DATASET(inna.nazwa)

Przechodzimy do linii poleceń -> 6 i tam wpisujemy:


SMCOPY FDS (ZBIOR1.TEXT) TDS (BIBL1.TEXT) NOTRANS

Skopiować ZBIOR1.TEXT (sekwencyjny) do ZBIOR2.TEXT (sekwencyjny) i do BIBL3.TEXT(EL1) (PDS), gdzie EL1 to member

polecenie PA1 z klawiatury przerywa wykonywanie polecen w TSO


SMCOPY FDS (ZBIOR1.TEXT) TDS (BIBL1.TEXT(BANASIP)) NOTRANS
SMCOPY FDS (ZBIOR1.TEXT) TDS (BIBL3.TEXT(EL1)) NOTRANS

polecenie TRANSMIT (nie działa z pustymi zbiorami danych):


TRANSMIT TSTMVS01.BANASIP DA(ZBIOR1.TEXT), potwierdzenie
RECEIVE
a następnie z poziomu RECEIVE:
DA (ZBIOR1.KOPIA)
alternatywnie można zrezygnować:
END -- można wtedy ponownie RECEIVE
DELETE -- trzeba wówczas od nowa transmitować

kopiowanie PDSa:

TRANSMIT TSTMVS01.BANASIP DA(BIBL1.TEXT) MEMBERS(member1,member2,...), potwierdzenie


np. za member1 wpisujemy EL1, EL2, itd., by te wybrane fragmenty skopiował

Znów padł serwer :P

Teoria:
MESSAGE
MSGDAY(nazwa)
put.NAMES.TEXT
-> :nick.JA :node.TSTMVS01
:userid.nazwa-użytkownika
:name.JAN KOWALSKI
:nick.TY ...
przed tym mogą też być:
:prolog
:epilog
ALLOCATE, skrótowo: ALLOC - przydzielanie zbiorów aplikacjom
Operandy:
DATASET(nazwa_zbioru) FILE(nazwa_pliku) SYSIN / SYSOUT / SYSUT1, skrótowo: DA
NEW \ - nowoutworzony
SHR = rodzaj dostępu - shareable (współdzielony) - dostęp tylko do odczytu, niewyłączny, zbiór istnieje
OLD / - zbiór istnieje, dostęp do zapisu i odczytu, wyłączny
MOD / - jeśli zbiór nie istnieje, to NEW, a jeśli istnieje i jest sekwencyjny to dostęp wyłączny, dopisywanie

Przeznaczenie po zakończeniu:
DELETE - usunąć
KEEP - zachować
CATALOG - zachować + dopisać do katalogu systemowego
UNCATALOG - zachować, ale wpis usunąć z katalogu systemowego

DSORG(organizacja zbioru)
PS - sekwencyjny
PO - PDS

RECFM(format)
F[B] - rekord o stałej długości [zblokowany]
V[B] - rekord o zmiennej długości [zblokowany]
U - rekord o nieokreślonej długości [zblokowany]
uwaga: B oznacza, czy jest zblokowany, czy nie

Jednostki miary:
TRACKS - ścieżki na dysku (przyklad: no 3390 ok. 54kB)
CYLINDERS - cylindry na dysku
BLOCK(n) - gdzie n to ilość bajtów

Ilość miejsca w powyższych jednostkach:


SPACE(n1,n2) - n1 pierwotna, n2 dodatkowa
porównywalne: SPACE(1,1) BLOCK(1024)
SPACE(54,54)
DIR(n) - gdzie n ilość bloków katalogu w PDS
BLKSIZE(n) - gdzie n całkowita krotność LRECL

Nowe haslo nie moze byc takie samo, jak poprzednie !

Z linii poleceń utworzyć pliki:


-> 6 Command
Uwaga: Można kopiować ostatnio wprowadzone polecenie, zaznaczając je, a następnie [Enter]

NOWY1.TEXT
- sekwencyjny
- rekordy stałej długości
- długość rek. 80
- jednostka miary 1024B
- pierw. 10
- dodatk. 15

ALLOCATE DATASET(NOWY1.TEXT) NEW CATALOG DSORG(PS) RECFM(F,B) LRECL(80) BLOCK(1024) SPACE(10,15)


BLKSIZE(400), gdzie 400 jest wielokrotnością 80

SKRYPTY.CLIST
- PDS
- rekordy stałej długości
- długość rek. 80
- jednostka miary TRACKS //(odpowiada BLOCK(80))
- pierw. 1
- dodatk. 1

ALLOCATE DATASET(SKRYPTY.CLIST) NEW CATALOG DSORG(PO) RECFM(F) LRECL(80) TRACKS SPACE(1,1) DIR(10)

Aby sprawdzic, co utworzylismy przechodzimy do menu glownego, a potem:


-> 3 Utilities
-> 4 Dslist
-> szukamy swoich plikow (BANASIP.*)
a potem przy wybranym pliku stawiamy I (info)

Usuwanie z linii poleceń:


DELETE nazwa
DELETE (nazwa1,nazwa2)

IEBGENER - generator PDSow z sekwencyjnych


- wymaga 4 plików:
FILE(plik z aplikacji)
SYSIN - "*" oznacza domyślne miejsce pobierania (klawiatura)
SYSPRINT - "*" oznacza domyślne miejsce wypisywania (monitor)
SYSUT1 - zbiór wejściowy danych (sekwencyjny)
SYSUT2 - zbiór wyjściowy (PDS)
- wywołanie z podaniem, gdzie program się mieści, sam program (IEBGENER) jest memberem do biblioteki:
- CALL 'SYS1.LINKLIB(IEBGENER)'

Edit, prefix, SKRYPTY, CLIST

W utworzonym pliku SKRYPTY.CLIST edytujemy membery:


Z menu głównego:
-> 2 Edit
Project: BANASIP
Group: SKRYPTY
Type: CLIST
Member: memb1 (dowolna nazwa membera)

Edytujemy:
ALLOC DA(*) FILE(SYSPRINT)
ALLOC DA(NOWY1.TEXT) FILE(SYSIN) SHR REUSE
ALLOC DA(ZBIOR1.TEXT) FILE(SYSUT1) SHR
ALLOC DA(WYNIK1.TEXT) FILE(SYSUT2) LIKE(ZBIOR1.TEXT) DSORG(PO) DIR(10)
CALL 'SYS1.LINKLIB(IEBGENER)'

Następnie zachować i wyjść


Uwaga !!!
NOWY1.TEXT, ZBIOR1.TEXT - sekwencyjne (PS)
WYNIK1.TEXT - PDS

Kolejnym krokiem jest edycja pliku wejściowego (u nas ZBIOR1.TEXT)


W podanym pliku dodajemy linie (przedzielające już inne wcześniej istniejące linie !!!) oznaczone indeksami:

bla
bla
#1
pierwsza wyrozniona linia
bla
#2
druga wyrozniona linia
bla
#3
trzecia wyrozniona linia
bla
bla

Potem edytujemy NOWY1.TEXT:

GENERATE MAXNAME=4,MAXGPS=3
MEMBER NAME=MEM1
RECORD IDENT=(2,'#1',1)
MEMBER NAME=MEM2
RECORD IDENT=(2,'#2',1)
MEMBER NAME=MEM3
RECORD IDENT=(2,'#3',1)
MEMBER NAME=MEM4
/*

Uwaga:
Wszystkie linie poza /* muszą być w drugiej lub dalszej kolumnie
MAXNAME LICZBA POWSTAJACYCH PLIKOW
MAXGPS LICZBA ZNACZNIKOW
MAXNAME oznacza ilość znaczników
MAXGPS oznacza ilość znaków, z których składa się znacznik
W polach RECORD IDENT cyfra 2 oznacza ilość znaków (długość znacznika), a cyfra 1 - od której linii(kolumny) się znacznik zaczyna

Uruchomienie w konsoli COMMAND poprzez:


EXEC nazwa_skryptu(member)
tzn.
EXEC SKRYPTY.CLIST(MEMB1)

Pojawiał mi się błąd, ale po poprawkach już powinno być ok:


IEB342I INVALID SPACE ALLOCATION

Skrypt do kopiowania zbiorów PDS:

Edycja skryptu SKRYPTY.CLIST(MEMB2):


ALLOC DA(NOWY2.TEXT) FILE(SYSIN) SHR REUSE
ALLOC DA(*) FILE(SYSPRINT)
ALLOC DA(SKRYPTY.CLIST) FILE(SYSUT1) SHR REUSE
ALLOC DA(WYNIK2.TEXT) FILE(SYSUT2) LIKE(SKRYPTY.CLIST) DIR(10)
CALL 'SYS1.LINKLIB(IEBCOPY)'

Uwaga !!!
NOWY2.TEXT - sekwencyjny (PS)
WYNIK2.TEXT, SKRYPTY.CLIST - PDS
W pliku NOWY2.TEXT należy wpisać:

COPY INDD=SYSUT1,OUTDD=SYSUT2
/*

Uruchomienie skryptu:
EXEC SKRYPTY.CLIST(MEMB2)

Pojawiał mi się błąd, ale po poprawkach już powinno być ok:


A command entered or contained in a CLIST has invalid syntax.

Zamiana małych liter na duże:


C p'<' p'>' all

C oznacza change
< oznacza małą literę
> oznacza duza litere

Kopiowanie z podaniem parametrów:


Na początku skryptu CLIST mozna określic parametry wejsciowe
PROC n parampoz1 parampoz2 ... parampozn parampoz() parampoz2()
n - ilosc parametrow pozycyjnych (moze byc 0)
parampoza() - parametry niepozycyjne, wart. domyslna
&parampoz1, &param1 - uzycie

np.
PROC 1 ZBWE ZBWY(ZBIOR.TMP)
...
ALLOCATE DA(&ZBWE) FILE(SYSUT1) SHR REUSE
ALLOC DA(&ZBWY) LIKE (&ZBWE)

uwaga: REUSE - zamiast później ew. używać free file(...)

Wywołanie:
exec skrypty.clist(memb2) 'bibl1.text ZBWY(WYNIK2.TEXT)'

uwagi:
* cała lista parametrów w apostrofach
* ZBWY - nazwa parametru niepozycyjnego

Przesyłanie:
=> receive
=> transmit tstmvs01.banasip da(skrypty1.text) msgda(skrypty1.text)
=> EXEC skrypty(skrypt2)

===> ALLOC DATASET(SKRYPTY.CLIST) new catalog DSORG(PO) RECFM(F,B) LRECL(80) TRACKS space(1,11) DIR(10)
=>smcopy FDS() TDS() NOTRANS

You might also like