WABI: еще одна дичь из далекого прошлого
Итак, сейчас я снова буду шатать ваш мозг очередным рассказом про дикие технологии предков. Приготовьтесь к погружению.
Вносите дичь
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 ..
Нужно будет поставить вот эти библиотеки:
Может быть проблема с 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:
Как уже упоминал, старые системы очень ненадежные, поэтому на каждый чих будет потеря данных и вызов проверки файловой системы:
Если все успешно загрузилось то появится приглашение авторизации:
Поскольку 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
Правка заключается в отключении белого листа, используемого для жесткого ограничения сайтов к которым можно обращаться через такой прокси.
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
Но Wabi отказалась запускаться, поскольку была установлена из-под root.