Старые ОС: IBM VM/370

Здравствуйте, уважаемые хабарчане!

Я интересуюсь «древними» компьютерами и операционными системами.

Несмотря на их древность, многие из них гораздо более продуманнее

современных систем и лучше подходят в качестве примеров. Windows и Linux

есть чему поучиться у многих устаревших ОС.

По-моему самые интересные из старых систем — мейнфреймы и поздние

миникомпьютеры (супермини). В отличие от ранних миникомпьютеров, которые

часто лепились на коленке конечного пользователя под его нужды, системы

мейнфреймов и супермини с самого начала были предназначены для людей не

имеющих ни полного представления о работе компьютера ни времени на

разработку отдельной архитектуры для каждой задачи. При этом, в отличие

от современных систем (4 гигабайта оперативки на набор этого поста),

мейнфреймы и в особенности супермини были очень ограниченны в ресурсах и

не как правило не разрастались.

В этом посте я опишу процесс установки операционной системы VM/370.

VM/370 — операционная система IBM для компьютеров IBM System/370. Это

многопользовательская ОС работающая по принципу гипервизора control

program (CP): каждому пользователю предоставляется своя виртуальная

машина, в которой он может запустить желаемую ОС, в частности сам

гипервизор CP (немногие современные гипервизоры способны на такой трюк) и

CMS — однопользовательскую ОС, бабушку MS-DOS. Прямой потомок VM — zVM

до сих пор используется на мейнфреймах IBM System z. Подробнее о VM

можно прочитать в Википедии.

Для тех кто хочет не красноглазить, а просто посмотреть конечный результат: есть готовые образы системы с подробными инструкциями (правда на английском). Остаток статьи можно не читать.

Материалы и инструменты

Для установки и работы нам понадобится:

Подготовка.

Все фалы проекта я помещаю в папку

/home/link/Programming/LEGACY/SYSTEMS/System360/vm370habr (далее просто

vm370habr). Загруженные образы сохраняем в папку vm370habr/DISTR. В

vm370habr создаю подпапку IO.

Создание образов дисков
<code class="bash">link@link-K73BY ~/Programming/LEGACY/SYSTEMS/System360/vm370habr/DASD $ dasdinit -z VMREL6 3330-11 VMREL6
HHCDU044I Creating 3330 volume VMREL6: 808 cyls, 19 trks/cyl, 13312 bytes/track
HHCDU041I 808 cylinders successfully written to file VMREL6
HHCDI001I DASD initialization successfully completed.
link@link-K73BY ~/Programming/LEGACY/SYSTEMS/System360/vm370habr/DASD $ dasdinit -z CPR6L0 3330 CPR6L0
HHCDU044I Creating 3330 volume CPR6L0: 404 cyls, 19 trks/cyl, 13312 bytes/track
HHCDU041I 404 cylinders successfully written to file CPR6L0
HHCDI001I DASD initialization successfully completed.
link@link-K73BY ~/Programming/LEGACY/SYSTEMS/System360/vm370habr/DASD $ 
</code>

Диски в терминах System360 называются DASD.

Программа dasdinit создает чистые образы дисков. Первый образ — диск

модели 3330 с меткой VMREL6. На него мы запишем стартовую систему.

Второй диск — CPR6L0, модели 3330-11 (в два раза большей емкости), на

него установим гипервизор. Диски архивированы (опция -z), эту опцию

лучше не применять на медленных компьютерах.

Файл конфигурации для монитора

Создаем в папке vm370habr текстовый файл hercules.cnf

со следующим содержанием:

Примичание: этот конфигурационный файл следует не просто скопировать, а

внимательно прочитать, осмыслить и изменить под свои нужды (как минимум,

поменять путь).

Настройка дисков

<code class="bash">link@link-K73BY ~/Programming/LEGACY/SYSTEMS/System360/vm370habr $ hercules<span class="comment">#...много текста</span>
Command ==>devinit 180 DISTR/starter-3330.aws
HHCTA004I 0180: DISTR/starter-3330.aws is a AWS Format tape file                                                                                             
HHCPN098I Device 0:0180 initialized                                                                                                                          </code>

В другом терминале:

