Информация в предыдущем посте устарела почти на 4 года, и меня попросили её обновить. Так же попросили не смешивать в одном посте установку с настройкой, поэтому здесь будет только установка, а по настройке я планирую отдельный пост в ближайшее время.
Итак, мы будем устанавливать распределённую ОС Inferno. На официальном сайте есть инструкции по установке, но они не совсем корректны и тоже немного устарели. Inferno может работать в двух режимах — native (на голом железе или в qemu/etc. как все обычные ОС) и hosted (как обычное приложение под *NIX/Win). Инструкции по установке native Inferno можно найти в русской вики. Помимо этого существуют и другие варианты — например, установка Inferno на Android (англ.). Лично я смысла в использовании native Inferno на обычных компах не вижу, поэтому буду описывать установку hosted Inferno под Gentoo, Ubuntu, FreeBSD, MacOSX и Windows.
Особенности установки
Версии OS Inferno
Теоретически, последняя официальная версия «Fourth Edition» вышла примерно в 2004 году. Текущая версия находится в Mercurial репозитории на Google Code, и называет себя «New Edition». Практически, использовать что либо кроме текущей версии из репозитория нет смысла — она абсолютно стабильна, и всегда была стабильна. Её и будем ставить.
Одно- или много- пользовательский стиль установки
Инферно можно установить общесистемно (напр. в /usr/inferno/
), чтобы все пользователи могли ей пользоваться. Инферно поддерживает всё, что для этого требуется — работу с правами пользователей, отдельные домашние каталоги, etc. С другой стороны, инферно можно поставить просто в свой домашний каталог (напр. в ~/inferno/
), что даже удобнее. Прошлую статью я немного переусложнил описывая одновременно оба способа, но сейчас решил, что проще будет описать только однопользовательский вариант установки. Если у кого-то из читателей этой статьи есть сервер, на котором больше одного пользователя инферно — он вряд ли нуждается в моих инструкциях по установке инферно. ;-) Так что ставить будем в ~/inferno/
на *NIX системах, и в C:inferno
на винде.
32/64 бита
OS Inferno 32-битная. Поэтому для установки и запуска в 64-битных OS необходима поддержка 32-битных приложений в этих OS. К сожалению, под 64-битной FreeBSD-9.0 мне так и не удалось запустить инферно.
Hardened/PaX/SeLinux/etc.
Инферно выполняет код в виртуальной машине, плюс поддерживает JIT, поэтому у неё те же проблемы с разнообразными защитами что и у Java, etc. В предыдущей статье я уделил этой теме больше внимания, если возникнут вопросы — посмотрите там.
Время и место
Установленная инферно занимает примерно 200MB. А вот на установку компиляторов может потребоваться до 3-х с лишним гигабайт (например на Xcode или Visual Studio). А компилируется инферно буквально за пару минут на средней системе.
Расположение
При установке инферно в домашний каталог следует иметь в виду, что инферно не любит спец.символы в именах файлов/каталогов, так что если путь к домашнему каталогу содержит, например, пробел — могут возникнуть не учтённые мной сложности.
Установка
В (Hardened) Gentoo Linux 32/64-bit всё тривиально — есть пакет, который ставит инферно общесистемно в /usr/inferno/
:
layman -a powerman
emerge inferno
А с остальными операционками сейчас будем разбираться.
Mercurial, компиляторы и все все все
… Ubuntu 12.04 32-bit
sudo apt-get install -y mercurial
sudo apt-get install -y libxext-dev
… Ubuntu 12.04 64-bit
sudo apt-get install -y mercurial
sudo apt-get install -y libc6-dev-i386
sudo apt-get install -y libxext-dev:i386
… FreeBSD 8.0 32-bit
pkg_add -r mercurial
… Mac OS X 10.6.8 Snow Leopard 32-bit
У меня уже были установлены Xcode (3.2.2) и Mercurial (1.7.1).
… Mac OS X 10.7.4 Lion 64-bit
Устанавливаем Xcode (4.3.2) через App Store.
Запускаем Xcode, идём в меню Xcode — Preferences — Downloads и нажимаем Install для Command Line Tools.
Идём на mercurial.berkwood.com и качаем/ставим текущую версию (Mercurial 2.2.2 for OS X 10.7).
… Windows (XP 32-bit, Seven 32-bit, Seven 64-bit)
Идём на mercurial.selenic.com/downloads и качаем/ставим текущую версию (2.2.2).
А вот с компилятором есть варианты. Напрашивающийся вариант с установкой Visual Studio Express обойдётся в 3 с лишним гига на винте. Альтернативный вариант — поставить WinSDK — обойдётся примерно в 800 мегабайт. Я опишу оба варианта, выбирайте сами.
Первый вариант. Идём на www.microsoft.com/visualstudio/en-us/products/2010-editions/visual-cpp-express и качаем/ставим/обновляем (по русскому обычаю — трижды :) иначе не все обновления установятся) «Visual C++ 2010 Express».
Второй вариант. Сначала идём на go.microsoft.com/fwlink/?LinkId=187668 и качаем/ставим полный ".NET Framework 4". Потом идём на www.microsoft.com/en-us/download/details.aspx?id=8442 и качаем/ставим «Windows SDK 7.1». При установке достаточно ограничиться этими пунктами:
# Windows Native Code Development:
# Windows Headers and Libraries:
# [X] Windows Headers
# [X] x86 Libraries
# [X] Visual C++ Compilers
# Redistributable Packages:
# [X] Microsoft Visual C++ 2010
Потом тоже обновляем. На самом деле обновлять, наверное, не обязательно, просто уже вошло в привычку.
Скачиваем и обновляем исходники инферно
Не смотря на то, что на официальном сайте для винды предлагается отдельный архив, а для мака отдельные бинарники, нам это всё не нужно, и даже вредно (архив для винды не обновляется нормально из репозитория — возникают конфликты). Так что под всеми ОС будем устанавливаться из inferno-20100120.tgz. Смысл использовать этот архив вместо простого клонирования репозитория в том, что в архив включены некоторые файлы (в основном шрифты), которые лицензия запрещает выкладывать на Google Code, поэтому в репозитории их нет.
… *NIX
wget http://www.vitanuova.com/dist/4e/inferno-20100120.tgz
tar xzf inferno-20100120.tgz
cd inferno/
hg pull -uv
… Win
Скачиваем www.vitanuova.com/dist/4e/inferno-20100120.tgz
Распаковываем в C:inferno
. Не знаю, что нужно для распаковки .tgz под виндой — у меня стояли Far и 7Zip, распаковывал Far-ом.
Запускаем cmd
.
cd inferno
hg pull -uv
Выходим из cmd
.
Настраиваем переменные окружения
Единственная реально необходимая переменная — это PATH
. В EMU
задаются параметры по умолчанию для запуска инферно, она нужна просто для удобства. Что касается INFERNO_ROOT
то инферно про неё вообще не знает, но эта переменная нам пригодится в будущем, когда мы займёмся настройкой инферно. Помимо установки переменных в текущем сеансе, пропишем их в стартовые скрипты.
… Linux
export INFERNO_ROOT=$(pwd)
export PATH=$INFERNO_ROOT/Linux/386/bin:$PATH
export EMU=-r$INFERNO_ROOT
echo "export INFERNO_ROOT=$INFERNO_ROOT" >> ~/.bashrc
echo "export PATH=$INFERNO_ROOT/Linux/386/bin:$PATH" >> ~/.bashrc
echo "export EMU=-r$INFERNO_ROOT" >> ~/.bashrc
… FreeBSD
export INFERNO_ROOT=$(pwd)
export PATH=$INFERNO_ROOT/FreeBSD/386/bin:$PATH
export EMU=-r$INFERNO_ROOT
echo "export INFERNO_ROOT=$INFERNO_ROOT" >> ~/.bash_profile
echo "export PATH=$INFERNO_ROOT/FreeBSD/386/bin:$PATH" >> ~/.bash_profile
echo "export EMU=-r$INFERNO_ROOT" >> ~/.bash_profile
… Mac OS X
export INFERNO_ROOT=$(pwd)
export PATH=$INFERNO_ROOT/MacOSX/386/bin:$PATH
export EMU=-r$INFERNO_ROOT
echo "export INFERNO_ROOT=$INFERNO_ROOT" >> ~/.bash_profile
echo "export PATH=$INFERNO_ROOT/MacOSX/386/bin:$PATH" >> ~/.bash_profile
echo "export EMU=-r$INFERNO_ROOT" >> ~/.bash_profile
… Win
Идём в: Панель Управления -> Система -> Дополнительные параметры системы (в XP просто «Дополнительно») -> Переменные среды.
Добавляем в конец Path: ;C:infernoNt386bin
Создаём новую переменную: INFERNO_ROOT: C:inferno
Создаём новую переменную: EMU: -rC:inferno
Настраиваем параметры сборки
Можно отредактировать файл mkconfig
вручную во всех ОС, но для простоты я где возможно приведу команды автоматически изменяющие конфиг.
… Linux
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
В линухе инферно поддерживает IPv6. Более того, оный IPv6 используется по умолчанию. Подходит это вам или нет — решайте сами. Я лично его выключаю:
perl -i -pe 's/ipif6/ipif/g' emu/Linux/emu emu/Linux/emu-g
… FreeBSD
perl -i -pe 's/^ROOT=.*/ROOT=$ENV{INFERNO_ROOT}/m' mkconfig
perl -i -pe 's/^SYSHOST=.*/SYSHOST=FreeBSD/m' mkconfig
perl -i -pe 's/^OBJTYPE=.*/OBJTYPE=386/m' mkconfig
… Mac OS X
perl -i -pe 's/^ROOT=.*/ROOT=$ENV{INFERNO_ROOT}/m' mkconfig
perl -i -pe 's/^SYSHOST=.*/SYSHOST=MacOSX/m' mkconfig
perl -i -pe 's/^OBJTYPE=.*/OBJTYPE=386/m' mkconfig
… Win
Редактируем mkconfig
:
ROOT=c:/inferno
SYSHOST=Nt
OBJTYPE=386
Сборка
… *NIX
sh makemk.sh
mk nuke
mk install # пропустите эту команду на серверах без X-ов и GUI
mk CONF=emu-g install
… Win Seven 64-bit
Если вы ставили WinSDK, то нужно сделать новый ярлык на «Windows SDK 7.1 Command Prompt», зайти в его свойства и дописать параметр /x86
— чтобы получилось вот так:
C:WindowsSystem32cmd.exe /E:ON /V:ON /T:0E /K "C:Program FilesMicrosoft SDKsWindowsv7.1BinSetEnv.cmd" /x86
Если вы ставили Visual C++ 2010, то я не знаю, как запустить 32-битный компилятор (но возможно это делается примерно так же).
Что делать дальше — описано в следующем пункте для всех версий винды.
… Win
Запускаем «Windows SDK 7.1 Command Prompt» (ну или «Visual Studio Command Prompt (2010)» — смотря что вы устанавливали).
cd inferno
mk nuke
mk install
Запуск
Собственно, это всё. Теперь вы можете запустить инферно командой emu
или emu-g
(вторая отличается тем, что не поддерживает графический режим, но зато будет работать на серверах без X-ов и очень удобна для запуска разных сетевых сервисов). Графическую среду можно увидеть запустив внутри emu команду wm/wm
:
$ emu
; wm/wm
Полезные ссылки
Тем, кто не остановится на установке системы, может быть интересно почитать моё описание Limbo на русском, текущую версию man-документации в html, посмотреть на мои инферно модули и приложения и большой архив приложений под инферно от mjl. Англоязычное коммьюнити обитает в maillist-е и на IRC #inferno
в сети freenode.
P.S.
Заранее отвечаю на традиционный вопрос «кому и зачем всё это нужно». В hosted режиме инферно используется примерно так же, как Erlang, Java или Go — для разработки приложений на классном языке программирования, которые выполняются в очень приятной среде, которые просто и комфортно писать и которые работают как минимум не хуже, чем аналогичные приложения на других языках. В отличие от Erlang в Inferno нет многих вещей «из коробки» (но они без проблем реализуются ручками при необходимости) зато это система общего назначения пригодная для решения любых задач (ну, кроме низкоуровневых драйверов и т.п., как обычно). В отличие от Java мы имеем полноценные лёгкие нити и возможность писать приложения в стиле CSP. В отличие от Go мы имеем виртуализированную и упрощённую среду, идентичную под любыми ОС. В общем, инферно действительно отличная система давно готовая к использованию в продакшне на коммерческих проектах (мы её именно там и используем) и заслуживает гораздо большей популярности, чем имеет.
Автор: powerman