その2:メインフレームOSのシステム生成がやってみたい！:MVS3.8Jディストリビューションライブラリのビルド

# MVS3.8Jディストリビューションライブラリのビルド

以下の手順の所要時間は約90分です(VirtualBox環境)。
MVS3.8JディストリビューションテープイメージやPTFテープイメージから、DASDボリューム上の所定のデータセットにライブラリをビルドしていくのが以下の手順になります。結構長いですが、その3でいよいよSYSGENしますので、あともう少しです。

## 追加のDASDボリュームの作成
「**<font color="red">./create.dasd.sh dlibs</font>**」で、MVSスタータシステム用のDASDボリュームの「dasd/work00.3350」、「dasd/ work01.3350」、「dasd/ work01.3350」 の3つを作ります。

```bash:
$ pwd
/home/hercules/mvs
$ ./create.dasd.sh dlibs
This script creates DASD volumes for MVS 3.8j.
Changed directory to: /home/hercules/mvs/dasd
HHCDU044I Creating 3350 volume 111111: 560 cyls, 30 trks/cyl, 19456 bytes/track
HHCDU041I 560 cylinders successfully written to file work00.3350
HHCDI001I DASD initialization successfully completed.
HHCDU044I Creating 3350 volume 222222: 560 cyls, 30 trks/cyl, 19456 bytes/track
HHCDU041I 560 cylinders successfully written to file work01.3350
HHCDI001I DASD initialization successfully completed.
HHCDU044I Creating 3350 volume 333333: 560 cyls, 30 trks/cyl, 19456 bytes/track
HHCDU041I 560 cylinders successfully written to file smp000.3350
HHCDI001I DASD initialization successfully completed.
Script completed successfully!
```

## MVSジョブステップの完了コードを簡単に確認するスクリプト
MVSは、各ジョブステップの終わりに完了コード(リターンコード)を返しますが、これから実行していくジョブの実行結果リストには非常に沢山のメッセージが出力されます。この中から期待値の完了コードが出力されているか目視で確認するのは骨が折れます。

完了コードは、接頭辞が「IEF142I」という行に記載されていますので、この文字列を検索することによって完了コードを見つけることができます。
次の2つのスクリプトはこの完了コードを検索するスクリプトです。UnixでもIBMメインフレームでも動くREXXスクリプトもよいですが、インストールしていないので、以下Perlスクリプトで確認しています。

Perlスクリプト- condcode.pl
REXXスクリプト- condcode.rexx

```text:書式：
{condcode.pl | condcode.rexx} <印刷ファイル名> <MVSジョブ名>
```

```bash:例：SYSOUTリストの「prt00e.txt」のジョブ名「smp4p44」の完了コードを確認する。
condcode.pl prt00e.txt smp4p44
```

完了コードの各値は、各ジョブステップのSYSOUTで指定されているメッセージクラスに対応しているプリンタデバイスに出力されます。
SYSOUTリストはプリンタデバイスに出力されると書きましたが、これは、Hercules設定ファイルで指定された、I/Oデバイスアドレスに割り当てられたホストOSのファイルに書き出されます。
例えば、「conf/smp1.cnf」ファイルの中に、次の行があります。

```text:
000E    1403    prt00e.txt
```

これは、I/Oデバイスアドレス0x00eにデバイス番号=1403(プリンタデバイス)を設定し、このプリンタデバイスは「prt00e.txt」を指しています。
この例ではフルパスで「prt00e.txt」を記述していないので、Herculesコマンドをどのディレクトリで動かすかで、このファイル出力先が変わります。

