it-history
November 5, 2023

WABI: еще одна дичь из далекого прошлого

Итак, сейчас я снова буду шатать ваш мозг очередным рассказом про дикие технологии предков. Приготовьтесь к погружению.

Ну FreeBSD, ну линукс, ну 1998й год, ну.. окна Windows 3.1 ?!

Саундтрек к посту:

Вносите дичь

Начну как обычно с цитаты:

Wabi is a discontinued commercial software application from Sun Microsystems that implements the Windows Win16 API specification on Solaris and AIX; a version for Linux was also released by Caldera Systems. Wabi runs applications developed for Windows 3.1, Windows 3.11, and Windows for Workgroups.

Начинаете понимать накал дичи?

И все сильно задолго до этого вашего Wine, собственно Wabi это и есть один из древних предков Wine:

Bob Amstadt, the initial project leader, and Eric Youngdale started the Wine project in 1993 as a way to run Windows applications on Linux. It was inspired by two Sun Microsystems' products, the Wabi for the Solaris operating system, and the Public Windows Initiative,[22]

Ну как спрашивается такое не откопать оживить?

Скажу сразу: все делалось по готовой статье и с готовым образом диска, поскольку старый софт очень капризный и медленный (тем более в эмуляторе). Установка этой йобы с нуля заняла бы несколько дней камлания, у меня столько времени просто нет.

Вот тут выложен один интересный документ — руководство по Wabi, с достаточно детальным описанием его работы:

Ссылка на него в оригинальной статье битая, но я нашел-таки копию

Чтобы вы примерно понимали как оно вообще работает:

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

Поехали.

86Box

Начну с эмулятора, на котором оно запускается:

86Box is a low level x86 emulator that runs older operating systems and software designed for IBM PC systems and compatibles from 1981 through fairly recent system designs based on the PCI bus.

С ним есть одна проблема: нет поддержки FreeBSD, поэтому придется собирать из исходников.

Забираем:

git clone https://github.com/86Box/86Box.git

Сборка реализована на cmake, поэтому делаем стандартные шаги:

mkdir build && cd build

Запускаем cmake:

cmake ..

Нужно будет поставить вот эти библиотеки:

  • FluidSynth
  • FreeType
  • libpng
  • libslirp
  • RtMidi
  • SDL2
  • Qt5 or Qt6 (optional, can be disabled)

Может быть проблема с FreeType2, которая на FreeBSD находится в нестандартном месте, поэтому скрипт сборки ее не находит.

Решается это переопределением переменной окружения:

export FREETYPE_DIR=/usr/local/lib

Подробнее описано в руководстве к модулю cmake.

После установки всех библиотек и отработки cmake без ошибок запускаем сборку:

gmake

Успешная сборка выглядит вот так:

В результате в каталоге build/src должен появиться запускаемый бинарник 86Box, который мы и будем использовать.

Помимо самого эмулятора, необходимо будет скачать еще ROM-образы с прошивками от разных старых железок:

git clone https://github.com/86Box/roms.git

Для development-версии 86Box нужны development же версии roms.

Образ диска

Автор выложил готовый образ диска с уже установленной Caldera Linux + Wabi вот тут.

Скачиваем, распаковываем .rar архив. Внутри будет сам образ диска (caldera.hdd) и конфиг-файл для эмулятора, вот с ним есть одна проблема:

Дело в том что он в кодировке Unicode (UTF-16LE) и просто не читается эмулятором. Как так у автора получилось понятия не имею, возможно он запускал из Windows и там же формировал этот конфиг.

Вообщем файл необходимо перекодировать в ANSII, поскольку не ANSII-символов в конфиге нет - утери символов не будет.

Команда для перекодирования через стандартный iconv:

iconv -t ascii -f utf-16  86box.cfg | tr -d '\r' > out.cfg 

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

Второй вариант (для тупых):

Я это сделал банальным копированием содержимого в буфер обмена и вставкой в nedit.

Ниже приведен работающий конфиг целиком:

[General]
video_fullscreen_first = 0
confirm_reset = 0
confirm_exit = 0
dpi_scale = 0
vid_renderer = qt_software
vid_resize = 2
window_fixed_res = 1280x900

[Machine]
machine = p65up5_cp6nd
cpu_use_dynarec = 1
time_sync = local
fpu_type = internal
cpu_family = pentiumpro
cpu_speed = 90000000
cpu_multi = 1.5
fpu_softfloat = 0
cpu = 4
mem_size = 65536

[Video]
gfxcard = px_trio32_pci

[Input devices]
mouse_type = ps2

[Other peripherals]
hdc = internal

[Hard disks]
hdd_01_parameters = 63, 16, 8126, 0, ide
hdd_01_fn = caldera.hdd
hdd_01_speed = 1997_5400rpm
hdd_01_ide_channel = 0:0

[Floppy and CD-ROM drives]
cdrom_01_parameters = 1, atapi
cdrom_01_ide_channel = 0:1
fdd_01_type = 35_2hd
fdd_02_type = none
cdrom_01_type = 86BOX_CD-ROM_1.00

[Network]
net_01_card = ne2kpci
net_01_net_type = slirp
net_01_link = 0

[Standard PS/2 Mouse]
buttons = 2

[Realtek RTL8029AS #1]
mac = 0a:e7:83

[Sound]
fm_driver = nuked

[Storage controllers]
hdc = internal

Запуск

Запуск осуществляется из каталога, в который был распакован образ диска:

cd /opt/work/caldera-linux/

собственно запуск:

/opt/src/86box-custom/86Box/build/src/86Box --rompath /opt/src/roms

Параметр --rompath это указание на каталог с образами прошивок, скачанными ранее.

Если вы все сделали правильно появится старое доброе окно загрузки BIOS:

Ностальгия в чистом виде.

Как уже упоминал, старые системы очень ненадежные, поэтому на каждый чих будет потеря данных и вызов проверки файловой системы:

Обратите внимание на ext2 в качестве корневой файловой системы. 1998й год однако.

Если все успешно загрузилось то появится приглашение авторизации:

Поскольку Wabi установлен только у рута, придется войти именно им, вводите root в качестве логина и caldera в качестве пароля.

После успешной авторизации появится консоль:

Краткое описание релиза

Вводите kde и запускается графическое окружение:

Сам Wabi запускается командой wabi из терминала:

Вот так выглядит запуск «Блокнота» образца 1998 года на линуксе:

Сеть

Внезапно работает:

Разумеется через NAT, но ни ping ни traceroute не проходят.

Вот так выглядит открытый ЛОР через браузер 1998го года:

Чтобы осуществить подключение из столь старого браузера пришлось поднимать специальный прокси, который "эмулирует" устаревшие версии TLS, не поддерживаемые современными вебсерверами.

Я поднимал retro proxy , который еще пришлось немного поправить:

git clone https://github.com/DrKylstein/retro-proxy.git
cd retro-proxy
yarn install
cp example.env .env
yarn start

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

В index.js:

app.get('*', async (req, res, next) => {
  // пропуск валидации по белому листу
  const friendly = true; //friendlies.some(f => req.hostname.endsWith(f));
  const url = req.originalUrl;
  if(friendly) {
    console.log('friendly site:',url);
  }
...

Отдельный пользователь

Разумеется я не мог не воспользоваться моментом и создал своего юзера для более адекватной работы:

useradd -d /home/alex -m -s /bin/bash alex
passwd alex

И даже запустил X-сессию:

Но Wabi отказалась запускаться, поскольку была установлена из-под root.