<code class="bash">link@link-K73BY ~/Programming/LEGACY/SYSTEMS/System360/vm370habr $ telnet localhost 3270
Trying 127.0.0.1...
Connected to localhost.
Escape character is <span class="string">'^]'</span>.
Hercules version 3.07 built on Jun 19 2011 04:29:21
running on link-K73BY (Linux-3.0.0-26-generic.<span class="comment">#43-Ubuntu SMP Tue Sep 25 17:19:22 UTC 2012 x86_64 MP=2)</span>
Connected to device 0:0009</code>

В окне с Геркулесом:

<code class="bash">Command ==>ipl 180                                                                                                       </code>

(ipl, на мейнфреймовском жаргоне — то же самое что и boot).

В окне с телнетом появится следующее:

<code class="bash">VM/370 FORMAT/ALLOCATE PROGRAM RELEASE 6
ENTER FORMAT OR ALLOCATE:                                                                               </code>
Форматирование дисков

В System/370 концепт данных на диске отличался от современного: размеры

секторов мог быть различным даже на одной дорожке и часто определялись

приложением, а не операционной системой. Подключенные к CP диски могут

быть двух типов: резидентные диски CP (для системной информации и файлов

подкачки) и диски пользователей, которые могут быть разбиты по

цилиндрам на несколько минидисков. Оболочка CMS разбивает всё отведенное

ей пространство диска на 800-байтные секторы и строит файловою систему

по типу FAT.

Насколько я понял, диск стартовой системы (CPR6L0) — это диск данных с

особой сборкой ядра в первых цилиндрах. В качестве резидентного диска

стартовая система (и новая установка ядра) будут использовать диск

VMREL6. Для этого нам надо выделить на томе VMREL6 пространство для

файлов подкачки и временных дисков. Я также отформатировал CPR6L0,

потому что не уверен в том, что образы сгенерированные dasdinit подходят

VM.

На ленте с образом стартовой системы есть программа форматирования.

В окне с телнетом:

Здесь мы сначала форматируем будущий системный диск, затем выделяем на

нем участки (выделение взято из инструкции по установке) и форматируем

диск для стартовой системы.

Копирование стартовой системы

В окне с геркулесом вводим:

<code class="bash">stop                                                                            
ipl 180                                                                         </code>

В телнете появляется:

<code class="bash">VM/370 DASD DUMP/RESTORE PROGRAM RELEASE 6
ENTER CARD READER ADDRESS OR CONTROL STATEMENTS
ENTER: </code>

Вводим:

<code class="bash">ENTER CARD READER ADDRESS OR CONTROL STATEMENTS
ENTER: SYSPRINT 00E
ENTER: INPUT 180 3420
ENTER: OUTPUT 130 3330 CPR6L0
ENTER: RESTORE ALL
RESTORING CPR6L0</code>

Подождите несколько минут и Геркулес начинает выдавать сообщения об

ошибках. Дело в том, что в программе DDR есть ошибка, которая не влияла

на поведение на реальном железе, но вешает эмуляторы.

Выйдите из Геркулеса командой quit и перезапустите Геркулес.

Запуск и настройка стартовой системы

Подключите к Геркулесу эмулятор дисплея (как это делать — см. мануал

эмулятора). В Геркулесе наберите команду «ipl 130» и нажмите клавишу

ввода в окне дисплея.

На дисплее появится следующая картинка:
Настройка стартовой системы

Сборка ядра стартовой системы отличается тем, что здесь адреса устройств

не вшиты намертво в код, а задаются при каждом старте. Для моей

конфигурации

ответы такие:

Теперь я настраиваю консоль:

<code class="bash">spool console start
terminal mode vm</code>

Эти настройки нужны для того, чтобы при запуске CMS гипервизор передавал

ей управление консолью. Но пока мы еще не запустили CMS, команды

виртуальной машине уйдут в пустоту. Поэтому следите за надписью в правом

нижнем углу экрана и вводить команды только по сигналу CP READ. Если в

углу экрана надпись RUNNING, нужно нажать клавишу Enter, а если HOLDING —

CLEAR.

Определение установки

Введите команду QUERY VIRTUAL DASD, чтобы проверить какие диски подключены. Результат должен быть таким:

<code class="bash">13:52:55 DASD 190 3330 CPR6L0 R/O 085 CYL
13:52:55 DASD 191 3330 CPR6L0 R/W 001 CYL
13:52:55 DASD 194 3330 CPR6L0 R/W 027 CYL
13:52:55 DASD 350 3330 VMREL6 R/W 808 CYL</code>

Теперь нужно подключить том VMREL6 к виртуальной машине под тем же номером что и в реальной:

define 350 as 131.

Подключение лент

Создайте в папке vm370habr пустой файл scratch.aws и введите в Геркулес следующие команды:

<code class="bash">devinit 180 DISTR/ptf-616.aws
devinit 180 scratch.aws</code>

Первая лента — это патч системы, а вторая — пустая лента, на которую будет записано ядро.

Теперь подключаем эти ленты к виртуальной машине. В окне дисплея:

<code class="bash">attach 180 to cpgen as 181
attach 181 to cpgen as 182</code>
Загрузка CMS

Введите в окно дисплея команду: «ipl 190 parm seg=null». Появится

сообщение: «RELEASE 6 CMS 12/25/78». Нажмите клавишу ввода. Теперь вы

работаете под управлением CMS и можете не беспокоиться о потере команд.

Далее, создайте временный диск (он понадобиться для сборки ядра)

командой «define t3330 192 11» и отформатируйте его командой format 192

d. (d — буква диска в CMS). Дальше все совсем как в DOSе. Метку можно

назначить любую, я выбрал TMP192 (как в инструкции).

Пару слов о файлах CMS: в CMS имя файла записывается так: через пробел

восемь символов имени, восемь символов расширения, буква диска. То есть

как в ранних DOS, но с точностью до наоборот.

Применение патчей

Отключите защиту от записи на системном диске CMS: «link cmssys 190 190 w write».

Скопируйте содержимое диска a на диск d коммандой «copy * * a = = d» Символ «равно» в шаблонах CMS означает «без изменений».

Скопируйте файлы патчей на диск d: «vmfplc2 load * * d». VMFPLC2 выведет такой список файлов:

<code class="bash"> LOADING.....
 5749010  061638   D1
 VMSERV   EXEC     D1
 5749010  EXEC     D1
 VMFPLC2  MODULE   D2
 END-OF-FILE OR END-OF-TAPE</code>

Теперь применим патчи:

<code class="bash">access 192 c
release a
vmserv nomemo noipl</code>

VMSERV выведет приветствие и начнет спрашивать какие патчи надо

применить. Нам нужен сервис «5749010» и патч CP VM/370. «CP BASE STAGING

AREA DISK ADDRESS» — 194. Также, ответьте «yes» на вопрос «IS THIS THE

INITIAL SYSGEN OF THIS SYSTEM?».

После этого, VMSERV применит патчи к CP и перезапустит CMS. Когда CMS

выведет приветствие, подключите временный диск как диск a: «access 192

a».

Подготовка к сборке ядра

Введите «generate srvcpgm». Эта команда выведет перфокарты с сервисными

программами (на эмуляторе они нам не понадобятся). Затем программа

спросит печатать ли пример пользовательского каталога. Ответьте «yes» — в

каталог может пригодиться. А карты с конфигурационными файлами не нужны

— я приведу их ниже.

Конфигурация ядра

Ядро настраивается с помощью нескольких исходников на языке ассемблера и

описания пользовательского каталога. Тем, кто хочет их настроить «по

вкусу», придется долго копаться в мануалах, а я привожу

готовый вариант:

Копируем весь этот текст в файл sysconf.txt.

Сборка ядра

Вводим в консоли Геркулеса: «devinit 00c sysconf.txt ascii eof».

И на дисплее: «generate vm370»

GENERATE спросит имя файла с каталогом (у меня это MYVM DIRECT). Затем

откомпилируются файлы с настройками и GENERATE спросит собирамемся ли мы

использовать многопроцессорную систему или опцию V=R. Отвечаем no.

Дальше будет много текста и (если вам повезет) в конце появится надпись:

«NUCLEUS LOADED ON VMREL6».

Сохраните карту памяти ядра и выключите стартовую систему:

<code class="bash">close ptr
15:06:30 IPL 190 PARM SEG=NULL
15:06:30 PRT FILE 0019  TO  CPGEN    COPY 01 NOHOLD
RELEASE 6 CMS 12/25/78
access 194 a
CMSSEG SYSTEM NAME <span class="string">'NULL    '</span> NOT AVAILABLE.
R; T=0.01/0.01 15:06:36
read cpipcs map a
RECORD LENGTH IS <span class="string">'132'</span> BYTES.
R; T=0.25/1.24 15:06:50
drain all
15:08:18 RDR  00C DRAINED   SYSTEM
15:08:18 PUN  00D DRAINED   SYSTEM   CLASS = A      SEP
15:08:18 PRT  00E DRAINED   SYSTEM   CLASS = A      SEP
R; T=0.01/0.02 15:08:18
shutdown
 
 
DMKCKP960I SYSTEM WARM START DATA SAVED
 
DMKCKP961W SYSTEM SHUTDOWN COMPLETE
 </code>

Разбиение диска

Для того, чтобы использовать диск CPR6L0, его нужно переразметить.

Загрузите FORMAT/ALLOCATE так же, как при копировании системы.

<code class="bash">VM/370 FORMAT/ALLOCATE PROGRAM RELEASE 6
ENTER FORMAT OR ALLOCATE:ALLOCATE
ALLOCATE FUNCTION SELECTED
ENTER DEVICE ADDRESS (CCU):130
ENTER DEVICE TYPE:3330
ENTER DEVICE LABEL:CPR6L0
ENTER ALLOCATION DATA FOR VOLUME CPR6L0
TYPE CYL CYL
.... ... ...
DRCT 000 000
PERM 001 403
END   
ALLOCATION RESULTS
DRCT 000 000
PERM 001 403
DEVICE 130 VOLUME CPR6L0 ALLOCATION ENDED</code>

Остановите программу командой stop.

Запуск новой системы

Загрузитесь с системного диска командой IPL 131. В окне Геркулеса появится приглашение:

<code class="bash">NOW 14:14:40 EST MONDAY 08/26/13                                                                                                                             
CHANGE TOD CLOCK (YES NO) </code>

Сейчас вы работаете в встроенной консоли. С точки зрения VM/CMS это

такая же консоль, как и подключение через телнет. Для того, чтобы ввести

текст во встроенную консоль, введите его в консоль Геркулеса через

косую черту ("/"):

<code class="bash">CHANGE TOD CLOCK (YES NO) :                                                                                                                                  
/(0008) no                                                                                                                                                   
14:17:49 START ((COLD WARM CKPT FORCE) (DRAIN)) (SHUTDOWN) :                                                                                                 
/(0008) cold                                                                                                                                                 
14:17:51 AUTO LOGON   ***   OPERATOR USERS = 001  BY  SYSTEM                                                                                                 
DMKCPI957I STOR 16384K, NUC 224K, DYN 14900K, TRA 240K, FREE 1020K, V=R 00000K                                                                               
14:17:51 FILES:  NO RDR,  NO PRT,  NO PUN                                                                                                                    
14:17:51 FORMATTING ERROR RECORDING AREA                                                                                                                     </code>
Форматирование минидисков

Тут все просто:

<code class="bash"> /(0008) ipl 190 parm seg=null                                                                                                                               
14:22:39                                                                                                                                                     
RELEASE 6 CMS 12/25/78                                                                                                                                      V
/(0008) access (nodisk                                                                                                                                       
CMSSEG SYSTEM NAME <span class="string">'NULL    '</span> NOT AVAILABLE.                                                                                                                 
DISK <span class="string">'A'</span> NOT ACCESSED.                                                                                                                                       
DISK <span class="string">'A'</span> NOT ACCESSED.                                                                                                                                       
R; T=0.01/0.01 14:22:49                                                                                                                                      
                                                                                                                                                             
/(0008) format 191 a                                                                                                                                         
DMSFOR603R FORMAT WILL ERASE ALL FILES ON DISK <span class="string">'A(191)'</span>. DO YOU WISH TO CONTINUE? (YES NO):                                                                  
/(0008) yes                                                                                                                                                  
DMSFOR605R ENTER DISK LABEL:                                                                                                                                 
/(0008) OPR191                                                                                                                                               
FORMATTING DISK <span class="string">'A'</span>.                                                                                                                                         
HHCCP048I 0130:CCW=07F06608 40100006=>00000FFF 00000000 00000000 000F8918 ..............i.                                                                   
HHCCP075I 0130:Stat=0E00 Count=0000                                                                                                                          
HHCCP076I 0130:Sense=80000000 380C1204 00000000 00000000 00000000 00000000                                                                                   
HHCCP077I 0130:Sense=CMDREJ                                                                                                                                  <span class="string">'5'</span> CYLINDERS FORMATTED ON <span class="string">'A(191)'</span>.                                                                                                                         
R; T=0.01/0.11 14:23:13                                                                                                                                      
                                                                                                                                                             
/(0008) logoff                                                                                                                                               
14:23:34 CONNECT= 00:05:42 VIRTCPU= 000:00.06 TOTCPU= 000:00.39                                                                                              
14:23:34 LOGOFF AT 14:23:34 EST MONDAY 08/26/13                                                                                                              
                                                                                                                                                             
                                                                                                                                                             
                                                                                                                                                             
 VM/370 ONLINE                                                                                                                                               
 /(0008) logon maint                                                                                                                                         
                                                                                                                                                             
ENTER PASSWORD:                                                                                                                                              
XXXXXXXX                                                                                                                                                     
/(0008) cpcms                                                                                                                                                
LOGON AT 14:23:45 EST MONDAY 08/26/13                                                                                                                        
/(0008) define storage 2m                                                                                                                                    
STORAGE = 02048K                                                                                                                                             
/(0008) ipl 190 parm seg=null                                                                                                                                
RELEASE 6 CMS 12/25/78                                                                                                                                       
/(0008) access (nodisk                                                                                                                                       
CMSSEG SYSTEM NAME <span class="string">'NULL    '</span> NOT AVAILABLE.                                                                                                                 
DISK <span class="string">'A'</span> NOT ACCESSED.                                                                                                                                       
DISK <span class="string">'A'</span> NOT ACCESSED.                                                                                                                                       
R; T=0.01/0.01 14:25:26                                                                                                                                      
                                                                                                                                                             
/(0008) format 191 a                                                                                                                                         
DMSFOR603R FORMAT WILL ERASE ALL FILES ON DISK <span class="string">'A(191)'</span>. DO YOU WISH TO CONTINUE? (YES NO):                                                                  
/(0008) yes                                                                                                                                                  
DMSFOR605R ENTER DISK LABEL:                                                                                                                                 
/(0008) MNT191                                                                                                                                               
FORMATTING DISK <span class="string">'A'</span>.                                                                                                                                         
HHCCP048I 0130:CCW=07F07BB0 40100006=>00000FFF 00000000 00FFF280 000F6F38 ..........2...?.                                                                   
HHCCP075I 0130:Stat=0E00 Count=0000                                                                                                                          
HHCCP076I 0130:Sense=80000000 38171204 00000000 00000000 00000000 00000000                                                                                   
HHCCP077I 0130:Sense=CMDREJ                                                                                                                                  <span class="string">'7'</span> CYLINDERS FORMATTED ON <span class="string">'A(191)'</span>.                                                                                                                         
R; T=0.02/0.26 14:26:30                                                                                                                                      
                                                                                                                                                             
/(0008) logout                                                                                                                                               
CONNECT= 00:02:49 VIRTCPU= 000:00.07 TOTCPU= 000:00.52                                                                                                       
LOGOFF AT 14:26:35 EST MONDAY 08/26/13                                                                                                                       
                                                                                                                                                             
                                                                                                                                                             
                                                                                                                                                             
 VM/370 ONLINE                                                                                     
/(0008) logon operator                                                                                                                                       
ENTER PASSWORD:                                                                                                                                              
XXXXXXXX                                                                                                                                                     
/(0008) operator                                                                                                                                             
14:28:10 LOGON AT 14:28:10 EST MONDAY 08/26/13                                                                                                               
14:28:10 LINE 008 LOGON  AS OPERATOR USERS = 002                                                                               
/enable all
===Много сообщений о неподключенных устройствах===                                                                                       </code>
Установка обновлений

Залогинтесь под пользователем MAINT через дисплей:

<code class="bash">LOGON MAINT
ENTER PASSWORD:
 
DASD 190 LINKED R/W; R/O BY OPERATOR
DASD 194 LINKED R/W; R/O BY OPERATOR
LOGON AT 14:30:29 EST MONDAY 08/26/13
 
CP
IPL 190 PARM SEG=NULL
RELEASE 6 CMS 12/25/78
 
CMSSEG SYSTEM NAME <span class="string">'NULL    '</span> NOT AVAILABLE.
R; T=0.01/0.01 14:30:54</code>

Пароль — CPCMS.

Подключите ленту с обновлениями к машине MAINT (через консоль Геркулеса):

<code class="cs">devinit <span class="number">180</span> ./DISTR/ptf-<span class="number">616.</span>aws                                                                                                                              
HHCTA101I <span class="number">0180</span>: AWS Tape ./DISTR/starter-<span class="number">3330.</span>aws closed                                                                                                     
HHCTA004I <span class="number">0180</span>: ./DISTR/ptf-<span class="number">616.</span>aws <span class="keyword">is</span> a AWS Format tape file                                                                                                
HHCPN098I Device <span class="number">0</span>:<span class="number">0180</span> initialized                                                                                                                          
/(<span class="number">0008</span>) attach <span class="number">180</span> to maint <span class="keyword">as</span> <span class="number">181</span>                                                                                                                           <span class="number">14</span>:<span class="number">32</span>:<span class="number">43</span>                                                                                                                                                     <span class="number">14</span>:<span class="number">32</span>:<span class="number">43</span> TAPE <span class="number">180</span> ATTACH TO MAINT    <span class="number">181</span>                                                                                                                     
</code>

Теперь в консоли администратора:

<code class="bash">vmfplc2 rew
R; T=0.01/0.01 14:33:26vmfplc2 load
 LOADING.....
 5749010  061638   A1
 VMSERV   EXEC     A1
 5749010  EXEC     A1
 VMFPLC2  MODULE   A2
 END-OF-FILE OR END-OF-TAPE
R; T=0.02/0.10 14:33:33
access 191 c<span class="string">'191 A '</span> RELEASED
R; T=0.01/0.01 14:34:16
vmserv restart 5749010 cp nomemo</code>

Дальше будет много вопросов. Лично я отвечаю наугад — в результате, как и следовало ожидать, ошибка. Но это не критично.

Сохраняем CMS

В CP есть механизм, похожий на динамические библиотеки — Named Systems.

Одно из частых его использований — ускорение работы с CMS. Для того

чтобы сохранить CMS как именованную систему, нужно выполнить следующие

команды:

<code class="bash">define storage 2m
STORAGE = 02048K
CP ENTERED; DISABLED WAIT PSW <span class="string">'00020000 00000000'</span>
IPL 190 PARM SEG=NULL
RELEASE 6 CMS 12/25/78
 CMSSEG SYSTEM NAME <span class="string">'NULL   µ'</span> NOT AVAILABLE.
R; T=0.01/0.01 14:42:14
access 190 B/A
B (190) R/O
190 ALSO = S-DISK
cmsxgen 100000
SYSTEM SAVED
CMSXGEN COMPLETE
define storage 960k
STORAGE = 00960K
CP ENTERED; DISABLED WAIT PSW <span class="string">'00020000 00000000'</span>
IPL 190
RELEASE 6 CMS 12/25/78
savesys cms
SYSTEM SAVED
RELEASE 6 CMS 12/25/78</code>

Поздравляю, теперь у вас есть своя CP/CMS система. Чтобы выключить ее,

введите в консоли оператора команду shutdown. Когда будете запускать ее

снова, выберите warm start.

PS: Вообще-то, еще много что можно рассказать. Но и так уже простыня получилась.

Удачных вам IPL-ов!

Оставляйте лайки.twitter.com facebook.com vkontakte.ru blogger.com livejournal.ru
Оставьте комментарий!

Имя и сайт используются только при регистрации