## MVSスターターシステムのハードウェア構成
MVSスターターシステムは、MVS3.8Jより前のリリースである3.7で出来ています。
スタータシステムのハードウェア構成図は、[OS/VSシステム生成リファレンスp25-p26ページのPDF](http://www.jaymoseley.com/hercules/downloads/pdf/GC26-3792-p25-26.pdf) にあります。
これを見ると沢山のハードウェアで構成されていますが、今回はテープイメージをDASDボリュームの所定のデータセットにロードするだけなので、このハードウェア構成で行けます。

![image](https://qiita-image-store.s3.amazonaws.com/0/76786/60d1fda3-b18d-b712-18d9-e4a4f9154c97.png)

## MVSスターターシステムの起動
TeraTermを3つ立ち上げておきます。一つはHerculesエミュレータ画面用。もう一つはマスタコンソール画面用です。もう一つは、完了コード確認用画面です。

Herculesエミュレータ画面のTeraTermで、「**<font color="red">hercules -f conf/smp1.cnf</font>**」を入力し、「**<font color="red">Enter</font>**」キーを入力します。

```bash:Herculeエミュレータ画面
$ pwd
/home/hercules/mvs
$ hercules -f conf/smp1.cnf
```

すると、Herculesエミュレータが実行を開始し、設定ファイルをロードし、次のメッセージが表示されます。

```bash:Herculeエミュレータ画面
HHCPN001I Control panel thread started: tid=B77416D0, pid=3806
HHCAO001I Hercules Automatic Operator thread started;
          tid=B6569B70, pri=0, pid=3806
Command ==>
CPU0000 PSW=0000000000000000 24M.......                              instcount=0
```

Herculesエミュレータは、Hercules設定ファイルで指定されたI/Oデバイス0x01Fで指定された、コンソールデバイスに接続するTelnetクライアントのセッションを待っています。
マスタコンソール画面用のTeraTermに切り替え、「**<font color="red">telnet localhost 3270</font>**」と入力し、「**<font color="red"> Enter</font>**」キーを入力します。

```bash:マスタコンソール画面
$ telnet localhost 3270
```

すると、0x01Fデバイスに接続したとマスタコンソール画面に表示されます。


```bash:マスタコンソール画面
Connected to device 0:001F
```

Herculesエミュレータ画面に切り替えると、こちらも同様に接続したと表示されています。

```bash:Herculeエミュレータ画面
HHCTE009I Client 127.0.0.1 connected to 3215 device 0:001F
Command ==>
CPU0000 PSW=0000000000000000 24M.......                              instcount=0
```

次は、スターターシステムのIPLです。Herculeエミュレータ画面に切り替え、コマンドラインに「**<font color="red">ipl 150</font>**」と入力し、「**<font color="red"> Enter</font>**」キーを入力します。
これは、I/Oデバイスアドレス0x150の3330 DASDボリュームからMVS 3.7オペレーティングシステムをロードするように指示しています。

```bash:Herculeエミュレータ画面
HHCTE009I Client 127.0.0.1 connected to 3215 device 0:001F
Command ==> ipl 150
CPU0000 PSW=0000000000000000 24M.......                              instcount=0
```

しばらくすると、次のような画面となります。

```bash:Herculeエミュレータ画面
HHCCP048I 0170:CCW=03000000 20000001=>040E0000 0001AB6E 00000000 00000000 ......
HHCCP075I 0170:Stat=0200 Count=0001
HHCCP076I 0170:Sense=40220000 00C00300 00000000 00800100 010000FF FF000000
HHCCP077I 0170:Sense=INTREQ EOC WRI
Command ==>
CPU0000 PSW=070E000000000000 24..W.....                        instcount=507,929
```

マスタコンソール画面に切り替えると、次のように表示されます。

```bash:マスタコンソール画面
IEA101A SPECIFY SYSTEM PARAMETERS FOR RELEASE 03.70.VS2
HHCTE006A Enter input for console device 001F
```

メッセージID=IEA101Aは、MVS3.7がロードされたことを示しています。
次に「Enter input console」とありますので、「**<font color="red">r 0,clpa</font>**」と入力し、「**<font color="red">Enter</font>**」キーを入力します(注意:rとゼロの間は、空白があります)。少し時間がかかります。

CLPA:「Create LPA」の意味。
LPA:「Link Pack Area」の略。OSの中核以外のシステム常駐モジュールが配置される仮想記憶内の領域のことです。
CLPAが指定されると、ロードライブラリから全モジュールをLPA領域に再構築し、ページデータセットに書き込みます。
全くの新規で、一度もLPA領域を再構築してページデータセットに書き込んでいなかったり、システム常駐モジュールを修正したときは、CLPAを指定します。

しばらくすると、次のようなJES2(Job Entry Subsystem 2)からのメッセージが表示されます。

```bash:マスタコンソール画面
 IEF165I // START JES2
 IEE351I SMF SYS1.MAN RECORDING NOT BEING USED
*00 $HASP426 SPECIFY OPTIONS - HASP-II, VERSION JES2 4.0
```

メッセージの先頭にアスタリスク(**<font color="red">\*</font>**)がついているものがあります。
これは、JES2がオペレータに対して、何らかの応答の入力をするように促しています。次の「**<font color="red">00</font>**」応答要求の連番です。JES2からオペレータに対して連続して応答要求するときがあるので、オペレータはどの連番に対して応答するかを示す必要があり、その時にこの連番を指定します。

注意:
以下の手順で出てくるマスタコンソール画面イメージに表示される、応答要求の連番は、あなたのコンソール画面に表示されれている連番ともしかしたら違うかもしれません。その時は、あなたのコンソール画面に表示されているアスタリスク(*)の後ろの連番を入力してください。あと、頭ゼロは省略可能です。ゼロゼロと入力してもよいですし、ゼロと入力してもよいです。

次に、「**<font color="red">r 0,format,noreq</font>**」と入力し、「**<font color="red"> Enter</font>**」キーを入力します(注意:rとゼロの間は、空白があります)。

この応答の意味ですが、
「**<font color="red">r</font>**」：これから応答するという意味。
「**<font color="red">0</font>**」：JES2からの応答要求連番「**<font color="red">\*00</font>**」に対する応答であるという意味。
「**<font color="red">format</font>**」：今回、初めてJES2を動かすので、 スプール領域のフォーマットをするようにJES2に伝えています。
「**<font color="red">noreq</font>**」：直ぐにこのコマンドを実行するようにJES2に伝えています。

スプール(spool):
カードリーダやプリンタなどの周辺機器は、CPUの処理速度と比べると、非常に低速です。複数のジョブがプリンタを直接操作しようとすると、プリンタの処理速度に引きずられて遅くなってしまいます。プリンタとコンピュータの間に印刷スプール(メモリもしくはディスク)を設け、ジョブはここに印刷情報を書き込んでしまって、先に進む。プリンタ自身がが印刷できる状態になったら、スプールは、あたかもミシンに取り付けてあるボビンから糸を引っ張るように、印刷情報を取り出して印刷します。
[wikipedia:スプーリング](https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%97%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0)


すると、次のメッセージが表示されます。

```bash:マスタコンソール画面
r 0,format,noreq
 IEE600I REPLY TO 00 IS;SUPPRESSED
*01 $HASP436 REPLY Y OR N TO CONFIRM CHECKPOINT RECORD CHANGE
```

これはフォーマット後のこのスプールでJES2が開始されたのが今回が初めてなので、チェックポイントを書き込むかどうかを要求しています。
「**<font color="red">r 1,y</font>**」入力し、「**<font color="red">Enter</font>**」キーを入力します。
しばらくすると、「**<font color="red">ALL AVAILABLE FUNCTION COMPLETE</font>** 」と表示され、JES2の初期化が完了となります。

```bash:マスタコンソール画面
*01 $HASP436 REPLY Y OR N TO CONFIRM CHECKPOINT RECORD CHANGE
r 1,y
 IEE600I REPLY TO 01 IS;SUPPRESSED
 $HASP423 SPOOL0 IS BEING FORMATTED
 IEE041I THE SYSTEM LOG IS NOW ACTIVE
 $HASP160 PRINTER1 INACTIVE - CLASS=AJ
 $HASP160 PUNCH1   INACTIVE - CLASS=BK
 $HASP125 READER1  SKIPPING FOR JOB CARD
 $HASP100 INIT     ON STCINRDR
 $HASP373 INIT     STARTED
 $HASP100 INIT     ON STCINRDR
 $HASP373 INIT     STARTED
 $HASP100 INIT     ON STCINRDR
 $HASP373 INIT     STARTED
 $HASP309    INIT  1 INACTIVE ******** C=A
 $HASP309    INIT  2 INACTIVE ******** C=BA
 $HASP309    INIT  3 INACTIVE ******** C=CBA
 $HASP099 ALL AVAILABLE FUNCTIONS COMPLETE
```

マスタコンソール画面の下の方に、INIT １、INIT 2、INIT 3 と3つのイニシエータがあり、「INCATIVE」状態、つまり、実行待ち状態にあります。
以下の手順では、単一の実行空間でジョブを動かしたいので、イニシエータの2と3を止めます。
「**<font color="red">$pi2-3</font>**」入力し、「**<font color="red"> Enter</font>**」キーを入力します。

```bash:マスタコンソール画面
$pi2-3
 $HASP000 OK
 $HASP395 INIT     ENDED
 $HASP150 INIT     ON PRINTER1
 $HASP160 PRINTER1 INACTIVE - CLASS=AJ
 $HASP099 ALL AVAILABLE FUNCTIONS COMPLETE
 $HASP250 INIT     IS PURGED
 $HASP395 INIT     ENDED
 $HASP150 INIT     ON PRINTER1
 $HASP160 PRINTER1 INACTIVE - CLASS=AJ
 $HASP099 ALL AVAILABLE FUNCTIONS COMPLETE
 $HASP250 INIT     IS PURGED
```

これで、MVSスタータシステムは、ジョブおよびサービスオペレータコマンドを処理する準備ができました。
以降の手順で、いくつかのJCLを実行してMVS3.8ディストリビューションライブラリを所定のデータセットにロードしていきます。

## ハードウェア構成変更(冒頭の3つのDASDボリュームを接続)
ところで、最初のジョブを実行する前に、ハードウェア構成を変更する必要があります。
冒頭で作成した、3つのDASDボリュームは、smp1.cnfのHercules設定ファイルで定義されていません。
これは、意図的にHercules設定ファイルで**<font color="red"> 定義しない</font>**ようにしています。

これは、以下の手順の中で、これらのDASDボリュームを初期化するためです。

Herculesエミュレータが「アクティブ」中にDASDボリュームを追加するには、次のスクリプトをHerculeエミュレータで実行します。
Herculesエミュレータ画面のコマンドラインに、「**<font color="red">script conf/dlibs.script</font>** 」と入力し、「**<font color="red"> Enter</font>**」キーを入力します。

```bash:Herculeエミュレータ画面
Command ==> script conf/dlibs.script
CPU0000 PSW=070E000000000000 24..W.....                     instcount=42,926,023
```

すると、次のようなメッセージがHerculesエミュレータ画面に表示され、3つのDASDボリュームが接続されています。

```bash:Herculeエミュレータ画面
script conf/dlibs.script
#
####################################################################
#                HERCULES EMULATOR SCRIPT FILE                     #
####################################################################
#
# use for attaching new dasd volumes during distribution library build
#
attach 148 3350 dasd/smp000.3350
HHCDA020I dasd/smp000.3350 cyls=560 heads=30 tracks=16800 trklen=19456
attach 149 3350 dasd/work00.3350
HHCDA020I dasd/work00.3350 cyls=560 heads=30 tracks=16800 trklen=19456
attach 14a 3350 dasd/work01.3350
HHCDA020I dasd/work01.3350 cyls=560 heads=30 tracks=16800 trklen=19456
HHCPN013I EOF reached on SCRIPT file. Processing complete.
Command ==>
CPU0000 PSW=070E000000000000 24..W.....                     instcount=43,123,469
```
## MVSスターターシステムにSMP4(システム修正変更プログラムリリース4) をロード
DASDにMVS3.8Jディストリビューションテープイメージをロードするには、SMP4(システム修正変更プログラムリリース4)が事前にロードされている必要があります。
最新のSMP4ロード・モジュールは、SMP4バージョン4.22が格納されたテープイメージ(smp4b.het)にありますが、このテープに格納されたロードモジュールだけでは、MVS3.8Jを構築するのに必要なライブラリが全てそろっていません。
まずは、MVS3.8Jディストリビューションテープイメージ(product.het)からSMP4ロード・モジュールを構築するために必要なオブジェクトをロードして、その次にSMP4バージョン4.22が格納されたテープイメージ(smp4b.het) をロードします。

SMP4のロードでは、大きく次の3つを行います。

- SMP4ロード・モジュールを、START1 DASDボリュームのSYS1.LINKLIBに配置。
- インストールに必要なJCLをSTART1 DASDボリューム上SYS1.PROCLIBに配置。
- 冒頭の3 DASDボリュームを初期化。

では、順にやっていきます。

Herculeエミュレータ画面のコマンドプロンプトで、「**<font color="red">devinit 12 jcl/smp4p44.jcl eof</font>**」と入力し、「**<font color="red">Enter</font>**」キーを入力します。

devinit 12:I/Oデバイスアドレス0x12(3505カードリーダ)を初期化するにHerculesエミュレータに指示しています。
jcl/smp4p44.jcl:これからカードリーダに読み込ませるJCLのファイルパスをHerculesエミュレータに指示しています。
eof:ファイルの内容が完全に読み込まれたことを、Herculesに指示します。

```bash:Herculeエミュレータ画面
Command ==> devinit 12 jcl/smp4p44.jcl eof
CPU0000 PSW=070E000000000000 24..W.....                     instcount=43,824,688
```

マスタコンソール画面に切り替えると、次のようなメッセージが表示されています。

```bash:マスタコンソール画面
 $HASP100 SMP4P44  ON READER1     SMP 4.44 FROM MVS38J
 $HASP104 SMP4P44  ************************************************************
 $HASP104 SMP4P44  * An IPL is required after this job has completed!!!       *
 $HASP104 SMP4P44  ************************************************************
 $HASP373 SMP4P44  STARTED - INIT  1 - CLASS A - SYS H158
 IEF244I SMP4P44 S1 - UNABLE TO ALLOCATE 1 UNIT(S)
         AT LEAST 1 OFFLINE UNIT(S) NEEDED.
 IEF489I SMP4P44 - 1 UNIT(S) NEEDED FOR I1
 IEF247I SMP4P44 - 182,183,184,170,171 OFFLINE
 IEF247I SMP4P44 - 282,283,284,382,383,384,482,483,484,582 NOT ACCESSIBLE
 IEF247I SMP4P44 - 583,584,682,683,684,270,271,370,371,470 NOT ACCESSIBLE
 IEF247I SMP4P44 - 471,570,571,670,671 NOT ACCESSIBLE
*02 IEF238D SMP4P44 - REPLY DEVICE NAME OR 'CANCEL'.
```

メッセージID=IEF238Dの前にアスタリスク(\*)がついています。これは、オペレータからの応答を待っています。
このメッセージは、OSがテープデバイスにテープを掛けるか、CANCELするかを求めています。

ジョブのステップS1は、ボリュームシリアル番号MVS38Jとテープ上の既存のファイルを開こうとしていますが、これが格納されているテープイメージは、「product.het」です。

Herculesエミュレータ画面のコマンドプロンプトに「**<font color="red">devinit 170 tape/product.het</font>**」と入力し、「**<font color="red">Enter</font>**」キーを入力します。

deviceinit 170:I/Oデバイスアドレス0x170(3420テープ装置)に
tape/product.het:「tape/product.het」テープイメージを取り付けたとHerculesエミュレータに指示しています。

```bash:Herculeエミュレータ画面
Command ==> devinit 170 tape/product.het
CPU0000 PSW=070E000000000000 24..W.....                     instcount=45,728,713
```

マスタコンソール画面に切り替え、先ほどからアスタリスク(\*)付きのメッセージID=IEF238Dが表示されているので、これに応答します。
テープ装置にテープが取り付けてあるので、「**<font color="red">r 2,170</font>**」と入力し、「**<font color="red">Enter</font>**」キーを入力します。

```bash:マスタコンソール画面
r 2,170
 IEE600I REPLY TO 02 IS;170
 IEC502E K 170,MVS38J,SL,SMP4P44,S2
*IEC501A M 170,T74172,SL,6250 BPI,
 IEC501A SMP4P44,S2
```

メッセージID=IEC502Eは、I/Oデバイスアドレス0x170のテープ装置でプログラムのロードが終了したことを示す通知メッセージです。
メッセージID=IEC501Aは、このジョブで新しいテープが必要であるという通知メッセージです。アスタリスク(\*)がついているので、オペレータからの何らかの応答を待っています。
このメッセージでは、ボリュームシリアル番号T74172のテープイメージを、I/Oデバイスアドレス0x170に取り付けることを要求しています。ここで取り付けるテープイメージは、「smp4b.het」です。

Herculesエミュレータ画面に切り替え、コマンドプロンプトに「**<font color="red">devinit 170 tape/smp4b.het</font>**」と入力し、「**<font color="red"> Enter</font>**」キーを入力します。

```bash:Herculeエミュレータ画面
Command ==> devinit 170 tape/smp4b.het
CPU0000 PSW=070E000000000000 24..W.....                     instcount=53,191,993
```

マスタコンソール画面に切り替えると、次のようなアスタリスク(\*)付きのメッセージを表示し、オペレータからの応答を待っています。

```bash:マスタコンソール画面
*IEC507D E 150,START1,SMP4P44,S2,
 IEC507D SYS1.PROCLIB
*03 IEC507D REPLY 'U'-USE OR 'M'-UNLOAD
```

メッセージID=IEC507Dは、プログラムがSTART1 3330 DASDボリューム上のデータセットをSYS1.PROCLIBを変更しようとしていることを通知しています。
これは、変更しなければならないので、**<font color="red">"U"</font>**を応答します。
マスタコンソール画面に、「**<font color="red">r 3,u</font>** 」と入力し、「**<font color="red"> Enter</font>**」キーを入力します。

続いて、SYS1.PROCLIB、SYS1.LINKLIBについても同じように変更しなければならないので、**<font color="red">"U"</font>** で応答します(この例では3,4,5)。

```bash:マスタコンソール画面
r 3,u
 IEE600I REPLY TO 03 IS;U
 IEF234E K 170,T74172,PVT,SMP4P44,S2
*IEC507D E 150,START1,SMP4P44,LK,
 IEC507D SYS1.LINKLIB
*04 IEC507D REPLY 'U'-USE OR 'M'-UNLOAD
r 4,u
 IEE600I REPLY TO 04 IS;U
*IEC507D E 150,START1,SMP4P44,S4,
 IEC507D SYS1.PROCLIB
*05 IEC507D REPLY 'U'-USE OR 'M'-UNLOAD
r 5,u
 IEE600I REPLY TO 05 IS;U
```

すると、次のようなアスタリスク(\*)付きのメッセージが表示されていると思います。

```bash:マスタコンソール画面
*06 IEH841D 148    CONFIRM REQUEST TO INITIALIZE
```

メッセージID=IEH841Dは、I/Oデバイスアドレス0x148のオフラインDASDボリュームの初期化をオペレータに促す通知メッセージです。
オペレータは、DASDボリュームがマウントされていることを確認します(「script conf/dlibs.script」を先ほど実行しているので、マウントされているはずです。その昔はDASDボリュームをよっこらせと取り付ける時間が必要なので、オペレータの応答要求を待っているのだと思います)。

これも初期化すべきことなので、「**<font color="red">r 6,u</font>** 」と入力し、「**<font color="red"> Enter</font>**」キーを入力します。すると、アスタリスク(\*)付きの 同じメッセージID=IEH841Dが続きますので、その応答連番(この例では6,7,8)に合わせて**<font color="red">"U"</font>**を入力していきます。
I/Oデバイスアドレス0x148x、0x149、0x14aを順々に初期化しています。3つ目の応答後にしばらく待ち発生しますが、ゆっくり待ちます。

```bash:マスタコンソール画面
*06 IEH841D 148    CONFIRM REQUEST TO INITIALIZE
r 6,u
 IEE600I REPLY TO 06 IS;U
*07 IEH841D 149    CONFIRM REQUEST TO INITIALIZE
r 7,u
 IEE600I REPLY TO 07 IS;U
*08 IEH841D 14A    CONFIRM REQUEST TO INITIALIZE
r 8,u
 IEE600I REPLY TO 08 IS;U
```

ちゃんと動いているか、心配になったら、「**<font color="red">D A,L</font>** 」と入力し、「**<font color="red"> Enter</font>**」キーを入力します。すると、現在実行中のジョブが表示されます。
下記例では、SMP4P44ジョブのS5ジョブステップが実行中です。

```bash:マスタコンソール画面
D A,L
 IEE102I 07.29.06 16.156 ACTIVITY 097
    00002 JOBS    00001 INITIATORS
   JES2     JES2     IEFPROC   V=V
   SMP4P44  S5                 V=V
    00000 TIME SHARING USERS
```

これは3つのDASDボリュームをスキャンし、ファイル制御構造を構築し、ラベルを記述するための処理です。完了するまでに数分かかります。
その後、次のメッセージが表示されます。

```bash:マスタコンソール画面
 IEH809I N 148,SMP000,SMP4P44 ,S5
 IEH809I N 149,WORK00,SMP4P44 ,S5
 IEH809I N 14A,WORK01,SMP4P44 ,S5
 IEF471E FOLLOWING RETAINED VOLUMES NO LONGER NEEDED BY SMP4P44
         MVS38J.
 $HASP395 SMP4P44  ENDED
 $HASP150 SMP4P44  ON PRINTER1
 $HASP309    INIT  1 INACTIVE ******** C=A
 $HASP160 PRINTER1 INACTIVE - CLASS=AJ
 $HASP099 ALL AVAILABLE FUNCTIONS COMPLETE
 $HASP250 SMP4P44  IS PURGED
```
$HASP1​​60: 印刷装置=PRINTER1にJES2プリンタタスクが完了したことを示しています。
$HASP099: 全てのジョブの実行が完了し、アイドル状態えあることを示しています。
$HASP250: ジョブ=SMP4P44のためのすべての出力が処理され、JES2キューから削除されたことを示しています。

「prt00e.txt」ファイルにこれまでのジョブ、ジョブステップで発生した実行中のエラーメッセージや、成功のメッセージなどが出力されています。
このファイルを完了コード確認スクリプト「condcode.pl」、もしくは「condcode.rexx」で期待値の完了コードで終了しているか確認します。

もう一つ、TeraTermを起動し、「**<font color="red">./condcode.pl prt00e.txt smp4p44</font>**」と入力し、「Enter」キーを入力します。


```bash:完了コード確認用画面
$ pwd
/home/hercules/mvs
$ ./condcode.pl prt00e.txt smp4p44
Searching prt00e.txt for MVS Job Name smp4p44

Step Name     Proc Step Name  Completion Code
---------     --------------  ---------------
S1                            0000
S2                            0000
S3            LK              0000
S4                            0000
S5                            0000
$
```
今回の期待値は、5つのジョブステップ全てが「0000」です。

もし、上記以外の完了コードであった場合は、この先の手順に進んでも意味がないので、「prt00e.txt」に出力されているメッセージで手がかりにエラー原因を突き止めて、頑張ってそれを修正します。
そして、スナップショットとしてtarに固めたファイルを紐解いて、修正版を適用して再度チャレンジとなります。

「prt00e.txt」 を見ると、ジョブ=SMP4P44のメッセージの冒頭に、次のメッセージがあります。

```bash:prt00e.txtの中身
$HASP104 SMP4P44 ******************************************************
$HASP104 SMP4P44 * An IPL is required after this job has completed!!! *
$HASP104 SMP4P44 ******************************************************
```

これは、MVSスタータシステムのシステム・ロード・ライブラリーに追加されたSMP4のロードモジュールを実行するためには、シャットダウンし、スタータシステム、IPLし直す必要があるということです。よって、システムをシャットダウンします。

マスタコンソール画面に切り替え、「**<font color="red">$p jes2</font>**」と入力し、「**<font color="red"> Enter</font>**」キーを入力します。このコマンドは、正常にシャットダウンするように、JES2に指示しています。すると、次のメッセージが表示されます。

```bash:マスタコンソール画面
 $HASP250 SMP4P44  IS PURGED
$p jes2
 $HASP395 INIT     ENDED
 IEE043I A SYSTEM LOG DATA SET HAS BEEN QUEUED TO SYSOUT CLASS A
 IEE037I LOG NOT ACTIVE
2000 07.33.43 CONSOLE   IEE142I  01F NOW RECEIVING HARDCOPY
4000 07.33.43           IEE043I A SYSTEM LOG DATA SET HAS BEEN QUEUED TO SYSOUT CLASS A
4000 07.33.43           IEE037I LOG NOT ACTIVE
0000 07.33.43           IEF196I IEF142I JES2 JES2 - STEP WAS EXECUTED - COND CODE 0000
0000 07.33.43           IEF196I IEF285I   SYS1.PROCLIB                                 KEPT
0000 07.33.43           IEF196I IEF285I   VOL SER NOS= START1.
0000 07.33.43           IEF196I IEF285I   SYS1.HASPCKPT                                KEPT
0000 07.33.43           IEF196I IEF285I   VOL SER NOS= SPOOL0.
0000 07.33.43           IEF196I IEF285I   SYS1.HASPACE                                 KEPT
0000 07.33.43           IEF196I IEF285I   VOL SER NOS= SPOOL0.
```

これはMVSスタータシステムがパワーダウンが可能であることを示しています。MVSはまだ実行されており、追加のオペレータコマンドを入力できる状態にあります。
「**<font color="red"> z eod</font>**」と入力し、「**<font color="red"> Enter</font>**」キーを入力します。
これは、全てのシステムファイルを閉じて、通常のシャットダウンの準備を指示しています。

```bash:マスタコンソール画面
0000 07.33.43           IEF196I IEF285I   VOL SER NOS= SPOOL0.
z eod
4000 07.34.18           IEE334I HALT     EOD SUCCESSFUL
```

「**<font color="red">quiesce</font>**」と入力し、「**<font color="red"> Enter</font>**」キーを入力します。

```bash:マスタコンソール画面
4000 07.34.18           IEE334I HALT     EOD SUCCESSFUL
quiesce
```

このコマンドは、DASDボリュームに現在のバッファ状態を書き込むためにMVSスタータシステムに指示していします。
これで、Herculesエミュレータをシャットダウンする前に、メモリに保持しているすべての情報がDASDボリュームに書かれます。

Herculesエミュレータ画面に切り替え、「**<font color="red"> quit</font>**」と入力し、「**<font color="red"> Enter</font>**」キーを入力します。Herculesエミュレータは、エミュレートされたメインフレーム・デバイス用のすべてのファイルを閉じて終了します。

```bash:Herculesエミュレータ画面
HHCCP011I CPU0000: Disabled wait state
          PSW=000A0000 00000CCC
Command ==> quit
CPU0000 PSW=000A000000000CCC 24M.W.....                    instcount=388,437,461
```
## MVS3.8Jディストリビューションライブラリのビルド
### MVSスタータシステムの起動
前回と少し異なったハードウェア構成です。先の手順で、3つのDASDボリュームの初期化とSMP4のインストールができましたので、これをハードウェアとして接続しています。

![image](https://qiita-image-store.s3.amazonaws.com/0/76786/c521edf5-f315-a182-1bff-d2c03b7d1175.png)

Herculesエミュレータ画面のTeraTermで、「**<font color="red">hercules -f conf/smp2.cnf</font>**」を入力し、「**<font color="red">Enter</font>**」キーを入力します。

```bash:Herculesエミュレータ画面
$ pwd
/home/hercules/mvs
$ hercules -f conf/smp2.cnf
```

マスタコンソール画面のTeraTermで「**<font color="red">telnet localhost 3270</font>**」を入力し、「**<font color="red">Enter</font>**」キーを入力します。

```bash:マスタコンソール画面
$ pwd
/home/hercules
$ telnet localhost 3270
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Hercules version 3.12 built on May 15 2016 11:28:26
running on localhost.localdoma (Linux-2.6.32-573.26.1.el6.#1 SMP Tue May 3 21:55:43 UTC 2016 i686 UP)
Connected to device 0:001F
```
Herculesエミュレータ画面で、「**<font color="red">ipl 150</font>**」を入力し、「**<font color="red">Enter</font>**」キーを入力します。

```bash:Herculesエミュレータ画面
HHCTE009I Client 127.0.0.1 connected to 3215 device 0:001F
Command ==> ipl 150
CPU0000 PSW=0000000000000000 24M.......                              instcount=0
```

Herculeエミュレータ画面がしばらくスクロールしながら実行しているのを眺めます。スクロールが止まったら、マスタコンソール画面に切り替えます。

```bash:マスタコンソール画面
Connected to device 0:001F
IEA101A SPECIFY SYSTEM PARAMETERS FOR RELEASE 03.70.VS2
HHCTE006A Enter input for console device 001F
```

と表示されています。今回はMVSスタータシステムの起動は初めてではないので、LPA領域を再構築する必要がありません。よって、
単純に「**<font color="red">Enter</font>**」キーを入力します。

すると、JES2起動メッセージが表示され始めます。アスタリスク(\*)付きのメッセージが表示されオペレータからの応答待ちになります。

```bash:マスタコンソール画面
HHCTE006A Enter input for console device 001F

 IEF165I // START JES2
 IEE351I SMF SYS1.MAN RECORDING NOT BEING USED
*00 $HASP426 SPECIFY OPTIONS - HASP-II, VERSION JES2 4.0
```

こちらも前回の手順でJES2スプールをフォーマットしたので、「**<font color="red">r 0,noreq</font>**」を入力し、「**<font color="red">Enter</font>**」キーを入力します。しばらくすると、次のメッセージが表示されます。

```bash:マスタコンソール画面
*00 $HASP426 SPECIFY OPTIONS - HASP-II, VERSION JES2 4.0
r 0,noreq
 IEE600I REPLY TO 00 IS;SUPPRESSED
 IEE041I THE SYSTEM LOG IS NOW ACTIVE
 $HASP160 PUNCH1   INACTIVE - CLASS=BK
 $HASP100 SMPMOUNT ON READER1     ISSUE MOUNT COMMANDS
 $HASP150 SYSLOG   ON PRINTER1
 $HASP150 INIT     ON PRINTER1
 $HASP250 SYSLOG   IS PURGED
 $HASP160 PRINTER1 INACTIVE - CLASS=AJ
 $HASP250 INIT     IS PURGED
 IEF165I // M 148,VOL=(SL,SMP000),USE=PRIVATE
 IEF165I         00090000
*01 IEF166D REPLY Y/N TO EXECUTE/SUPPRESS COMMAND
 $HASP100 INIT     ON STCINRDR
 $HASP100 INIT     ON STCINRDR
 $HASP100 INIT     ON STCINRDR
```

メッセージID=IEF165Iに注目してください。これは、先の手順で初期化した3つのDASDボリュームの内の一つのボリュームシリアル番号　SMP000を持つDASDボリュームをI/Oアドレス0x148にマウントし、プライベートとしてボリューム属性を設定した通知メッセージです。
このDASDボリュームにMVS3.8Jディストリビューションライブラリをビルドしていきます。

アスタリスク(\*)付きのメッセージID=IEF166Dは、MVSスタータシステムがこれから実行するコマンドを実行するか/しないか応答入力を待っているという通知メッセージです。

「**<font color="red">r 1,y</font>**」を入力し、「**<font color="red">Enter</font>**」キーを入力します。

```bash:マスタコンソール画面
r 1,y
 IEE600I REPLY TO 01 IS;Y
 $HASP100 MOUNT    ON STCINRDR
 $HASP373 MOUNT    STARTED
 $HASP395 MOUNT    ENDED
 $HASP150 MOUNT    ON PRINTER1
 $HASP160 PRINTER1 INACTIVE - CLASS=AJ
 $HASP250 MOUNT    IS PURGED
 $HASP373 INIT     STARTED
 $HASP373 SMPMOUNT STARTED - INIT  1 - CLASS A - SYS H158
 $HASP395 SMPMOUNT ENDED
 $HASP150 SMPMOUNT ON PRINTER1
 $HASP309    INIT  1 INACTIVE ******** C=A
 $HASP309    INIT  2 INACTIVE ******** C=BA
 $HASP309    INIT  3 INACTIVE ******** C=CBA
 $HASP160 PRINTER1 INACTIVE - CLASS=AJ
 $HASP250 SMPMOUNT IS PURGED
 $HASP373 INIT     STARTED
 $HASP373 INIT     STARTED
 $HASP099 ALL AVAILABLE FUNCTIONS COMPLETE
```

完了コード確認用TeraTerm画面で完了コードを確認します。
「**<font color="red">./condcode.pl prt00e.txt mount</font>**」を入力し、「**<font color="red">Enter</font>**」キーを入力します。

```bash:完了コード確認用画面
$ pwd
/home/hercules/mvs
$ ./condcode.pl prt00e.txt mount
Searching prt00e.txt for MVS Job Name mount

Step Name     Proc Step Name  Completion Code
---------     --------------  ---------------
148                           0000
```

完了コードの期待値は、「0000」です。


### SMP環境の初期化(2分くらい)
SMPは、MVS3.8Jをロードするために、いくつかのデータセットを作る必要があります。
いくつかのSMP制御用データセットと、この手順の終了時にMVS3.8Jディストリビューションライブラリをインストールするデータセットです。

Herculesエミュレータ画面のコマンドラインで、
「**<font color="red">devinit 12 jcl/smpjob00.jcl eof</font>**」を入力し、「**<font color="red">Enter</font>**」キーを入力します。

```bash:Herculesエミュレータ画面
Command ==> devinit 12 jcl/smpjob00.jcl eof
CPU0000 PSW=070E000000000000 24..W.....                     instcount=18,371,360
```

このJCLでは、MVS3.8Jをロードするのに必要なデータセットがもし存在していたら、それらを削除して、データセットを割り当て、初期化します。その後の工程に重大な誤りがある場合はそのため、このジョブは、この時点から「再起動」を実行することができます。

マスタコンソール画面に切り替えると、次のようなメッセージが表示されています。

```bash:マスタコンソール画面
 $HASP100 SMPJOB00 ON READER1     PREP FOR RECEIVE
 $HASP373 SMPJOB00 STARTED - INIT  1 - CLASS A - SYS H158
 $HASP395 SMPJOB00 ENDED
 $HASP309    INIT  1 INACTIVE ******** C=A
 $HASP150 SMPJOB00 ON PRINTER1
 $HASP160 PRINTER1 INACTIVE - CLASS=AJ
 $HASP099 ALL AVAILABLE FUNCTIONS COMPLETE
 $HASP250 SMPJOB00 IS PURGED
```

SMPJOB00ジョブが終了しているので、完了コードを確認します。次のような完了コードが期待値です。

```bash:完了コード確認用画面
$ ./condcode.pl prt00e.txt smpjob00
Searching prt00e.txt for MVS Job Name smpjob00

Step Name     Proc Step Name  Completion Code
---------     --------------  ---------------
IEHPROGM                      0008 <--
IEFBR14                       0000
DLBUCL        SMP             0008 <--
$ 
```

IEHPROGM:
このジョブステップ存在していないデータセットを削除しようとしているので、「0008」の完了コードでOKです。もし、何らかの理由でこのJCLをもう一度実行した場合、今度はデータセットの削除が成功するので、完了コードは「0000」とな​​ります。

IEFBR14:
このジョブステップはMVS3.8Jのロードに必要なデータセットをアロケーションしています。

DLBUCL:
このジョブステップは、いくつかのデータセットに制御情報を登録しています。


### MVS3.8Jディストリビューションのロード(8分くらい)
ここでは、MVS3.8JディストリビューションライブラリをSMPデータセットにロードしていきます。

Herculesエミュレータ画面のコマンドラインで、
「**<font color="red">devinit 12 jcl/smpjob01.jcl eof</font>**」を入力し、「**<font color="red">Enter</font>**」キーを入力します。

```bash:Herculesエミュレータ画面
Command ==> devinit 12 jcl/smpjob01.jcl eof
CPU0000 PSW=070E000000000000 24..W.....                     instcount=58,604,113
```

マスタコンソール画面に切り替えると、アスタリスク(\*)付きのメッセージID=IEF238Dが表示されています。

```bash:マスタコンソール画面
 $HASP100 SMPJOB01 ON READER1     RECEIVE PRODUCT TAPE
 $HASP373 SMPJOB01 STARTED - INIT  1 - CLASS A - SYS H158
 IEF244I SMPJOB01 SMP DLBUCL - UNABLE TO ALLOCATE 1 UNIT(S)
         AT LEAST 1 OFFLINE UNIT(S) NEEDED.
 IEF489I SMPJOB01 - 1 UNIT(S) NEEDED FOR SMPPTFIN
 IEF247I SMPJOB01 - 182,183,184,170,171 OFFLINE
 IEF247I SMPJOB01 - 282,283,284,382,383,384,482,483,484,582 NOT ACCESSIBLE
 IEF247I SMPJOB01 - 583,584,682,683,684,270,271,370,371,470 NOT ACCESSIBLE
 IEF247I SMPJOB01 - 471,570,571,670,671 NOT ACCESSIBLE
*02 IEF238D SMPJOB01 - REPLY DEVICE NAME OR 'CANCEL'.
```

これは、MVS3.8Jディストリビューションテープイメージを要求しています。
Herculesエミュレータ画面に切り替え、コマンドラインで、「**<font color="red">devinit 170 tape/product.het</font>**」を入力し、「**<font color="red">Enter</font>**」キーを入力します。

```bash:Herculesエミュレータ画面
Command ==> devinit 170 tape/product.het
CPU0000 PSW=070E000000000000 24..W.....                     instcount=65,015,26
```

マスタコンソール画面に切り替え、「**<font color="red">r 2,170</font>**」を入力し、「**<font color="red">Enter</font>**」キーを入力します。

```bash:マスタコンソール画面
*02 IEF238D SMPJOB01 - REPLY DEVICE NAME OR 'CANCEL'.
r 2,170
 IEE600I REPLY TO 02 IS;170
```

処理が終わるまで8分くらいかかります(VirutualBox環境で)。ちゃんと動いているか気になったら、「**<font color="red">D A,L</font>**」を入力し、「**<font color="red">Enter</font>**」キーを入力します。

```bash:マスタコンソール画面
D A,L
 IEE102I 22.59.09 16.156 ACTIVITY 091
    00002 JOBS    00003 INITIATORS
   JES2     JES2     IEFPROC   V=V
   SMPJOB01 DLBUCL   SMP       V=V
    00000 TIME SHARING USERS
```

しばらくすると、次のようなメッセージが表示されてSMPJOB01ジョブが終了します。

```bash:マスタコンソール画面
 IEF234E K 170,MVS38J,PVT,SMPJOB01
 $HASP395 SMPJOB01 ENDED
 $HASP309    INIT  1 INACTIVE ******** C=A
 $HASP150 SMPJOB01 ON PRINTER1
 $HASP160 PRINTER1 INACTIVE - CLASS=AJ
 $HASP099 ALL AVAILABLE FUNCTIONS COMPLETE
 $HASP250 SMPJOB01 IS PURGED
```

完了コード確認画面で「**<font color="red">./condcode.pl prt00e.txt smpjob01</font>**」を入力し、「**<font color="red">Enter</font>**」キーを入力します。完了コードの期待値は次の通りです。

```bash:完了コード確認用画面
$ pwd
/home/hercules/mvs
$ ./condcode.pl prt00e.txt smpjob01
Searching prt00e.txt for MVS Job Name smpjob01

Step Name     Proc Step Name  Completion Code
---------     --------------  ---------------
DLBUCL        SMP             0000
```

このジョブの出力メッセージは、40,000行以上あります。
この要約は次の通りです。

```bash:「prt00e.txt」
     DATE 16.156  TIME 23:07:09      HMASMP LVL 04.44 MESSAGES AND CONTROL STATEMENTS                        PAGE 0454

                         RECEIVE  SUMMARY  REPORT


     SYSMOD   STATUS     TYPE      ------------------------

     EAS1102  RECEIVED   FUNCTION  SMPTLIB DATASETS LOADED
     EBB1102  RECEIVED   FUNCTION  SMPTLIB DATASETS LOADED
     EBT1102  RECEIVED   FUNCTION  SMPTLIB DATASETS LOADED
     EDE1102  RECEIVED   FUNCTION  SMPTLIB DATASETS LOADED
     EDM1102  RECEIVED   FUNCTION  SMPTLIB DATASETS LOADED
     EDS1102  RECEIVED   FUNCTION  SMPTLIB DATASETS LOADED
     EER1400  RECEIVED   FUNCTION  SMPTLIB DATASETS LOADED
     EGA1102  RECEIVED   FUNCTION  SMPTLIB DATASETS LOADED
     EGS1102  RECEIVED   FUNCTION  SMPTLIB DATASETS LOADED
     EIP1102  RECEIVED   FUNCTION  SMPTLIB DATASETS LOADED
     EJE1103  RECEIVED   FUNCTION  SMPTLIB DATASETS LOADED
     EMF1102  RECEIVED   FUNCTION  SMPTLIB DATASETS LOADED
     EMI1102  RECEIVED   FUNCTION  SMPTLIB DATASETS LOADED
     EML1102  RECEIVED   FUNCTION  SMPTLIB DATASETS LOADED
     EMS1102  RECEIVED   FUNCTION  SMPTLIB DATASETS LOADED
     EPM1102  RECEIVED   FUNCTION  SMPTLIB DATASETS LOADED
     EST1102  RECEIVED   FUNCTION  SMPTLIB DATASETS LOADED
     ESU1102  RECEIVED   FUNCTION  SMPTLIB DATASETS LOADED
     ESY1400  RECEIVED   FUNCTION  SMPTLIB DATASETS LOADED
     ETC0108  RECEIVED   FUNCTION  SMPTLIB DATASETS LOADED
     ETI1106  RECEIVED   FUNCTION  SMPTLIB DATASETS LOADED
     ETV0108  RECEIVED   FUNCTION  SMPTLIB DATASETS LOADED
     EUT1102  RECEIVED   FUNCTION  SMPTLIB DATASETS LOADED
     EVT0108  RECEIVED   FUNCTION  SMPTLIB DATASETS LOADED
     EXW1102  RECEIVED   FUNCTION  SMPTLIB DATASETS LOADED
     FBB1221  RECEIVED   FUNCTION  SMPTLIB DATASETS LOADED
     FDM1133  RECEIVED   FUNCTION  SMPTLIB DATASETS LOADED
     FDS1122  RECEIVED   FUNCTION  SMPTLIB DATASETS LOADED
     FDS1133  RECEIVED   FUNCTION  SMPTLIB DATASETS LOADED
     FDZ1610  RECEIVED   FUNCTION  SMPTLIB DATASETS LOADED
     FUT1133  RECEIVED   FUNCTION  SMPTLIB DATASETS LOADED
     DATE 16.156  TIME 23:07:09      HMASMP LVL 04.44 MESSAGES AND CONTROL STATEMENTS                        PAGE 0455

HMA2050    RECEIVE PROCESSING COMPLETED - HIGHEST RETURN CODE IS 00


HMA2050    HMASMP PROCESSING COMPLETED - HIGHEST RETURN CODE IS 00
```

### MVSのPTFをロード(5分くらい)
PTFをSMPデータセットに適用します。

Herculesエミュレータ画面のコマンドラインで、
「**<font color="red">devinit 12 jcl/smpjob02.jcl eof</font>**」を入力し、「**<font color="red">Enter</font>**」キーを入力します。

```bash:Herculesエミュレータ画面
Command ==> devinit 12 jcl/smpjob02.jcl eof
CPU0000 PSW=070E000000000000 24..W.....                  instcount=4,579,352,743
```

マスタコンソール画面に切り替えると、アスタリスク(\*)付きのメッセージID=IEC501Aが表示されています。
これは、PTFが格納されたテープを取り付けることを要求しています。

```bash:マスタコンソール画面
 $HASP100 SMPJOB02 ON READER1
 $HASP373 SMPJOB02 STARTED - INIT  1 - CLASS A - SYS H158
*IEC501A M 170,MVS38J,SL,6250 BPI,
 IEC501A SMPJOB02,SMP
```

Herculesエミュレータ画面のコマンドラインで、
「**<font color="red">devinit 170 tape/ptfs.het</font>**」を入力し、「**<font color="red">Enter</font>**」キーを入力します。

```bash:Herculesエミュレータ画面
Command ==> devinit 170 tape/ptfs.het
CPU0000 PSW=070E000000000000 24..W.....                  instcount=4,585,496,721
```

マスタコンソール画面に切り替え、しばらくすると、次のようなメッセージが表示されてSMPJOB02ジョブが終了します。

```bash:マスタコンソール画面
 IEF234E K 170,MVS38J,PVT,SMPJOB02,SMP
 $HASP395 SMPJOB02 ENDED
 $HASP309    INIT  1 INACTIVE ******** C=A
 $HASP150 SMPJOB02 ON PRINTER1
 $HASP160 PRINTER1 INACTIVE - CLASS=AJ
 $HASP250 SMPJOB02 IS PURGED
 $HASP099 ALL AVAILABLE FUNCTIONS COMPLETE
```

完了コード確認画面で「**<font color="red">./condcode.pl prt00e.txt smpjob02</font>**」を入力し、「**<font color="red">Enter</font>**」キーを入力します。
完了コードの期待値は次の通りです。

```bash:完了コード確認用画面
$ ./condcode.pl prt00e.txt smpjob02
Searching prt00e.txt for MVS Job Name smpjob02

Step Name     Proc Step Name  Completion Code
---------     --------------  ---------------
DLBUCL        SMP             0000
```

### MVSディストリビューション全製品要素とPTFのロード(40分くらい)
MVSディストリビューション全製品要素をSMPデータにロードし、PTFをSMPデータセットに適用します。

Herculesエミュレータ画面のコマンドラインで、
「**<font color="red">devinit 12 jcl/smpjob03.jcl eof</font>**」を入力し、「**<font color="red">Enter</font>**」キーを入力します。

```bash:Herculesエミュレータ画面
Command ==> devinit 12 jcl/smpjob03.jcl eof
CPU0000 PSW=070E000000000000 24..W.....                  instcount=5,684,441,734
```

マスタコンソール画面に切り替え、しばらくすると、次のようなメッセージが表示されてSMPJOB03ジョブが終了します。

```bash:マスタコンソール画面
 $HASP395 SMPJOB03 ENDED
 $HASP309    INIT  1 INACTIVE ******** C=A
 $HASP150 SMPJOB03 ON PRINTER1
 $HASP160 PRINTER1 INACTIVE - CLASS=AJ
 $HASP250 SMPJOB03 IS PURGED
 $HASP099 ALL AVAILABLE FUNCTIONS COMPLETE
```

完了コード確認画面で「**<font color="red">./condcode.pl prt00e.txt smpjob03</font>**」を入力し、「**<font color="red">Enter</font>**」キーを入力します。

```bash:完了コード確認用画面
$pwd
/home/hercules/mvs
$ ./condcode.pl prt00e.txt smpjob03
Searching prt00e.txt for MVS Job Name smpjob03

Step Name     Proc Step Name  Completion Code
---------     --------------  ---------------
DLBUCL1       SMP             0000
DLBUCL2       SMP             0000
DLBUCL3       SMP             0000
DLBUCL4       SMP             0004 <--
DLBUCL5       SMP             0000
```

DLIBUCL4ステップ4は、リンケージエディタのステップで、IEW0461エラーが発生します。これは、いくつかのリンクが、この時に解決できなかったためで、「0004」の完了コードになりますが、これが期待値です。SYSOUTは77000行以上あります。

### クリーンアップ後、SMP(1分弱)
まだインストールは終了していませんが、この後の手順を継続する前に、これまでのロードで作成した作業用データセットを削除します。

Herculesエミュレータ画面のコマンドラインで、
「**<font color="red">devinit 12 jcl/smpjob04.jcl eof</font>**」を入力し、「**<font color="red">Enter</font>**」キーを入力します。

```bash:Herculesエミュレータ画面
Command ==> devinit 12 jcl/smpjob04.jcl eof
CPU0000 PSW=070E000000000000 24..W.....                 instcount=24,494,474,843
```

マスタコンソール画面に切り替え、しばらくすると、次のようなメッセージが表示されてSMPJOB04ジョブが終了します。

```bash:マスタコンソール画面
 $HASP100 SMPJOB04 ON READER1
 $HASP373 SMPJOB04 STARTED - INIT  1 - CLASS A - SYS H158
 $HASP395 SMPJOB04 ENDED
 $HASP309    INIT  1 INACTIVE ******** C=A
 $HASP150 SMPJOB04 ON PRINTER1
 $HASP160 PRINTER1 INACTIVE - CLASS=AJ
 $HASP099 ALL AVAILABLE FUNCTIONS COMPLETE
 $HASP250 SMPJOB04 IS PURGED
```

完了コード確認画面で「**<font color="red">./condcode.pl prt00e.txt smpjob04</font>**」を入力し、「**<font color="red">Enter</font>**」キーを入力します。

```bash:完了コード確認用画面
$ pwd
/home/hercules/mvs
$ ./condcode.pl prt00e.txt smpjob04
Searching prt00e.txt for MVS Job Name smpjob04

Step Name     Proc Step Name  Completion Code
---------     --------------  ---------------
DLBUCL        SMP             0004 <--
```
「0004」の完了コードが期待値です。

### 3375、3380と3390 DASDサポートの追加(5分弱)
オリジナルのMVS3.8Jは、3350以降のDASDボリュームをサポートしていません。
[Jim Morrison(ジム・モリソン)](http://cbttape.org/~jmorrison/)という方が、これをサポートできるようにUSERMODを提供しています。この手順ではこのUSERMODを適用します。

Herculesエミュレータ画面のコマンドラインで、
「**<font color="red">devinit 12 jcl/smpjob05.jcl eof</font>**」を入力し、「**<font color="red">Enter</font>**」キーを入力します。

```bash:Herculesエミュレータ画面
Command ==> devinit 12 jcl/smpjob05.jcl eof
CPU0000 PSW=070E000000000000 24..W.....                 instcount=24,558,858,782
```

マスタコンソール画面に切り替えると、次のアスタリスク(\*)付きのメッセージID=IEF233Aが表示されていて、USERMODのテープを要求しています。

```bash:マスタコンソール画面
 $HASP100 SMPJOB05 ON READER1
 $HASP373 SMPJOB05 STARTED - INIT  1 - CLASS A - SYS H158
*IEF233A M 170,J90009,,SMPJOB05,SMP
```
Herculesエミュレータ画面のコマンドラインで、
「**<font color="red">devinit 170 tape/j90009.het</font>**」を入力し、「**<font color="red">Enter</font>**」キーを入力します。

```bash:Herculesエミュレータ画面
Command ==> devinit 170 tape/j90009.het
CPU0000 PSW=070E000000000000 24..W.....                 instcount=24,564,921,818
```

マスタコンソール画面に切り替え、しばらくすると、次のようなメッセージが表示されてSMPJOB05ジョブが終了します。

```bash:マスタコンソール画面
 IEF234E K 170,J90009,PVT,SMPJOB05
 $HASP395 SMPJOB05 ENDED
 $HASP309    INIT  1 INACTIVE ******** C=A
 $HASP150 SMPJOB05 ON PRINTER1
 $HASP160 PRINTER1 INACTIVE - CLASS=AJ
 $HASP099 ALL AVAILABLE FUNCTIONS COMPLETE
 $HASP250 SMPJOB05 IS PURGED
```

完了コード確認画面で「**<font color="red">./condcode.pl prt00e.txt smpjob05</font>**」を入力し、「**<font color="red">Enter</font>**」キーを入力します。完了コードの期待値は次の通りです。

```bash:完了コード確認用画面
$ pwd
/home/hercules/mvs
$ ./condcode.pl prt00e.txt smpjob05
Searching prt00e.txt for MVS Job Name smpjob05

Step Name     Proc Step Name  Completion Code
---------     --------------  ---------------
DLBUCL        SMP             0000
```

MV3.8JディストリビューションテープやPTFテープと同じように、このUSERMODsは、ディストリビューションライブラリへの変更を生成するため、SMPJOB06ジョブを実行します。

Herculesエミュレータ画面のコマンドラインで、
「**<font color="red">devinit 12 jcl/smpjob06.jcl eof</font>**」を入力し、「**<font color="red">Enter</font>**」キーを入力します。

```bash:Herculesエミュレータ画面
Command ==> devinit 12 jcl/smpjob06.jcl eof
CPU0000 PSW=070E000000000000 24..W.....                 instcount=24,623,214,200
```

マスタコンソール画面に切り替え、しばらくすると、次のようなメッセージが表示されてSMPJOB06ジョブが終了します。

```bash:マスタコンソール画面
 $HASP100 SMPJOB06 ON READER1
 $HASP373 SMPJOB06 STARTED - INIT  1 - CLASS A - SYS H158
 $HASP395 SMPJOB06 ENDED
 $HASP309    INIT  1 INACTIVE ******** C=A
 $HASP150 SMPJOB06 ON PRINTER1
 $HASP160 PRINTER1 INACTIVE - CLASS=AJ
 $HASP099 ALL AVAILABLE FUNCTIONS COMPLETE
 $HASP250 SMPJOB06 IS PURGED
```

完了コード確認画面で「**<font color="red">./condcode.pl prt00e.txt smpjob06</font>**」を入力し、「**<font color="red">Enter</font>**」キーを入力します。

```bash:完了コード確認用画面
$ pwd
/home/hercules/mvs
$ ./condcode.pl prt00e.txt smpjob06
Searching prt00e.txt for MVS Job Name smpjob06

Step Name     Proc Step Name  Completion Code
---------     --------------  ---------------
DLBUCL        SMP             0004 <--
```

MVS3.8ディストリビューション/PTFを適用したときと同様に、「0004」の完了コードが期待値です。
これは、リンケージエディタでいくつかのリンクが解決できなかったためです(メッセージID=IEW0461のエラーが発生しています)。

MVS3.8ディストリビューション/PTFを適用したときと同様に、USERMODで生成された作業用データセットを削除する必要があり、次の手順で行います。

Herculesエミュレータ画面のコマンドラインで、「**<font color="red">devinit 12 jcl/smpjob07.jcl eof</font>**」を入力し、「**<font color="red">Enter</font>**」キーを入力します。

```bash:Herculesエミュレータ画面
Command ==> devinit 12 jcl/smpjob07.jcl eof
CPU0000 PSW=070E000000000000 24..W.....                 instcount=25,095,511,572
```

マスタコンソール画面に切り替え、しばらくすると、次のようなメッセージが表示されてSMPJOB07ジョブが終了します。

```bash:マスタコンソール画面
 $HASP100 SMPJOB07 ON READER1
 $HASP373 SMPJOB07 STARTED - INIT  1 - CLASS A - SYS H158
 $HASP395 SMPJOB07 ENDED
 $HASP309    INIT  1 INACTIVE ******** C=A
 $HASP150 SMPJOB07 ON PRINTER1
 $HASP160 PRINTER1 INACTIVE - CLASS=AJ
 $HASP099 ALL AVAILABLE FUNCTIONS COMPLETE
 $HASP250 SMPJOB07 IS PURGED
```

完了コード確認画面で「**<font color="red">./condcode.pl prt00e.txt smpjob07</font>**」を入力し、「**<font color="red">Enter</font>**」キーを入力します。

```bash:完了コード確認用画面
$ pwd
/home/hercules/mvs
$ ./condcode.pl prt00e.txt smpjob07
Searching prt00e.txt for MVS Job Name smpjob07

Step Name     Proc Step Name  Completion Code
---------     --------------  ---------------
DLBUCL        SMP             0004 <--
```

「0004」の完了コードが期待値です。

### ICKDSFユーティリティのビルドとIFOX00のリビルド(2分弱)
ICKDSF(デバイス・サポート・ファシリティ)ユーティリティは、DASDの初期化などを行うユーティリティ・プログラムで、ボリューム名を変えたり、VTOCのサイズを変えたりできるユーティリティです。

これは、MVSスターターシステムにはインストールされていませんが、このユーティリティを利用して、MVS 3.8 System Residence DASD Volume(MVSRES DASD Volume)にIPLレコードを書き込むことができます。

MVSスターターシステムにICKDSFユーティリティを追加するために必要なすべてのコンポーネントは、MVSディストリビューションライブラリに存在していますが、MVSスターターシステムにインストールされているアセンブラ（IFOX00）は、SYSGEN時に時折0C1と0C4のABENDコードで異常終了します。

IFOX00をリビルドするために必要なコンポーネントは、MVSディストリビューションライブラリに全てありますので、これを用いてリビルドします。

Herculesエミュレータ画面のコマンドラインで、
「**<font color="red">devinit 12 jcl/smpjob08.jcl eof</font>**」を入力し、「**<font color="red">Enter</font>**」キーを入力します。

```bash:Herculesエミュレータ画面
Command ==> devinit 12 jcl/smpjob08.jcl eof
CPU0000 PSW=070E000000000000 24..W.....                 instcount=25,150,357,202
```

マスタコンソール画面に切り替えると、アスタリスク(\*)付きのメッセージID=IEC507Dは、ライブラリの修正をするかどうかの応答要求が表示されています。

```bash:マスタコンソール画面
 $HASP100 SMPJOB08 ON READER1
 $HASP104 SMPJOB08 ************************************************************
 $HASP104 SMPJOB08 * AN IPL IS REQUIRED AFTER THIS JOB HAS COMPLETED!!!       *
 $HASP104 SMPJOB08 ************************************************************
 $HASP373 SMPJOB08 STARTED - INIT  1 - CLASS A - SYS H158
 $HASP100 SMPJOB09 ON INTRDR
 $HASP373 SMPJOB09 STARTED - INIT  2 - CLASS A - SYS H158
*IEC507D E 150,START1,SMPJOB09,LK,
 IEC507D SYS1.LINKLIB
*03 IEC507D REPLY 'U'-USE OR 'M'-UNLOAD
*IEC507D E 150,START1,SMPJOB08,
 IEC507D IEBCOPY,SYS1.SVCLIB
*04 IEC507D REPLY 'U'-USE OR 'M'-UNLOAD
```

全て、受け入れる必要があるので、**<font color="red">"U"</font>**を応答します。この例では3,4,5の全てに**<font color="red">"U"</font>**で応答します。

```bash:マスタコンソール画面
r 3,u
 IEE600I REPLY TO 03 IS;U
*IEC507D E 150,START1,SMPJOB09,LK,
 IEC507D SYS1.LINKLIB
*05 IEC507D REPLY 'U'-USE OR 'M'-UNLOAD
r 4,u
 IEE600I REPLY TO 04 IS;U
 $HASP395 SMPJOB08 ENDED
 $HASP309    INIT  1 INACTIVE ******** C=A
 $HASP150 SMPJOB08 ON PRINTER1
 $HASP160 PRINTER1 INACTIVE - CLASS=AJ
 $HASP250 SMPJOB08 IS PURGED
r 5,u
 IEE600I REPLY TO 05 IS;U
 $HASP395 SMPJOB09 ENDED
 $HASP309    INIT  2 INACTIVE ******** C=BA
 $HASP150 SMPJOB09 ON PRINTER1
 $HASP160 PRINTER1 INACTIVE - CLASS=AJ
 $HASP099 ALL AVAILABLE FUNCTIONS COMPLETE
 $HASP250 SMPJOB09 IS PURGED
```

完了コード確認画面で「**<font color="red">./condcode.pl prt00e.txt smpjob08</font>**」を入力し、「**<font color="red">Enter</font>**」キーを入力します。完了コードの期待値は次の通りです。

```bash:完了コード確認用画面
$ pwd
/home/hercules/mvs
$ ./condcode.pl prt00e.txt smpjob08
Searching prt00e.txt for MVS Job Name smpjob08

Step Name     Proc Step Name  Completion Code
---------     --------------  ---------------
ASM                           0000
IDCAMS                        0000
IEBGENER                      0000
IEBCOPY                       0000
```

完了コード確認画面で「**<font color="red">./condcode.pl prt00e.txt smpjob09</font>**」を入力し、「**<font color="red">Enter</font>**」キーを入力します。完了コードの期待値は次の通りです。

```bash:完了コード確認用画面
$ pwd
/home/hercules/mvs
$ ./condcode.pl prt00e.txt smpjob09
Searching prt00e.txt for MVS Job Name smpjob09

Step Name     Proc Step Name  Completion Code
---------     --------------  ---------------
LINK          LK              0000
LINK          LK              0000
```

「prt00e.txt」のジョブ=SMPJOB08のメッセージを見ると、次のメッセージが出力されています。

```bash:「prt00e.txt」
 $HASP104 SMPJOB08 ************************************************************
 $HASP104 SMPJOB08 * AN IPL IS REQUIRED AFTER THIS JOB HAS COMPLETED!!!       *
 $HASP104 SMPJOB08 ************************************************************
```

これは、MVSスタータシステムのシステム・ロード・ライブラリに追加されたICKDSFのロードモジュールを実行するためには、シャットダウンしてMVSスタータシステムをIPLし直す必要があるため、このメッセージが出力されています。

この後の手順でいくつかの追加DASDボリュームを作成する必要があり、スナップショットバックアップを取るための良いタイミングなので、いったんここでシステムをシャットダウンします。

マスタコンソール画面に切り替え、「**<font color="red">$p jes2</font>**」と入力し、「**<font color="red"> Enter</font>**」キーを入力します。このコマンドは、正常にシャットダウンするように、JES2に指示しています。すると、次のメッセージが表示されます。

```bash:マスタコンソール画面
$p jes2
 $HASP395 INIT     ENDED
 $HASP395 INIT     ENDED
 $HASP395 INIT     ENDED
 IEE043I A SYSTEM LOG DATA SET HAS BEEN QUEUED TO SYSOUT CLASS A
 IEE037I LOG NOT ACTIVE
2000 00.42.58 CONSOLE   IEE142I  01F NOW RECEIVING HARDCOPY
4000 00.42.58           IEE043I A SYSTEM LOG DATA SET HAS BEEN QUEUED TO SYSOUT CLASS A
4000 00.42.58           IEE037I LOG NOT ACTIVE
0000 00.42.58           IEF196I IEF142I JES2 JES2 - STEP WAS EXECUTED - COND CODE 0000
0000 00.42.58           IEF196I IEF285I   SYS1.PROCLIB                                 KEPT
0000 00.42.58           IEF196I IEF285I   VOL SER NOS= START1.
0000 00.42.58           IEF196I IEF285I   SYS1.HASPCKPT                                KEPT
0000 00.42.58           IEF196I IEF285I   VOL SER NOS= SPOOL0.
0000 00.42.58           IEF196I IEF285I   SYS1.HASPACE                                 KEPT
0000 00.42.58           IEF196I IEF285I   VOL SER NOS= SPOOL0.
```

これはMVSスタータシステムがパワーダウンが可能であることを示しています。MVSはまだ実行されており、追加のオペレータコマンドを入力できる状態にあります。
「**<font color="red">z eod</font>**」と入力し、「**<font color="red"> Enter</font>**」キーを入力します。
これは、全てのシステムファイルを閉じて、通常のシャットダウンの準備を指示しています。

```bash:マスタコンソール画面
z eod
4000 00.43.22           IEE334I HALT     EOD SUCCESSFUL
```

「**<font color="red">quiesce</font>**」と入力し、「**<font color="red"> Enter</font>**」キーを入力します。

```bash:マスタコンソール画面
quiesce
```

このコマンドは、DASDボリュームに現在のバッファ状態を書き込むためにMVSスタータシステムに指示していします。
これで、Herculesエミュレータをシャットダウンする前に、メモリに保持しているすべての情報がDASDボリュームに書かれます。

Herculesエミュレータ画面に切り替え、「**<font color="red"> quit</font>**」と入力し、「**<font color="red"> Enter</font>**」キーを入力します。Herculesエミュレータは、エミュレートされたメインフレーム・デバイス用のすべてのファイルを閉じて終了します。

```bash:Herculesエミュレータ画面
HHCCP011I CPU0000: Disabled wait state
          PSW=000A0000 00000CCC
Command ==> quit
CPU0000 PSW=000A000000000CCC 24M.W.....                 instcount=25,182,261,143
```

### スナップショットの取得
この先の作業で、何らかのエラーが発生したときに戻れる地点を作るために、ここで、ディレクトリをtarで固めておく。

```bash:Herculesエミュレータ画面
$ pwd
/home/hercules
$ tar cvfj mvs.02.tar.bz2 ./mvs
```