Подготовка ваших приложений Inferno к standalone установке

  • Tutorial
Итак, вы написали некое приложение на Limbo, и хотите установить его на другую машину, или распространять через интернет. Скорее всего, там где будет устанавливаться это приложение OS Inferno не установлена. Это горько, но более чем вероятно. :) Что же делать? Обучать пользователей вашего приложения устанавливать и настраивать у себя OS Inferno? Включать полную инсталляцию Inferno (до 250 MB) в архив с каждым вашим приложением? Нет, всё гораздо проще!

Давайте посмотрим, как можно урезать Inferno до минимума, необходимого для работы вашего приложения. Для этого надо разобраться, что происходит при запуске emu — как загружается OS Inferno.

Загрузка OS Inferno


Бинарник emu уже содержит в себе ядро OS, все драйвера, и виртуальную машину Dis. Когда он запускается, ему необходимо параметром -r передать корневой каталог OS Inferno (сам emu при этом не обязан находится внутри этого каталога, так что можно использовать один emu с несколькими разными инсталляциями OS Inferno — отличающимися установленными приложениями и библиотеками).

Загрузившись, emu просто запускает /dis/emuinit.dis (все пути указаны относительно корневого каталога OS Inferno), который должен проинициализировать систему и запустить либо переданное параметром emu приложение либо шелл. (То же самое делает ядро Linux, когда, загрузившись само, просто передаёт управление на /sbin/init.) Если изучить исходники emuinit выясняется, что «проинициализировать систему» — это очень громко сказано, в Inferno всё делается очень просто, даже по сравнению с максимально упрощённой инициализацией Linux.

Это всё. :) Таким образом, для получения standalone инсталляции OS Inferno с вашим приложением необходимо и достаточно следующих файлов и каталогов:
  • Сам emu, находящийся в любом каталоге.
  • Подкаталог dis/ с файлом emuinit.dis.
  • Необходимые emuinit.dis библиотеки (в подкаталоге dis/lib/).
  • Файл(ы) и каталог(и), необходимые вашему приложению.
  • Библиотеки, необходимые вашему приложению (в том же dis/lib/).

Пример: Hello World


Начнём с простого приложения, без каких либо зависимостей. Вот такого:
implement HelloWorld;
include "sys.m";
include "draw.m";

HelloWorld: module
{
    init: fn(nil: ref Draw->Context, nil: list of string);
};

init(nil: ref Draw->Context, nil: list of string)
{
    sys := load Sys Sys->PATH;
    sys->print("Hello World!\n");
}


Сохраните его в helloworld.b, запустите limbo helloworld.b и вы получите helloworld.dis:
; ls -l
--rw-r--r-- U 0 powerman users     265 Oct 25 02:54 helloworld.b
--rw-r--r-- U 0 powerman users     147 Oct 25 02:54 helloworld.dis

Теперь давайте определим зависимости:
; disdep helloworld.dis
; disdep /dis/emuinit.dis
/dis/lib/arg.dis
/dis/sh.dis
/dis/lib/bufio.dis
/dis/lib/env.dis
/dis/lib/readdir.dis
/dis/lib/filepat.dis
/dis/lib/string.dis

У helloworld.dis зависимостей нет, хотя он и использует модуль Sys. Дело в том, что некоторые основные модули написаны на C и встроены прямо в emu, в том числе Sys. У emuinit.dis зависимостей много, но прямых из них только две — arg и sh. Остальное нужно для sh. А сам sh нужен только в том случае, если мы не указали параметром emu приложение, которое нужно сразу запустить. Поэтому мы можем ограничиться одной библиотекой arg. Поехали:
$ mkdir inferno-standalone
$ mkdir inferno-standalone/dis
$ mkdir inferno-standalone/dis/lib
$ cd inferno-standalone/
$ SRC=/usr/local/inferno/
$ cp $SRC/Linux/386/bin/emu ./
$ cp $SRC/dis/emuinit.dis dis/
$ cp $SRC/dis/lib/arg.dis dis/lib/ 
$ cp $SRC/usr/powerman/helloworld.dis ./
$ ./emu -r. helloworld.dis
Hello World!
$

