Эта статья будет если не последней в нашем импровизированном цикле, то во всяком случае у меня не скоро накопится материал на следующую. Речь пойдёт сначала об IP-сети на 286 под Minix, её настройке и тех возможностях, которые у нас с ней откроются. А потом я порассуждаю немного о перспективах использования систем, подобных той, которую мы построили, в современном мире.

Подготовка

Чтобы что-то настраивать, необходимо сначала выбрать текстовый редактор. Из более-менее известных редакторов в Minix есть elvis ? клон того самого, который пищит и всё портит. Если же вы, как и я, не любите выходить из программы кнопкой “Reset”, то вам подойдёт mined. Только придётся держать под рукой его мануал.

Компиляция ядра

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

$ mined /usr/include/minix/config.h

Чтобы заработала сеть, нужно собрать её драйвер. Заменим строчку

#define ENABLE_DP8390     0  /* enable DP8390 ethernet driver */

на

#define ENABLE_DP8390    1  /* enable DP8390 ethernet driver */

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

#define NR_PTYS        0    /* # pseudo terminals (0 to 64) */

на

#define  NR_PTYS        8    /* # pseudo terminals (0 to 64) */

Сохраним файл и приступим к компиляции.

# cd /usr/src/tools
# make hdboot

На моей машине процесс занимает примерно 15 минут.

В результате новое ядро будет собрано и скопировано в каталог /minix. Если файл прежнего ядра назывался 2.0.4, то наше, только что собранное, будет установлено как /minix/2.0.4r0.

Монитор загрузки (Minix boot monitor) по умолчанию настроен на использование самого нового ядра. Чтобы протестировать его, введём halt, а затем boot. На этом этапе никаких видимых изменений в загрузке системы быть не должно.

Если всё-таки что-то пошло не так, можно переключится обратно на старое ядро. Для этого достаточно нажать “Esc” перед загрузкой ОС, чтобы вызвать приглашение монитора загрузки, и ввести в нём команды:

c0d0p0> image=/minix/2.0.4
c0d0p0> boot

Чтобы снова начать использовать последнее собранное ядро:

c0d0p0> unset image
c0d0p0> boot

В любом случае, собрать ядро с драйвером сети ? это ещё не всё. Убедившись, что загрузка происходит нормально, мы можем перейти к следующим шагам.

Создание файла конфигурации сети

Файл /etc/inet.conf изначально содержит что-то вроде

psip0;

Это ? конфигурация loopback-сети внутри нашего хоста, которая доступна без всяких сетевых адаптеров и кабелей. Заменим это на настройку реальной сети:

eth0 DP8390 0 { default; };
psip1;

Сохраним изменения.

Настройка запуска демонов и параметров сетевого адаптера

Снова войдём в монитор загрузки с помощью команды halt.

c0d0p0> servers=inet
c0d0p0> DPETH0=300:10
c0d0p0> save
c0d0p0> boot

Строчка DPETH0=300:10 задаёт параметры ethernet-адаптера: базовый адрес ввода/вывода и прерывание. Помните нашего старого друга?

NE2000-совместимые адаптеры обычно позволяют выбирать порты и прерывание в довольно широком диапазоне. На более старых адаптерах выбор делался с помощью перемычек. Мне «повезло»: на моём адаптере этот выбор делается при помощи специальной утилиты и сохраняется в NVRAM. На языке маркетинга это называлось “Plug and Play”.

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

Результат

Но вот тернии преодолены, и наш ретрокомпьютер получает настройки сети по DHCP. Теперь мы можем передавать на него файлы по FTP и запускать команды через Telnet. Перед этим нужно установить пароль командой passwd, так как вход по сети без пароля невозможен.

При работе dhcpd на экране периодически появляется сообщение dhcpd: /dev/udp0: Invalid argument. Видимо, DHCP-сервер посылает нашему хосту такой запрос, которого он не понимает в силу своей ветхости. Но на работу сети в целом это не влияет.

Обзор Minix 2 с позиции современного пользователя

Когда вау-эффект от знакомства с экзотической системой и гордость от участия в сохранении исторического объекта проходят, начинаешь поневоле представлять примерные сценарии использования ретрокомпьютера в современной жизни. Пожалуй, на нём можно готовить документы в TeX или Markdown (если визуализировать результаты на принтере), или работать с почтой (без HTML, но это даже к лучшему), или чатиться в сети (по-олдскульному, через talk), или превратить в ПЛК для морганияуправления лампочками, или…

Чего же не хватает построенной нами системе до того, чтобы быть юзабельной сегодня? Софта? Тогда что мешает нам собрать этот софт?

Прежде всего, стандартным компилятором в Minix 2 является Amsterdam Compiler Kit ? исторически первый набор компиляторов, ориентированный на использование с несколькими языками программирования и на нескольких целевых платформах (что сейчас называется “retargetable”). В Minix 3 он был заменён на Clang (LLVM). ACK поддерживается до сих пор, но выглядит он сегодня, наверное, довольно архаично. И я не уверен, что все его доработки за последние годы возможно портировать в Minix 2.

Программы для Minix используют модель памяти с близкими ссылками, аналогичную той, которую DOS-разработчики называют малой (Small). Не всякий современный софт можно втиснуть в рамки 64K+64K. А чтобы использовать другие модели памяти, нужно доработать не только ядро и стандартную библиотеку (например, предусмотреть разные варианты alloc() и free()), но и тулчейн, то есть ACK. Возможно, проще будет перейти на другой компилятор, но тут нужно учитывать, что ни Clang, ни GCC не умеют генерировать код для защищённого режима 286.

Ещё одно серьёзное ограничение Minix ? отсутствие разделяемых библиотек ? было устранено в версии 3. Как сообщили разработчики, размер каталогов /bin и /usr/bin при этом уменьшился в 10 раз. Правда, одновременно с этим поменялся и формат исполняемого файла: на смену a.out пришёл ELF. Но в других системах разделяемые библиотеки в формате a.out вполне себе существовали, так что и это ограничение принципиально преодолимо.

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

Что касается сети, то главное, что бросается в глаза современному пользователю ? отсутствие протоколов, использующих шифрование, например, SSH или HTTPS. OpenSSL был в своё время перенесён на 32-битный Minix 2, но даже самые быстрые 286 явно не обладают достаточной вычислительной мощностью для таких алгоритмов. Тут дело исправит разве что аппаратный криптографический акселератор.

Продолжение следует?

Когда у меня выдастся свободное время, я попробую пособирать в Minix какой-нибудь сторонний софт, а также почитать исходники и прицениться к обозначенным проблемам. Если будет что написать, то появлюсь с очередной статьёй. Ну, а если пропаду, то не взыщите. А пока у меня всё. Спасибо за внимание!

Полезные ссылки