it-history
April 30

OSF/1 в эмуляторе

Еще один редкий UNIX из далекого прошлого, который был оживлен из небытия и выведен в интернет.

История

OSF/1 это еще одна редкая UNIX-система из далекого прошлого, которую вы врядли могли наблюдать в живую:

OSF/1 is a variant of the Unix operating system developed by the Open Software Foundation during the late 1980s and early 1990s. OSF/1 is one of the first operating systems to have used the Mach kernel developed at Carnegie Mellon University, and is probably best known as the native Unix operating system for DEC Alpha architecture systems.

Прямой участник корпоративных Unix-разборок 90х известных как Unix Wars, в отличие от A/UX которую автор оживил и запустил в эмуляторе в прошлой статье, OSF/1 не канула в лету в бурные 90е а будучи переименованной в TRUE64 UNIX поддерживалась аж до 2012го года!

Вот вам и «динозавр», внезапно отказавшийся умирать.

Еще из интересных фактов стоит упомянуть использование этой ОС для суперкомпьютеров:

IBM used OSF/1 as the basis of the AIX/ESA operating system for System/370 and System/390 mainframes.[12]
Intel Paragon supercomputers used a version of OSF/1 featuring the Mach 3.0 kernel.[13]
OSF/1 was also ported by Kendall Square Research to its proprietary microarchitecture used in the KSR1 supercomputer.
Суперкомпьютер KSR1 Единственное фото в приличном разрешении этой редкой машины.

И попытку адаптации компанией Apple в качестве замены A/UX:

Apple Computer intended to base A/UX 4.0 for its PowerPC-based Macintoshes upon OSF/1,[11] but the project was cancelled and PowerOpen deprecated.

Которая увы не взлетела.

OpenBSD/luna88k running inside GXemul, on an emulated SGI O2 running OpenBSD/sgi (on a FreeBSD/amd64 host).

Эпичность скриншота выше невозможно осознать обывателю, далекому от вопросов эмуляции редких систем. Поэтому будет отдельная статья посвященная Luna 88K системе.

Эмулятор

Называется эта штука Gavare's eXperimental Emulator за авторством Anders Gavare, согласно официальному описанию с сайта проекта:

GXemul is a framework for full-system computer architecture emulation, mostly written in 2003-2005. Several real machines were implemented within the framework, consisting of processors (ARM, MIPS, Motorola 88K, PowerPC, and SuperH) and surrounding hardware components such as framebuffers, interrupt controllers, busses, disk controllers, and serial controllers. The emulation is working well enough to allow several unmodified "guest" operating systems to run.

По сути это такой сильно разросшийся «pet project», созданный одним энтузиастом ради эмуляции особо редких систем:

Простым обывателям из этого списка знакомы наверное только игровые платформы, в лучшем случае еще и «малинка» (Rastberri Pi), а про некоторые особо редкие не знал даже сам автор. 

Так что эта статья точно не последняя. будут еще с другими эмулируемыми ОС в этом эмуляторе. Один Ultrix чего стоит.

Сборка

К сожалению эмулятор достаточно давно не развивается, его последняя релизная версия 0.7.0 была выпущена в 2021м году.

Так что есть определенные проблемы со сборкой в современном окружении, которые придется исправлять вручную.

В этот раз все действия производились на обычном Mageia Linux 9, без BSD и прочих изысков.

Использовался стандартный GCC 12:

Несмотря на строчку из документации по сборке:

This should work on most Unix-like systems, with few or no modifications to the source code. The basic requirement is a reasonably modern C compiler (C99).

эмулятор все же написан на C++ а не на чистом Си, поэтому для сборки требуется компилятор C++, который ныне устанавливается отдельным пакетом.

Но в остальном автор не врет:

GXemul does not require any additional third-party libraries to build.

и проект действительно не использует никаких внешних библиотек. Кроме X11, ради эмуляции графического экрана:

  • X11 headers and libraries: for graphical framebuffer emulation.

Так что ничего дополнительно устанавливать не придется.

С версии 0.6 разработка переехала на Github, откуда мы и заберем последние правки исходников (ветка master):

git clone https://github.com/BitEdits/gxe.git

Наверное главное западло с этим эмулятором то, что он неправильно работает с некоторыми эмулируемыми ОС без специального ключа сборки --debug :

When compiling on Linux via a modern GCC please bear in mind that the emulator wont work correctly if compiled with -O optimization flags. Please use -debug configure option to disable such optimization

Что выяснилось разумеется не с первой попытки.

Изучаемая OSF/1 как раз из числа проблемных, поэтому попытка запуска в версии эмулятора, собранного без этого волшебного ключа выдает kernel panic:

Теперь вы тоже видели как выглядел kernel panic в 1992м, поздравляю.

Согласно официальному описанию, ключ --debug всего лишь отвечает за отладочную сборку:

configure for a debug build (turn off optimizations)

На практике все несколько сложнее и этим ключом по-сути переделывается половина эмулятора, помимо отключения оптимизаций, еще собирается отдельный оконный отладчик (см. ниже).

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

DEBUG=YES

Скрипт кстати не от autotools а полностью собственной разработки.

После каждой правки configure скрипта или шаблонов Makefile.skel (см. ниже) необходимо перезапускать настройку вызовом:

 ./configure

Теперь запускаем make для запуска сборки.

Первая ошибка появится тут:

Связана она аж с изменениями в спецификации самого языка C++ и по-хорошему стоило эту логику переделать. Но я забил (поскольку это не мой проект) и пошел по пути упрощения — просто переключив используемую версию спецификации при сборке.

Файл, в котором появляется эта ошибка, включается в сборку только при ключе --debug , так что без него вы эту ошибку вообще не увидите.

