Mainframe Dla Początkujacych

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

description

Kilka stron notatek z podstaw Mainframe. W większym lub mniejszym stopniu przybliżą o co chodzi w podstawach.

Transcript of Mainframe Dla Początkujacych

Page 1: Mainframe Dla Początkujacych

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

Page 2: Mainframe Dla Początkujacych

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

Page 3: Mainframe Dla Początkujacych

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)

Page 4: Mainframe Dla Początkujacych

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

Page 5: Mainframe Dla Początkujacych

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

Page 6: Mainframe Dla Początkujacych

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ć:

Page 7: Mainframe Dla Początkujacych

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

Page 8: Mainframe Dla Początkujacych

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ść

Page 9: Mainframe Dla Początkujacych

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

Page 10: Mainframe Dla Początkujacych

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