OUTDATED: Эта статья устарела, для установки под современными OS см. новую статью.
Update: Добавлено описание установки под Windows XP SP2.
Update: Добавлено описание установки под Mac OS X 10.4.8 Tiger.
Update: Добавлено описание установки под Mac OS X 10.5.5 Leopard.
Да, версия в svn называет себя именно так! Установите, запустите браузер (Charon) и сами убедитесь. (В принципе, последний релиз это "Fourth Edition", но на практике это уже давно тот же svn — «Fourth Edition» вышел примерно в 2004, а сейчас на офф.сайте под видом «Fourth Edition» выложен снапшот svn от 20071003.)
Версия в svn абсолютно стабильна, и, в отличие от инсталляшки «Fourth Edition», её значительно проще обновлять. Для установки на боевые сервера или выпуска вашего приложения она не менее удобна. В общем, минусом является только необходимость иметь subversion и компилятор для сборки системы, всё остальное плюсы.
Итак, ставим свеженькую OS Inferno из SVN, в hosted режиме (т.е. в виде эмулятора, работающего под другой OS).

Хотя Inferno должна устанавливаться и работать одинаково во всех системах, все мы прекрасно знаем, что нюансы есть всегда. Я протестировал установку в Hardened Gentoo Linux и в Ubuntu 8.04. Надеюсь, такой выбор систем перекроет большинство нюансов установки и в других дистрибутивах Linux.
С компилятором и .h-файлами в Gentoo проблем не будет, я вас уверяю. :) А вот Hardened немного работы добавит. Дело в том, что
Вот чего тут нет… э… ничего тут нет. :) Ни Hardened нет, ни subversion, ни библиотек, ни .h-файлов. Придётся ставить:
Возможно нужно будет подключать дополнительные репозитории, точно не скажу — у меня они были уже подключены для установки других приложений.
Ниже описана установка от root, в каталог
Затраты времени/трафика/дискового пространства примерно следующие:
Качаем. Все команды, если не сказано обратного, выполняются от root. При установке в домашний каталог установите INFERNO_ROOT, например, так:
Настраиваем параметры компиляции. Вместо
Собираем систему. Помните,
Настраиваем параметры emu. Эту команду желательно прописать себе в
Настраиваем пользователя inferno. При установке в домашний каталог эти команды выполнять не нужно. Второй chown нужен при включенном TPE.
Update: см. комментарий по поводу настройки /tmp.
В принципе, к этому моменту OS Inferno установлена, и её можно использовать. Но в «Fourth Edition» входят дополнительные шрифты (B&H Lucida), которые из-за лицензионных ограничений гугл не разрешает выкладывать в svn на code.google.com. В принципе большинство приложений будет работать и без них. Кроме того, их можно заменить альтернативными бесплатными шрифтами (так вроде бы сделали в проекте Acme SAC). Но я с этим не разбирался. Поэтому мы сейчас, быстренько, выкачаем и установим во временный каталог «Fourth Edition», и выдерем из неё эти шрифты. :)
Точка с запятой в начале строк — это приглашение Inferno-вского sh. Завершение работы с Inferno — в текстовом режиме либо Ctrl-D, либо Ctrl-C, в графическом — закрытие графического окна Inferno. (Графическая среда запускается командой
Вход под пользователем inferno. При установке в домашний каталог этот шаг пропускаете.
Вход под обычным пользователем. Команда
При запуске
При установке в домашний каталог на этом настройка заканчивается — нет никакого смысла настраивать три субъекта авторизации с кучей паролей при работе под единственным аккаунтом.
Для начала необходимо объяснить, что и зачем настраивается. Авторизация работает следующим образом: клиент и сервис взаимно авторизуют друг друга с помощью сертификатов на базе private/public ключей — всё почти как у ssh или https. Почти потому, что авторизуют они друг друга действительно взаимно. Для этого они оба должны получить свои сертификаты у одного и того же CA (certificate authority), которому оба доверяют. Так что именно CA, выдавая или не выдавая эти сертификаты, определяет, будет у клиента доступ к сервису, или нет.
Таким образом, нам нужно настроить три разные системы — сервер авторизации, некий полезный сервис, и терминал клиента. Для этого мы можем запустить три независимых
Первым делом нужно прописать адрес (hostname или IP) сервера авторизации на машинах клиента и сервиса. Но, поскольку файлы у них в нашей конфигурации совпадают, то достаточно отредактировать один файл /usr/local/inferno/lib/ndb/local (можете вписать 127.0.0.1):
Дальше запускаем сервер авторизации. Он будет запускаться под юзером inferno, и все файлы с ключами и сертификатами CA будут доступны только этому юзеру.
… очищаем базу ключей
… генерируем сертификат нашего CA, на указанное имя (любое)
… запускаем сервис авторизации, при этом потребуется установить пароль, который в будущем нужно будет вводить при каждом запуске этого сервиса — это необходимо т.к. ключи в файлах будут зашифрованы этим паролем
… теперь мы можем завести на нашем сервисе авторизации настоящие пользовательские аккаунты, с паролями, наконец-то :) — один для пользователя inferno (просто чтобы не заводить ещё и третьего юзера, им будет пользоваться второй сервер для запуска полезных сервисов) и второй для пользователя powerman (который будет использовать клиентский терминал на третьем сервере для подключения к полезному сервису на втором сервере)
… ну и полюбуемся на запущенные на этом «сервере» TCP-сервисы
Сервер авторизации оставляем работать, и запускаем следующий
… ndb/cs это что-то вроде универсального ресолвера, без него в Inferno с сетью особо не поработаешь (есть ещё ndb/dns, но в hosted режиме его можно не запускать и использовать dns-ресолвер host OS)
… обращаемся к сервису авторизации (первый сервер), представляемся под своим логином/паролем, и получаем от него свой сертификат (это операция единоразовая, при условии что сертификат не expire-нется и файл куда сейчас будет сохранён полученный сертификат никто не удалит).
… теперь, имея сертификат, можно запустить полезный сервис — например rstyx, который позволяет удалённо выполнять на этом сервере команды — аналог ssh
Оставляем его работать и запускаем третий
… теперь мы можем подключиться ко второму серверу и выполнить на нём команду. для примера, посмотрим список процессов сначала на этом терминале, а потом на втором сервере
Здесь всё абсолютно тривиально:
RTFM. RTFM. И снова RTFM. Система очень сильно отличается от традиционных. Причём чтением документации ограничиться не рассчитывайте — нужно читать исходники, там всё самое главное. :)
Когда появится понимание что как работает — пишите на Limbo. (На sh писать не советую — он слишком медленный, что довольно странно, кстати.) Пишите сетевые сервисы, распределённые системы, или полноценные GUI-приложения.
Удачи! :)
Update: Добавлено описание установки под Windows XP SP2.
Update: Добавлено описание установки под Mac OS X 10.4.8 Tiger.
Update: Добавлено описание установки под Mac OS X 10.5.5 Leopard.
New Edition
Да, версия в svn называет себя именно так! Установите, запустите браузер (Charon) и сами убедитесь. (В принципе, последний релиз это "Fourth Edition", но на практике это уже давно тот же svn — «Fourth Edition» вышел примерно в 2004, а сейчас на офф.сайте под видом «Fourth Edition» выложен снапшот svn от 20071003.)
Версия в svn абсолютно стабильна, и, в отличие от инсталляшки «Fourth Edition», её значительно проще обновлять. Для установки на боевые сервера или выпуска вашего приложения она не менее удобна. В общем, минусом является только необходимость иметь subversion и компилятор для сборки системы, всё остальное плюсы.
Итак, ставим свеженькую OS Inferno из SVN, в hosted режиме (т.е. в виде эмулятора, работающего под другой OS).