В файле src/main/Makefile.skel в конец значения параметра CXXFLAGS необходимо дописать указание на версию спецификации --std=c++14:

CXXFLAGS=$(CWARNINGS) $(COPTIM) $(DINCLUDE) -std=c++14 

Заново запускаем configure скрипт и сборку:

./configure
make

Следующая ошибка также связана с изменением в поведении компилятора:

И да, эта ошибка также обоснована и по хорошему код стоит отрефакторить. Когда-нибудь потом.

А на сейчас я просто отключил предупреждение, добавив в файл src/main/promemul/Makefile.skel параметр -Wno-narrowing:

CXXFLAGS=$(CWARNINGS) $(COPTIM) $(DINCLUDE)  -Wno-narrowing

Повторно запускаем configure-скрипт и сборку:

./configure
make

В этот раз сборка должна завершиться успешно и в корне проекта появится бинарник gxemul:

Запуск

К сожалению не удалось найти установочный диск OSF/1, поэтому я использовал готовый образ диска, в котором ОС уже была развернута.

Взят он был отсюда, также продублирован в нашем Телеграм-канале, если автор вдруг решит заблокировать доступ.

Команда запуска выглядит так:

./gxemul -e 3max -X -d osf1_mips.img  -j vmunix

Где -e 3max указание на тип эмулируемой машины, 3max это DECstation 5000/200 (3MAX):

Ключ -X указывает использовать графический фреймбуфер, без него вы не увидите графического приглашения.

Ключ -d указывает на путь к образу диска (в архиве по ссылке выше) а вот -j это особая уличная магия:

-j name   set the name of the kernel; for DECstation emulation, this passes
           the name to the bootloader, for example:
               -j netbsd     (NetBSD/pmax)      -j bsd      (OpenBSD/pmax)
               -j vmsprite   (Sprite/pmax)      -j vmunix   (Ultrix/RISC)

Войти можно под учетной записью root с паролем Jaguar64.

Новый пользователь создается в терминале xterm, с помощью команды adduser:

Изменить пароль можно стандартной командой passwd.

Сеть

Разумеется без поддержки сети толку от такой эмуляции было бы немного. К счастью эмулятор сделает за вас половину работы по пробросу сети в эмулируемую систему (сторону хоста) — сам поднимет виртуальный интерфейс, назначит IP-адрес и даже выставит DNS.

Вам остается только вторая половина — настроить сеть в системе 1992 года.

Как уже описал выше, эмулятор сам создает виртуальный сетевой адаптер, который со стороны гостевой OSF/1 называется ln0.

Должна отрабатывать команда:

ifconfig ln0

и отображать текущее состояние адаптера.

Также эмулятор самостоятельно создает исходящий адаптер с IP-адресом 10.0.0.254, который также является маршрутизатором.

Эти детали отображаются в консоли при запуске эмулятора:

       simulated network: 10.0.0.0/8 (max outgoing: TCP=100, UDP=100)
       simulated gateway+nameserver: 10.0.0.254 (60:50:40:30:20:10)
       simulated nameserver uses real nameserver 192.168.1.1

Так выглядит запрос состояния устройства со стороны гостевой OSF/1:

Назначим IP-адрес 10.0.0.2 виртуальному адаптеру, сразу после настройки должен отрабатывать ping:

Таким образом обеспечен сетевой доступ к хосту из гостевой ОС.

Но чтобы заработал доступ еще и наружу — в интернет, необходимо включить маршрутизацию в гостевой ОС (со стороны хоста это NAT):

В этот момент автор наткнулся на свежую статью 2024го года от Kevin Read, где случились два важных открытия:

  • в интернете есть более современная версия OSF/1 2.0 (да, оно официально так называется).
  • существует и подробно описана корректная настройка сети.

Шаги настройки описанные выше в правильной версии закрываются командой netsetup:

Так вы получите базовую настройку сети и маршрутизацию, но вот с DNS все несколько сложнее.

Отвечает за настройку работы резолвера команда bindsetup:

Вся последовательность выглядит как-то так:

Enter the default BIND domain name []: localdomain
Enter your choice [c]: c
Enter the host name of a BIND server: vigor
Enter the Internet address for 10.0.0.254. []: 10.0.0.254
                                  # affected: /etc/rc.config, /etc/hosts

Would you like to run svcsetup now to edit the /etc/svc.conf file (y/n) [y] ? 
Enter your choice(s).  For example "0 3 5" [no default] : 2
"hosts" database [2]: 3
                                  # affected: /etc/svc.conf
                                  #           hosts:  local,bind

Главное это задать IP-адрес хоста, который отвечает за DNS.

В результате всех этих манипуляций должен отрабатывать ping из гостевой OSF/1 и с использованием доменного имени:

OSF/1 2.0

С помощью образов дисков, взятых отсюда, удалось запустить и версию 2.0 этой системы:

Отличить можно по качеству картинки, в 2.0 версии сильно больше цветов. Учетная запись тут: root/test123

Команда запуска несколько отличается:

./gxemul -X -e 3max -d osf1-2.0-root-full.img -d osf1-2.0-opt.img -M 128 -j genvmunix

Еще тут в каталоге /usr/local/src находится куча полезного софта в виде исходников, для примера удалось запустить сборку bash:

К сожалению не до конца:

Хотя Kevin пишет что should compile fine:

The installed MIPS C compiler is good enough to compile some basic things, and gcc 2.9.5 should compile fine. Apparently binutils is broken, but ld is installed anyway.

Думаю реальная проблема в лицензиях, которые в те времена выдавались на компиляторы.

Так что надо разбираться.