Старые ОС: 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
можно прочитать в Википедии.
Для тех кто хочет не красноглазить, а просто посмотреть конечный результат: есть готовые образы системы с подробными инструкциями (правда на английском). Остаток статьи можно не читать.
Материалы и инструменты
Для установки и работы нам понадобится:
- Эмулятор S/370: Hercules. К сожалению, не могу дать советов по установке для Windows, тк сам пользуюсь Linux.
- Эмулятор дисплея IBM 3270: x3270.
- Эмулятор терминала (подойдет обычный Telnet).
- Образы лент с www.cbttape.org/:
- образ стартового диска.
- обновление системы.
- По желанию: исходники системы.
- По желанию: дополнительные программы, правда, я сам еще не понял как их устанавливать.
- Документация отсюда. Необходима по крайней мере инструкция по установке.
Все, естественно на английском, но лично для меня это было только
стимулом его выучить. IBMовский английский считается образцом грамотного
языка.
Подготовка.
Все фалы проекта я помещаю в папку
/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-ов!