Итак, у нас есть standalone инсталляция helloworld, готовая к работе на любой системе с Linux (для других OS нужно просто взять emu скомпилированный для этих OS). Давайте посмотрим, сколько она «весит». (Кстати, emu под Linux по умолчанию не strip-нут, так что его можно заметно уменьшить.)
$ strip emu
$ find -type f -printf "%8s %p\n"
 1562504 ./emu
     147 ./helloworld.dis
     652 ./dis/lib/arg.dis
    1518 ./dis/emuinit.dis

Пример: калькулятор


Теперь давайте возьмём нормальное приложение. Например, калькулятор, входящий в стандартные утилиты Inferno. Он достаточно навороченный, кстати.
; disdep /dis/calc.dis
/dis/lib/arg.dis
/dis/lib/bufio.dis
/dis/lib/daytime.dis
/dis/lib/string.dis
/dis/lib/rand.dis
$ cp $SRC/dis/calc.dis ./
$ cp $SRC/dis/lib/{bufio,daytime,string,rand}.dis dis/lib/
$ find -type f -printf "%8s %p\n"
   32567 ./calc.dis
 1562504 ./emu
     147 ./helloworld.dis
    4630 ./dis/lib/bufio.dis
     652 ./dis/lib/arg.dis
     209 ./dis/lib/rand.dis
    4051 ./dis/lib/string.dis
    4701 ./dis/lib/daytime.dis
    1518 ./dis/emuinit.dis
$ ./emu -r. calc.dis
1+2
3
exit
$ ./emu -r. calc.dis 1+2
3
$

Погодите, а как же зависимости самого emu?


Да, есть такой момент. Чтобы запустить emu на другой машине там должны быть все необходимые emu библиотеки. К счастью, библиотек всего две. К сожалению, обе относятся к X — это libX11 и libXext.

В принципе, эти библиотеки отлично ставятся без необходимости тащить полностью Xorg. Вот что пришлось бы установить на сервере с Gentoo Linux:
# emerge -pv x11-libs/libX11 x11-libs/libXext

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild  N    ] x11-misc/util-macros-1.1.5  47 kB
[ebuild  N    ] x11-proto/xproto-7.0.10  140 kB
[ebuild  N    ] x11-proto/inputproto-1.4.2.1  47 kB
[ebuild  N    ] x11-proto/kbproto-1.0.3  57 kB
[ebuild  N    ] x11-proto/xf86bigfontproto-1.1.2  37 kB
[ebuild  N    ] x11-libs/xtrans-1.0.3  USE="-debug" 101 kB
[ebuild  N    ] x11-proto/bigreqsproto-1.0.2  36 kB
[ebuild  N    ] x11-proto/xcmiscproto-1.1.2  36 kB
[ebuild  N    ] x11-proto/xextproto-7.0.2  67 kB
[ebuild  N    ] x11-libs/libXau-1.0.3  USE="-debug" 225 kB
[ebuild  N    ] x11-libs/libXdmcp-1.0.2  USE="-debug" 216 kB
[ebuild  N    ] x11-libs/libX11-1.1.4  USE="-debug -ipv6 -xcb" 1,540 kB
[ebuild  N    ] x11-libs/libXext-1.0.3  USE="-debug" 256 kB

Total: 13 packages (13 new), Size of downloads: 2,799 kB

Но для работы на сервере сетевого приложения (у которого GUI нет) эти библиотеки абсолютно не нужны. Ведь даже отлаживать это приложение в графическом отладчике я могу на своей рабочей станции, просто подмонтировав каталог /prog/ с сервера, где запущено приложение. Для решения этой проблемы можно использовать специальную версию emuemu-g, которая собирается и работает без libX11 и libXext.

emu-g

Чтобы собрать emu-g нужно запустить
mk CONF=emu-g install

После этого вы сможете запускать emu-g вместо emu (кстати, emu-g весит после strip-ания всего 700KB):
$ emu-g
; pwd
/usr/powerman
; wm/wm
wm: cannot load $Draw: module not built-in
;


P.S. Каталог inferno-strandalone в .tgz у меня занял 666KB. :-)

Update: добавлена информация об emu-g.
Метки:
Поделиться публикацией
Похожие публикации
Комментарии 35
  • 0
    Кстати, если поиграться с emu/Linux/emu и почитать conf(10), то скорее всего можно будет собрать бинарник emu, в который будет встроена корневая файловая система со всеми файлами и каталогами необходимыми вашему приложению. В этом случае ваше приложение можно будет распространять в виде одного бинарника, размером около мегабайта, который можно будет запускать в любом каталоге и без параметров — как обычное приложение.
    • +1
      Угу, так и есть. Работает! Получился отдельный .exe, полтора мегабайта, отлично запускается без параметров и выдаёт HelloWorld. :) Всё своё (корневую файловую систему с моим helloworld.dis) держит внутри .exe, больше ему ничего для работы не нужно.
      • 0
        Круто не по детски!
        • 0
          Ссылку на .exe можно? Хочу поиграться с ним
          • 0
            Запросто: helloinferno.exe.

            Чтобы было интереснее играться, я помимо программки выводящей hello (при запуске helloinferno.exe без параметров) встроил туда sh, ls, pwd и echo. Использовать так:

            C:\> helloinferno.exe
            Hello from Inferno! :-)
            C:\> helloinferno.exe echo wow
            wow
            C:\> helloinferno.exe sh
            ; pwd
            /
            ; ls -l
            ...
            
      • –4
        Что-то мне даже не хочется узнавать, что такое ОС Инферно, не смотря даже на мой юникосоводческий стаж.
        • 0
          Не нравится — не ешь.
          Народная мудрость.
          • 0
            С одной стороны — Вы абсолютно правы. С другой — во многом благодаря именно такому отношению и Plan 9 и Inferno практически никому не известны и не используются, несмотря на значительное технологическое превосходство. :(

            Чтобы что-то понравилось — его надо распробовать. А т. к. Plan 9 и Inferno системы достаточно сильно непривычные даже для человека освоившего и винду и линух и макось, то самостоятельно их распробовать достаточно непросто. А текущее сообщество, общающееся в irc и mail list, имеет тенденцию на вопросы «не впиливающих» новичков либо не отвечать вообще, либо отвечать в стиле «тебе это не надо» (без объяснений), либо просто посылать «читать исходники». И я их, в принципе, понимаю. Не царское это дело, Робу Пайку лично объяснять каждому новичку, почему в acme нет подсветки синтаксиса. Хотя иногда случается — например недавно была очень любопытная дискуссия на тему "почему в Plan 9 (и Inferno, кстати) такие бедные по функциональности регулярные выражения".

            Возможно, со временем здесь образуется более дружелюбное к новичкам сообщество. Чем больше людей будет пользоваться Inferno — тем нам же лучше: будет больше возможностей по обмену опытом и, возможно, часть нужных нам приложений и библиотек напишет кто-нибудь другой. :)
            • 0
              Я достаточно дружелюбен :)
              Просто между троллем и новичком есть небольшая разница. Тот что выше написал — явный тролль.
              А по поводу новичков — всё довольно просто, и такое бывало и раньше.

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

              До этого момента вопросы в стиле «а зачем оно надо» и «чем оно лучше <вотетого>» можно сразу считать троллингом, и игнорировать.
              Нормальный новичок скажет и спросит совсем другое.
              Я установил Inferno в первый раз лет 5 тому назад. И успешно удалил так толком и не разобравшись что это и для чего оно.
              Но даже тогда я не задавал таких вопросов.
              • 0
                Я не тролль. Просто я не понимаю, зачем люди специально покупают себе номера на машину «666», и нафига очередной юникс-клон называть «Inferno».

                И поверьте мне, я не новичек, я помню даже mmdf и установку tcp/ip стека в SCO ODT 2.0

                И я не задавал вопросов: «а зачем оно надо» и «чем оно лучше <вотетого>»

                Я всего-лишь высказал свое мнение, относительно название.

                • 0
                  Может у меня что-то с глазами, но я не вижу что бы вы в посте говорили о названии.
                  А так выглядит как банальный троллинг. Не нравится идите дальше, «срать в каментах» не обязательно.
                  • +1
                    Я перечитал свой коммент, точно. Троллинг. Я как обычно косноязычен, извините уж.
                    И уж тем-более, не хотел целенаправлено «срать в комментах».
                    Еще раз извините.
                    • 0
                      Бывает :) Главное — замечать и исправляться.
                  • 0
                    1. это не «очередной юникс-клон»
                    2. название придумал Роб Пайк — читал Данте в процессе разработки этой ОС
                    3. rtfm
                    • 0
                      О, спасибо за пояснение, по ртфм-ил, прояснилось. Правда все равно не понял, чего ему так «Божественная комедия» приглянулась. (Ну не лично ему, конечно, а вообще, как таковое, по-моему, Весьма посредственное произведение).
                      • 0
                        У них традиция — выбирать имена максимально неудобные для маркетинга. :)
                • 0
                  Кстати, если Вы в курсе всех событий — может сделаете ЧаВо с такими вопросами?
                  • 0
                    Я ещё не волшебник, я только учусь… :)

                    Лажать очень не хочется, тем более в форме статей. Я бы вообще рот не открывал, пока не разберусь досконально. Но сейчас нет альтернативы — лучше я буду писать в меру своего понимания, чем вообще никакой информации по теме не будет. Если сюда придут «старшие товарищи» — я с удовольствием заткнусь и буду внимать.

                    Меня всегда сильно раздражало, что книжки по IT зачастую пишут те, кто толком не понимает тему, на которую разливается соловьём на 300 страниц. А те, кто тему реально знает — книжки пишут очень редко. В результате на таких книгах вырастают поколения, у которых понтов дофига, а дело делать правильно не умеют. Более того, ещё и сопротивляются попыткам их вразумить, ссылаясь на эту макулатуру.

                    В общем, FAQ с такими вопросами я действительно составляю, но пока только для себя. Когда буду уверен, что лажи в нём нет (если таковой момент наступит) — опубликую обязательно.
                    • 0
                      А вы в форме вики сделайте :)
                      Если будет что не так — поправят.
            • 0
              Очень интересные вещи рассказываете, мсье powerman.
              С небольшими периодами в прошлом присматривался к этой ОС (точнее, к Plan 9), но на то время не было русскоязычной документации, а главное русскоязычного сообщества.

              У меня к вам вопрос: сильно отличается Inferno от Plan 9? Поправьте меня, может быть они вообще не имеют ничего общего.
              • +2
                Насколько я читал, Inferno от Plan 9 отличается не сильно. Архитектура у них одинаковая, основной сетевой протокол тоже (только в Inferno он называется Styx, а в Plan 9 — 9P2000). Ядро, скорее всего, практически идентичное (один фикс часто делается одновременно и в ядре Inferno, и в ядре Plan 9). Основные отличия:

                • — Вместо работы на голом железе x86 ядро работает как эмулятор под управлением более традиционных операционок (хотя на голом железе x86 ядро тоже умеет работать, драйверов в Inferno для него ещё меньше, чем у Plan 9, так что на практике в запуске native Inferno на x86 смысла мало).
                • — В ядро встроена виртуальная машина Dis, и выполнять Inferno умеет только байт-код Dis, традиционные бинарники не поддерживаются вообще.
                • — Как следствие предыдущего пункта, программировать под Inferno на C (как в Plan 9) нельзя. Можно писать только на языках, генерирующих байт-код Dis. Сейчас это только Limbo (ну, ещё есть ассемблер Dis). (На C можно писать только драйвера и встроенные модули для ядра Inferno.)
                • — Inferno заточена под работу на встроенных устройствах (вот на них Inferno работает в native режиме на голом железе), может работать на 1 MB RAM.
                • — Софта под Inferno значительно меньше, чем для Plan 9. Во многом это следствие невозможности портировать C-приложения, но т. к. Inferno (в отличие от Plan 9) и не пытается заменить десктопные или серверные OS, а дополняет их работая на них как обыкновенное приложение — сетевой сервис, то это не является помехой.

                Но я с Plan 9 не знаком, всё вышеописанное подчёрпнуто из чтения документации и общения с другими — поэтому в моём описании отличий могут быть (в т. ч. серьёзные) неточности.

                Возможно я очень-очень сильно не прав, но я не вижу для Plan 9 практического применения.

                Plan 9, в отличие от Inferno, пытается играть на одном поле с традиционными десктопными и серверными OS, и шансы у него IMHO нулевые. А если нет возможности применять Plan 9 в текущей работе, то крайне сложно найти время на изучение системы — я ведь фрилансер, а не студент: если не работаю, то нечего кушать. А Inferno даёт возможность решать обычные задачи используя её просто как ещё один язык программирования с виртуальной машиной — а-ля Java. Если заказчику всё-равно, на каком языке разрабатывается система, то вполне реально использовать Inferno для выполнения текущей работы!

                Из того, что мне известно, Plan 9 используется на достаточно нагруженном сервере Bell Labs (который большую часть времени не работает, уж не знаю по какой именно причине и виновал ли в этом Plan 9 или нет), на сервере Vita Nuova (этот работает стабильно, но явно не относится к очень популярным сайтам, да и на сайте вроде бы чисто статический контент; да ещё дико тормозящий mail list), на домашних серверах нескольких энтузиастов, и т. п.

                На десктопе Plan 9 используется очень небольшим количеством людей. Теми, кто вполне комфортно чувствует себя в Acme, а не в Vim/Emacs. Да из них многие так и норовят портировать под него софт из Linux или запустить его под linuxemu — чего тогда просто не сидеть под Linux, спрашивается?

                Остальные пускают Plan 9 под VMware/Qemu, и используют его для изучения и экспериментов, а не работы. Вероятно, у них на это есть время. У меня — увы, нет. Поэтому Inferno, и только Inferno! :-)
                • 0
                  Спасибо за исчерпывающий ответ.
              • 0
                Очень интересует один вопрос. Есть ли порт к примеру ТрэйсМанки под эту замечательную ось? Если быть точнее, то есть проект CouchDB, который использует мозиловский JavaScript движок. Было бы интересно посмотреть на производительность этого «винигрета» под микроядерной осью. )
                • 0
                  В Inferno есть реализация JavaScript, для её браузера Charon. Но, насколько я понимаю, это не более чем PoC. Т. е. оно как-то работает, но врядли поддерживает функциональность Gmail или готово соревноваться по скорости с современными движками JavaScript.

                  С другой стороны, я практически уверен в том, что если написать компилятор JavsScript в байт-код Dis, то TraceMonkey и V8 будут нервно курить в сторонке. Может Вы возьмётесь за эту задачку? :)
                  • 0
                    К великому стыду и сожалению я забросил магию прикладного программирования. =(
                    Финансовая чаша колыхнулась в сторону веб разработок…
                    Хотя порывает, знаетели, как раньше… Кинуть всё и заняться действительно любимым занятием… творить!!!
                • 0
                  Отличная статья. Все более чем любопытно, кроме языка, на котором написан HelloWorld. Что, другие языки не приветствуются? По комментариям к предыдущей статье я успел замеитить, что язык имеет некоторые особенности, а учить мне его для опытов как-то не хочется, и так винегрет в голове :)
                  • 0
                    Других языков высокого уровня генерирующих байт-код Dis пока вроде бы нет, поэтому под Inferno можно писать только на Limbo. Впрочем, реализации других языков ничего не мешает — кроме отсутствия программистов, которые бы этим занялись. В частности, насколько я слышал, когда-то был проект по трансляции байт-кода Java в Dis, чтобы Java-приложения работали в Inferno. Проект работал, по крайней мере в состоянии PoC, но потом заглох (то ли спонсор пропал, то ли интерес — не помню, что там за история была).

                    Впрочем, Limbo — отличный язык! Синтаксически очень близок к C, но он сильнотипизированный (с поддержкой строк, кортежей и сложных структур с встроенными функциями — что-то типа объектов), в нём нет прямой работы с памятью (указатели/malloc/free), есть сборщик мусора (точнее, он есть в Dis), и есть серьёзная поддержка concurrent programming — нити и каналы. Не смотря на отсутствие прямой работы с памятью — полный контроль над использованием памяти — в отличие, например, от perl, который жрёт память со страшной силой и контролю в этом смысле не поддаётся.

                    Насколько я понимаю, отсутствие других языков в Inferno во многом вызвано тем, что Limbo слишком хорош, и не возникает желания его на что-то заменить. А для скриптов есть sh.
                    • 0
                      Limbo — скорее императивный Erlang: возможности у Erlang схожие с Limbo. Другое дело, что вряд ли существует реализация Erlang под Inferno, потому что Inferno и Erlang в каком-то роде конкуренты :) Да и по другим причинам. Впрочем, я почитал немного про Limbo, удостоверился, что особых проблем с применением его быть не должно.

                      P.S. А если я попрошу рассказать о том, как выглядит ваша «лаборатория разработчика» под Inferno, то можно ли надеяться в следующих статьях об этом почитать? Или если подобные статьи уже есть, то достаточно будет ссылки. Спасибо.
                      • 0
                        Лаборатория выглядит очень просто. Поскольку работу в Acme я не осилил, то в одной консольке запущен mc и vim (который при записи файла автоматически его компилирует limbo — реализация limbo есть и для host OS и для Inferno — и показывает ошибки компиляции так же, как для C или Perl), а в другой запущен в текстовом режиме emu, в командной строке которого я запускаю только что сохранённое (и откомпилированное) Vim приложение.

                        Графическую среду emu я запускаю только если нужен отладчик.

                        При изучении сетевых возможностей Inferno — запущено несколько emu в разных консольках в текстовом режиме с разными сетевыми сервисами.

                        Поскольку из линуха и mc по виртуальным файлам/каталогам Inferno не побродишь, то с этими файлами работаю в консоли emu. (Теоретически в ядре линуха есть поддержка 9P, так что можно файловую систему Inferno подмонтировать под линухом и бродить в mc в том числе и по виртуальным файлам.)

                        P.S. «Консольками» я называю xterm-ы. :) У меня просто X-ы настроены так, что очень напоминают работу в текстовом режиме с кучей виртуальных консолей по Alt-Fx.
                        • 0
                          А какая-нибудь более удобная консоль, чем стандартная emu, наличествует?
                • 0
                  Эх, жаль инферну забросили, статьи интресные были
                  • 0
                    Никто ничего не забрасывал. Я использую Inferno в своём проекте.

                    А что касается статей — у меня пока руки не доходят писать, но rapidfx и j1m активно переводят самую разную информацию по Inferno на русский. Плюс есть чат по Inferno в jabber: xmpp://inferno@conference.jabber.ru.
                    • 0
                      спасибо за ссылки, давно туда не заглядывал, ну и сюда постили хотя бы коротенькие новости, если есть конечно, фундаментальные статьи часто не попишешь понятное дело
                      • 0
                        Ну дык кто Вам мешает это делать? :) Аккаунт на хабре — есть, блог — коллективный… Я лично только рад буду, если сюда не только я один буду что-то постить.

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