Особенности установки в разных системах
Хотя Inferno должна устанавливаться и работать одинаково во всех системах, все мы прекрасно знаем, что нюансы есть всегда. Я протестировал установку в Hardened Gentoo Linux и в Ubuntu 8.04. Надеюсь, такой выбор систем перекроет большинство нюансов установки и в других дистрибутивах Linux.
Hardened Gentoo Linux
С компилятором и .h-файлами в Gentoo проблем не будет, я вас уверяю. :) А вот Hardened немного работы добавит. Дело в том, что
emu
умеет работать как в режиме интерпретации байт-кода виртуальной машины Dis, так и в режиме JIT. А Hardened (точнее, входящий в него PaX) очень не любит генерации кода на лету с передачей на него управления. Поэтому для запуска emu
в JIT-режиме для него потребуется частично отключить PaX. Этим занимаются команды paxctl
и chpax
. На системах без PaX этих команд, скорее всего, нет, и выполнять их не нужно. Ещё один нюанс возникает при включенном Trusted Path Execution (TPE), но обычно достаточно проследить чтобы права на каталог с emu принадлежали root. Как бороться с SeLinux — разбирайтесь сами. :)Ubuntu 8.04
Вот чего тут нет… э… ничего тут нет. :) Ни Hardened нет, ни subversion, ни библиотек, ни .h-файлов. Придётся ставить:
apt-get install subversion build-essential apt-get install libx11-dev libxext-dev x11proto-xext-dev
Возможно нужно будет подключать дополнительные репозитории, точно не скажу — у меня они были уже подключены для установки других приложений.
Установка OS Inferno
Ниже описана установка от root, в каталог
/usr/local/inferno
, в полноценном многопользовательском режиме. Отличия при установке от обычного пользователя в ~/inferno/
я буду упоминать по ходу процесса — в основном они сводятся к тому, что часть команд выполнять бессмысленно и/или не нужно.Затраты времени/трафика/дискового пространства примерно следующие:
- архив версии из svn занимает порядка 30 MB, но понятно, что svn накачает трафика значительно больше
- система полностью [пере]собирается на моём Core2Duo 6600 примерно за две минуты
- в установленном виде на диске она занимает порядка 250 MB
Качаем. Все команды, если не сказано обратного, выполняются от root. При установке в домашний каталог установите INFERNO_ROOT, например, так:
/home/powerman/inferno
. И, разумеется, все команды выполняйте от обычного пользователя.export INFERNO_ROOT=/usr/local/inferno svn checkout http://inferno-os.googlecode.com/svn/trunk/ $INFERNO_ROOT cd $INFERNO_ROOT
Настраиваем параметры компиляции. Вместо
perl -i -pe
можно запустить любимый текстовый редактор и отредактировать mkconfig
ручками.export PATH=$INFERNO_ROOT/Linux/386/bin:$PATH perl -i -pe 's/^ROOT=.*/ROOT=$ENV{INFERNO_ROOT}/m' mkconfig perl -i -pe 's/^SYSHOST=.*/SYSHOST=Linux/m' mkconfig perl -i -pe 's/^OBJTYPE=.*/OBJTYPE=386/m' mkconfig
Собираем систему. Помните,
paxctl
нужен только на системах защищённых PaX и только для запуска в JIT-режиме.sh makemk.sh mk nuke mk install paxctl -psmxe Linux/386/bin/emu
Настраиваем параметры emu. Эту команду желательно прописать себе в
~/.bashrc
— чтобы не передавать эти параметры при каждом запуске emu
. (Кстати, ещё очень желательно в ~/.bashrc
прописать export PATH=/usr/local/inferno/Linux/386/bin:$PATH
— будет удобнее запускать emu
и limbo
.) Разумеется, размеры оконной системы Inferno нужно выставить какие вам удобнее, не обязательно 1024x768. В принципе, удобнее, когда размеры окна Inferno меньше разрешения host OS. Параметр -c0
отключает JIT (для включения просто запускайте emu -c1
). Дело в том, что при включенном JIT сложнее отлаживать свои приложения — отладчик не работает, границы массивов контролируются хуже, etc. А скорость у Inferno и без JIT более чем впечатляющая.export EMU="-r$INFERNO_ROOT -g1024x768 -c0"
Настраиваем пользователя inferno. При установке в домашний каталог эти команды выполнять не нужно. Второй chown нужен при включенном TPE.
groupadd inferno useradd -m -s /bin/bash -g inferno inferno chown -R inferno:inferno $INFERNO_ROOT chown -R root:root $INFERNO_ROOT/Linux/386/bin/ echo exec $INFERNO_ROOT/Linux/386/bin/emu $EMU >>~inferno/.bashrc mv usr usr.skel ln -s /home usr cp -a usr.skel/inferno/* ~inferno/
Update: см. комментарий по поводу настройки /tmp.
Шрифты
В принципе, к этому моменту OS Inferno установлена, и её можно использовать. Но в «Fourth Edition» входят дополнительные шрифты (B&H Lucida), которые из-за лицензионных ограничений гугл не разрешает выкладывать в svn на code.google.com. В принципе большинство приложений будет работать и без них. Кроме того, их можно заменить альтернативными бесплатными шрифтами (так вроде бы сделали в проекте Acme SAC). Но я с этим не разбирался. Поэтому мы сейчас, быстренько, выкачаем и установим во временный каталог «Fourth Edition», и выдерем из неё эти шрифты. :)
mkdir /tmp/inferno cd /tmp/inferno wget http://www.vitanuova.com/dist/4e/20071003/inferno.tgz wget http://www.vitanuova.com/dist/4e/20071003/Linux.tgz tar xzf inferno.tgz tar xzf Linux.tgz chown -R root:root /tmp/inferno chpax -psmxe Linux/386/bin/emu sh install/Linux-386.sh /tmp/inferno/ cp -r fonts/{lucida,lucidasans,lucm,pelm,LICENCE} /usr/local/inferno/fonts/ rm -rf /tmp/inferno
Тестируем
Точка с запятой в начале строк — это приглашение Inferno-вского sh. Завершение работы с Inferno — в текстовом режиме либо Ctrl-D, либо Ctrl-C, в графическом — закрытие графического окна Inferno. (Графическая среда запускается командой
wm/wm
.)Вход под пользователем inferno. При установке в домашний каталог этот шаг пропускаете.
# su - inferno ; cd ; pwd /usr/inferno ; cat /dev/user inferno
Вход под обычным пользователем. Команда
cp
проинициализирует ваш домашний каталог, её в будущем повторять перед запуском Inferno не нужно. Установку PATH и EMU тоже лучше прописать в ~/.bashrc
. Тогда для запуска Inferno достаточно будет запустить emu
.$ cp -r /usr/local/inferno/usr.skel/inferno/* ~/ $ export PATH=/usr/local/inferno/Linux/386/bin:$PATH $ export EMU="-r/usr/local/inferno/ -g1024x768 -c0" $ emu ; cd ; pwd /usr/powerman ; cat /dev/user powerman
Начальная настройка Inferno
При запуске
emu
система минимально инициализируется, после чего запускается sh
, который выполняет /lib/sh/profile
для дальнейшей инициализации системы. Я в него обычно прописываю:- Установку тайм-зоны. В принципе это можно сделать один раз скопировав файл, но использовать
bind
— это более Infern-ish. :) - Переход в домашний каталог текущего пользователя (по умолчанию система находится в корневом каталоге).
- Если в домашнем каталоге пользователя настроены соответствующие файлы — продолжить инициализацию системы этими файлами.
bind /locale/Moscow /locale/timezone cd load std and {ftest -e namespace} {nsbuild} and {ftest -e profile} {run profile}
При установке в домашний каталог на этом настройка заканчивается — нет никакого смысла настраивать три субъекта авторизации с кучей паролей при работе под единственным аккаунтом.
Настройка авторизации
Для начала необходимо объяснить, что и зачем настраивается. Авторизация работает следующим образом: клиент и сервис взаимно авторизуют друг друга с помощью сертификатов на базе private/public ключей — всё почти как у ssh или https. Почти потому, что авторизуют они друг друга действительно взаимно. Для этого они оба должны получить свои сертификаты у одного и того же CA (certificate authority), которому оба доверяют. Так что именно CA, выдавая или не выдавая эти сертификаты, определяет, будет у клиента доступ к сервису, или нет.
Таким образом, нам нужно настроить три разные системы — сервер авторизации, некий полезный сервис, и терминал клиента. Для этого мы можем запустить три независимых
emu
на своей машине — с точки зрения Inferno это будут три разных сервера, на которых будут запущены разные приложения. Разумеется, при таком варианте есть некоторые ограничения — например, невозможно запустить два одинаковых сетевых сервиса в разных emu
— у них будет конфликт при попытке открыть TCP порт. Ну и файлы на диске у них общие, разумеется — но это не касается «виртуальных» файлов (а-ля /proc и /dev в Linux), которые в Inferno используются очень активно. Так что отличий между этими тремя emu
вам хватит, чтобы воспринимать их как действительно разные и независимые сервера.Первым делом нужно прописать адрес (hostname или IP) сервера авторизации на машинах клиента и сервиса. Но, поскольку файлы у них в нашей конфигурации совпадают, то достаточно отредактировать один файл /usr/local/inferno/lib/ndb/local (можете вписать 127.0.0.1):
SIGNER=powerman.name
Дальше запускаем сервер авторизации. Он будет запускаться под юзером inferno, и все файлы с ключами и сертификатами CA будут доступны только этому юзеру.
# su - inferno ; cat /dev/user; echo inferno
… очищаем базу ключей
; cp /dev/null /keydb/keys; chmod 600 /keydb/keys
… генерируем сертификат нашего CA, на указанное имя (любое)
; auth/createsignerkey powerman.name
… запускаем сервис авторизации, при этом потребуется установить пароль, который в будущем нужно будет вводить при каждом запуске этого сервиса — это необходимо т.к. ключи в файлах будут зашифрованы этим паролем
; svc/auth Key: Confirm key:
… теперь мы можем завести на нашем сервисе авторизации настоящие пользовательские аккаунты, с паролями, наконец-то :) — один для пользователя inferno (просто чтобы не заводить ещё и третьего юзера, им будет пользоваться второй сервер для запуска полезных сервисов) и второй для пользователя powerman (который будет использовать клиентский терминал на третьем сервере для подключения к полезному сервису на втором сервере)
; auth/changelogin inferno new account secret: confirm: expires [DDMMYYYY/permanent, return = 23102009]: permanent change written ; auth/changelogin powerman new account secret: confirm: expires [DDMMYYYY/permanent, return = 23102009]: permanent change written
… ну и полюбуемся на запущенные на этом «сервере» TCP-сервисы
; netstat tcp/0 inferno Announced 0.0.0.0!6673 ::!0 tcp/1 inferno Announced 0.0.0.0!6677 ::!0 tcp/2 inferno Announced 0.0.0.0!6671 ::!0 tcp/3 inferno Announced 0.0.0.0!6672 ::!0 ;
Сервер авторизации оставляем работать, и запускаем следующий
emu
— с полезным сервисом.# su - inferno ; cat /dev/user; echo inferno
… ndb/cs это что-то вроде универсального ресолвера, без него в Inferno с сетью особо не поработаешь (есть ещё ndb/dns, но в hosted режиме его можно не запускать и использовать dns-ресолвер host OS)
; ndb/cs
… обращаемся к сервису авторизации (первый сервер), представляемся под своим логином/паролем, и получаем от него свой сертификат (это операция единоразовая, при условии что сертификат не expire-нется и файл куда сейчас будет сохранён полученный сертификат никто не удалит).
; getauthinfo default use signer [$SIGNER]: remote user name [inferno]: password: save in file [yes]:
… теперь, имея сертификат, можно запустить полезный сервис — например rstyx, который позволяет удалённо выполнять на этом сервере команды — аналог ssh
; svc/rstyx ; netstat tcp/0 inferno Announced 0.0.0.0!6668 ::!0 ;
Оставляем его работать и запускаем третий
emu
— терминал юзера powerman.$ emu ; cat /dev/user; echo powerman ; ndb/cs ; getauthinfo default use signer [$SIGNER]: remote user name [powerman]: password: save in file [yes]:
… теперь мы можем подключиться ко второму серверу и выполнить на нём команду. для примера, посмотрим список процессов сначала на этом терминале, а потом на втором сервере
; ps 1 1 powerman 0:00.0 release 74K Sh[$Sys] 8 7 powerman 0:00.0 alt 17K Cs 11 1 powerman 0:00.0 ready 74K Ps[$Sys] ; cpu powerman.name ps 1 1 inferno 0:00.0 release 83K Bufio[$Sys] 8 7 inferno 0:00.0 alt 17K Cs 13 1 inferno 0:00.0 alt 9K Listen 15 1 inferno 0:00.0 release 9K Listen[$Sys] 22 1 powerman 0:00.0 ready 1K Ps[$Sys] ;
Обновление системы
Здесь всё абсолютно тривиально:
cd /usr/local/inferno svn up mk install
Что дальше?
RTFM. RTFM. И снова RTFM. Система очень сильно отличается от традиционных. Причём чтением документации ограничиться не рассчитывайте — нужно читать исходники, там всё самое главное. :)
Когда появится понимание что как работает — пишите на Limbo. (На sh писать не советую — он слишком медленный, что довольно странно, кстати.) Пишите сетевые сервисы, распределённые системы, или полноценные GUI-приложения.
Удачи! :)