Как стать автором
Обновить

Установка OS Inferno New Edition

Время на прочтение 8 мин
Количество просмотров 7.1K
OUTDATED: Эта статья устарела, для установки под современными OS см. новую статью.

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).

OS Inferno hosted on Mac OS X

Особенности установки в разных системах


Хотя 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
ВНИМАНИЕ: Inferno достаточно сильно не любит «странные» символы в именах файлов и каталогов. Включая пробел! Это не баг, это осознанное архитектурное решение. Поэтому рекомендуется проследить, чтобы в каталоге куда ставится Inferno, и в вашем домашнем каталоге внутри Inferno, имена файлов были без символов вроде ":", "!", "#", пробела, etc.

Качаем. Все команды, если не сказано обратного, выполняются от 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. :)
  • Переход в домашний каталог текущего пользователя (по умолчанию система находится в корневом каталоге).
  • Если в домашнем каталоге пользователя настроены соответствующие файлы — продолжить инициализацию системы этими файлами.
Итак, прописываете в /usr/local/inferno/lib/sh/profile:
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-приложения.

Удачи! :)
Теги:
Хабы:
+23
Комментарии 84
Комментарии Комментарии 84

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн