FAQ: Что такое OS Inferno и зачем она нужна?
Информация в предыдущем посте устарела почти на 4 года, и меня попросили её обновить. Так же попросили не смешивать в одном посте установку с настройкой, поэтому здесь будет только установка, а настройка инферно описана в отдельном посте. Update: Описание установки для Windows обновлено в июне 2014.
Итак, мы будем устанавливать распределённую ОС Inferno. На официальном сайте есть инструкции по установке, но они не совсем корректны и тоже немного устарели. Inferno может работать в двух режимах — native (на голом железе или в qemu/etc. как все обычные ОС) и hosted (как обычное приложение под *NIX/Win). Инструкции по установке native Inferno можно найти в русской вики. Помимо этого существуют и другие варианты — например, установка Inferno на Android (англ.). Лично я смысла в использовании native Inferno на обычных компах не вижу, поэтому буду описывать установку hosted Inferno под Gentoo, Ubuntu, FreeBSD, MacOSX и Windows.
Теоретически, последняя официальная версия «Fourth Edition» вышла примерно в 2004 году. Текущая версия находится в Mercurial репозитории на Google Code, и называет себя «New Edition». Практически, использовать что либо кроме текущей версии из репозитория нет смысла — она абсолютно стабильна, и всегда была стабильна. Её и будем ставить.
Инферно можно установить общесистемно (напр. в
OS Inferno 32-битная. Поэтому для установки и запуска в 64-битных OS необходима поддержка 32-битных приложений в этих OS. К сожалению, под 64-битной FreeBSD-9.0 мне так и не удалось запустить инферно.
Инферно выполняет код в виртуальной машине, плюс поддерживает JIT, поэтому у неё те же проблемы с разнообразными защитами что и у Java, etc. В предыдущей статье я уделил этой теме больше внимания, если возникнут вопросы — посмотрите там.
Установленная инферно занимает примерно 200MB. А вот на установку компиляторов может потребоваться до 3-х с лишним гигабайт (например на Xcode или Visual Studio). Компилируется инферно буквально за пару минут на средней системе.
При установке инферно в домашний каталог следует иметь в виду, что инферно не любит спец. символы в именах файлов/каталогов, так что если путь к домашнему каталогу содержит, например, пробел — могут возникнуть не учтённые мной сложности.
В (Hardened) Gentoo Linux 32/64-bit всё тривиально — есть пакет, который ставит инферно общесистемно в
А с остальными операционками сейчас будем разбираться.
У меня уже были установлены Xcode (3.2.2) и Mercurial (1.7.1).
Устанавливаем 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).
Идём на mercurial.selenic.com/downloads и качаем/ставим текущую версию (3.0.1).
А вот с компилятором есть варианты. Напрашивающийся вариант с установкой 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=8279 и качаем/ставим «Windows SDK 7.1». При установке достаточно ограничиться этими пунктами:
Не смотря на то, что на официальном сайте для винды предлагается отдельный архив, а для мака отдельные бинарники, нам это всё не нужно, и даже вредно (архив для винды не обновляется нормально из репозитория — возникают конфликты). Так что под всеми ОС будем устанавливаться из inferno-20100120.tgz. Смысл использовать этот архив вместо простого клонирования репозитория в том, что в архив включены некоторые файлы (в основном шрифты), которые лицензия запрещает выкладывать на Google Code, поэтому в репозитории их нет.
Скачиваем www.vitanuova.com/dist/4e/inferno.zip (его рекомендуют на сайте, но можно взять и .tgz — у меня без проблем собираются и тот и другой).
Распаковываем в
Запускаем
Единственная реально необходимая переменная — это
Идём в: Панель Управления -> Система -> Дополнительные параметры системы (в XP просто «Дополнительно») -> Переменные среды.
Добавляем в конец Path:
Создаём новую переменную: INFERNO_ROOT:
Создаём новую переменную: EMU:
Можно отредактировать файл
В линухе инферно поддерживает IPv6. Более того, оный IPv6 используется по умолчанию. Подходит это вам или нет — решайте сами. Я лично его выключаю:
Редактируем
Если вы ставили WinSDK, то нужно сделать новый ярлык на «Windows SDK 7.1 Command Prompt», зайти в его свойства и дописать параметр
Если вы ставили Visual C++ 2010, то я не знаю, как запустить 32-битный компилятор (но возможно это делается примерно так же).
Что делать дальше — описано в следующем пункте для всех версий винды.
Запускаем «Windows SDK 7.1 Command Prompt» (ну или «Visual Studio Command Prompt (2010)» — смотря что вы устанавливали).
Собственно, это всё. Теперь вы можете запустить инферно командой

Тем, кто не остановится на установке системы, может быть интересно почитать моё описание Limbo на русском, текущую версию man-документации в html, посмотреть на мои инферно модули и приложения и большой архив приложений под инферно от mjl. Англоязычное коммьюнити обитает в maillist-е и на IRC
Заранее отвечаю на традиционный вопрос «кому и зачем всё это нужно». В hosted режиме инферно используется примерно так же, как Erlang, Java или Go — для разработки приложений на классном языке программирования, которые выполняются в очень приятной среде, которые просто и комфортно писать и которые работают как минимум не хуже, чем аналогичные приложения на других языках. В отличие от Erlang в Inferno нет многих вещей «из коробки» (но они без проблем реализуются ручками при необходимости) зато это система общего назначения, пригодная для решения любых задач (ну, кроме низкоуровневых драйверов и т.п., как обычно). В отличие от Java мы имеем полноценные лёгкие нити и возможность писать простые многопоточные приложения в стиле CSP. В отличие от Go мы имеем виртуализированную и упрощённую среду, идентичную под любыми ОС. В общем, инферно действительно отличная система давно готовая к использованию в продакшне на коммерческих проектах (мы её именно там и используем) и заслуживает гораздо большей популярности, чем имеет.
Информация в предыдущем посте устарела почти на 4 года, и меня попросили её обновить. Так же попросили не смешивать в одном посте установку с настройкой, поэтому здесь будет только установка, а настройка инферно описана в отдельном посте. Update: Описание установки для Windows обновлено в июне 2014.
Итак, мы будем устанавливать распределённую ОС Inferno. На официальном сайте есть инструкции по установке, но они не совсем корректны и тоже немного устарели. Inferno может работать в двух режимах — native (на голом железе или в qemu/etc. как все обычные ОС) и hosted (как обычное приложение под *NIX/Win). Инструкции по установке native Inferno можно найти в русской вики. Помимо этого существуют и другие варианты — например, установка Inferno на Android (англ.). Лично я смысла в использовании native Inferno на обычных компах не вижу, поэтому буду описывать установку hosted Inferno под Gentoo, Ubuntu, FreeBSD, MacOSX и Windows.
Содержание
- Особенности установки
- Установка
- Запуск
- Полезные ссылки
- P.S.
Особенности установки
Версии 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 и качаем/ставим текущую версию (3.0.1).
А вот с компилятором есть варианты. Напрашивающийся вариант с установкой 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=8279 и качаем/ставим «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
(В 2014 у меня SDK отказывался устанавливаться пока я не снёс все Visual C++ 2010 Redistributable — они оказались для него слишком новой версии.) Потом тоже обновляем. На самом деле обновлять, наверное, не обязательно, просто уже вошло в привычку.Скачиваем и обновляем исходники инферно
Не смотря на то, что на официальном сайте для винды предлагается отдельный архив, а для мака отдельные бинарники, нам это всё не нужно, и даже вредно (архив для винды не обновляется нормально из репозитория — возникают конфликты). Так что под всеми ОС будем устанавливаться из 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.zip (его рекомендуют на сайте, но можно взять и .tgz — у меня без проблем собираются и тот и другой).
Распаковываем в
C:\inferno\
. Не знаю, что нужно для распаковки .tgz под виндой — у меня стояли Far и 7Zip, распаковывал Far-ом.Запускаем
cmd
.cd \inferno
hg pull -uv
# если получаем конфликт вроде:
merging libinterp/keyring.h
warning: conflicts during merge.
merging libinterp/keyring.h incomplete! (edit conflicts, then use 'hg resolve --mark')
merging libinterp/runt.h
warning: conflicts during merge.
merging libinterp/runt.h incomplete! (edit conflicts, then use 'hg resolve --mark')
3038 files updated, 0 files merged, 106 files removed, 2 files unresolved
use 'hg resolve' to retry unresolved file merges
# то просто восстанавливаем последнюю версию:
hg revert -r tip libinterp\keyring.h
hg revert -r tip libinterp\runt.h
Выходим из cmd
.Настраиваем переменные окружения
Единственная реально необходимая переменная — это
PATH
. В EMU
задаются параметры по умолчанию для запуска инферно, она нужна просто для удобства. Что касается INFERNO_ROOT
то инферно про неё вообще не знает, эта переменная нам нужна просто для удобства. Помимо установки переменных в текущем сеансе, пропишем их в стартовые скрипты.… Ubuntu
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:\inferno\Nt\386\bin
Создаём новую переменную: INFERNO_ROOT:
C:\inferno
Создаём новую переменную: EMU:
-rC:\inferno
Настраиваем параметры сборки
Можно отредактировать файл
mkconfig
вручную во всех ОС, но для простоты я, где возможно, приведу команды автоматически изменяющие конфиг.… Ubuntu
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:\Windows\System32\cmd.exe /E:ON /V:ON /T:0E /K "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.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 мы имеем виртуализированную и упрощённую среду, идентичную под любыми ОС. В общем, инферно действительно отличная система давно готовая к использованию в продакшне на коммерческих проектах (мы её именно там и используем) и заслуживает гораздо большей популярности, чем имеет.