FAQ: Что такое OS Inferno и зачем она нужна?
Итак, мы только что установили hosted OS Inferno в свой домашний каталог, и можем приступать к настройке системы.
Статья получилась не маленькая, т.к. в ней описано не только «что» делать, но и зачем, почему и какие ещё есть варианты, плюс дополнительные пояснения по работе с инферно для новичков. Если вам хочется просто по-быстрее настроить систему, то просто скачайте рекомендуемый /lib/sh/profile, плюс если у вас Linux или FreeBSD сделайте себе скрипты-обёртки для запуска инферно.
Hosted инферно запускается командой
Выйти из sh можно командой
Прямо сейчас вы никакой разницы между всеми этими способами не заметите — все они прекращают работу инферно. Дело в том, что инферно работает пока есть активные процессы, а в данный момент такой процесс только один —
Ещё одно отличие есть под Linux и FreeBSD — после завершения инферно в консоль выводится сообщение «Killed»:
Некоторые параметры указываются при запуске инферно. Их можно указывать либо явно в командной строке, либо прописать в переменной окружения
Текущие значения некоторых параметров можно узнать внутри инферно:
Когда запускается инферно, то по умолчанию запускается
Имейте в виду, что если при запуске инферно указать параметром emu имя запускаемого приложения, то команды из
Текущая зона определяется файлом
Ещё одна полезная команда, которую стоит добавить в
Домашние каталоги пользователей инферно находятся в каталоге
Для большей гибкости добавим поддержку переменной окружения INFERNO_HOME — если она не пустая, то в домашний каталог будет подключаться путь указанный в этой переменной. Итак, добавляем в
Последнее, что имеет смысл добавить в
Для удобства можете скачать рекомендуемый
При запуске wm/wm он выполнит
Ключи по умолчанию будут записываться и использоваться из подкаталога
В принципе, в hosted инферно сеть настраивать не требуется. Например, скачаем ya.ru (по IP):
А вот для поддержки преобразования имён в IP, нужно запустить сервис
Сервис cs(8) использует файлы
Файл
Файл
Для обновления системы необходимо просто повторить те же команды, которые использовались при установке:
Запускаем «Windows SDK 7.1 Command Prompt» (или «Visual Studio Command Prompt (2010)» — смотря что вы устанавливали).
Итак, мы только что установили hosted OS Inferno в свой домашний каталог, и можем приступать к настройке системы.
Содержание
- Для нетерпеливых
- Запуск и выход из инферно
- Параметры emu
- /lib/sh/profile
- GUI (wm/wm)
- Ключи для аутентификации
- Сеть
- Обновление OS Inferno
Для нетерпеливых
Статья получилась не маленькая, т.к. в ней описано не только «что» делать, но и зачем, почему и какие ещё есть варианты, плюс дополнительные пояснения по работе с инферно для новичков. Если вам хочется просто по-быстрее настроить систему, то просто скачайте рекомендуемый /lib/sh/profile, плюс если у вас Linux или FreeBSD сделайте себе скрипты-обёртки для запуска инферно.
Запуск и выход из инферно
Hosted инферно запускается командой
emu или emu-g (без поддержки графического режима). По умолчанию запускается sh и выводит приглашение командной строки ";":$ emu ;
Выйти из sh можно командой
exit или обозначив конец ввода комбинацией Ctrl-D (под виндой после Ctrl-D необходимо дополнительно нажать Enter). Выйти из инферно можно командой shutdown -h или (только под Linux/Win) прервав работу по Ctrl-C.Прямо сейчас вы никакой разницы между всеми этими способами не заметите — все они прекращают работу инферно. Дело в том, что инферно работает пока есть активные процессы, а в данный момент такой процесс только один —
sh. Если запустить дополнительные процессы, например ndb/cs (сервис-ресолвер, необходимый для работы с сетью), то после выхода из sh инферно продолжит работать, но влиять на него вы уже не сможете. Под Linux/Win ещё получится выключить инферно по Ctrl-C, а под FreeBSD/MacOSX останется только убить процесс emu средствами основной ОС. Конечно, если вы сначала запустите сервис rstyx (аналог ssh для удалённого доступа), то можно будет подключиться к этому emu из другого и удалённо выполнить shutdown -h.Ещё одно отличие есть под Linux и FreeBSD — после завершения инферно в консоль выводится сообщение «Killed»:
Вреда от него никакого, и есть способ решения этой проблемы. Для этого потребуется запускать emu и emu-g через скрипты-обёртки ~/bin/emu и ~/bin/emu-g:powerman@Ubuntu:~$ emu-g echo ok ok Убито powerman@Ubuntu:~$ [powerman@freebsd ~]$ emu-g echo ok ok Killed: 9 [powerman@freebsd ~]$
Под Linux достаточно создать эти скрипты и сделать их исполнимыми, а под FreeBSD нужно дополнительно установить bash и модифицировать значениеpowerman@Ubuntu:~$ cat ~/bin/emu-g #!/bin/bash $INFERNO_ROOT/Linux/386/bin/emu-g "$@" </dev/stdin & wait 2>/dev/null [powerman@freebsd ~]$ cat bin/emu-g #!/usr/local/bin/bash $INFERNO_ROOT/FreeBSD/386/bin/emu-g "$@" </dev/stdin & wait 2>/dev/null
PATH в ~/.bash_profile так, чтобы каталог /home/имя_пользователя/bin стоял перед каталогом с инферно.Параметры emu
Некоторые параметры указываются при запуске инферно. Их можно указывать либо явно в командной строке, либо прописать в переменной окружения
EMU. Обязательный среди этих параметров только один: -r/путь/к/корню/инферно и он у нас уже был прописан в переменной EMU в процессе установки системы. Из полезных опциональных параметров стоит упомянуть следующие:-gXxYустанавливает разрешение графической среды инферно, напр:-g1024x768-с1включает JIT (имеет смысл в продакшне и при тестировании производительности)-p pool=maxsizeпозволяет контролировать доступные инферно объёмы памяти, значение pool может бытьmain,heapилиimage, например если нужно обрабатывать большие объёмы данных можно увеличить heap до 128MB:-p heap=134217728
Текущие значения некоторых параметров можно узнать внутри инферно:
Как видите (предпоследняя колонка) по умолчанию инферно использует не больше 32MB для каждого пула памяти.; echo $emuroot /home/powerman/inferno ; echo $emuargs emu -g1024x768 -c1 ; cat /dev/memory 277568 33554432 328032 3303 1490 1 33276852 main 52544 33554432 78496 1650 1271 1 33501876 heap 0 33554688 0 0 0 0 33554676 image
Хотя JIT можно динамически включать/отключать, изменённое значение JIT повлияет только на модули (в инферно нет разницы между программами и библиотеками, все они представляют из себя просто подгружаемые модули) которые будут загружаться после этого изменения. Поэтому значение JIT лучше указывать параметром; cat /dev/jit 0; echo 1 >/dev/jit ; cat /dev/jit 1; echo 0 >/dev/jit ; cat /dev/jit 0;
emu./lib/sh/profile
Когда запускается инферно, то по умолчанию запускается
emuinit, который в свою очередь запускает sh -l. Параметр -l говорит sh, что нужно выполнить команды из /lib/sh/profile. Этот файл является аналогом загрузочных скриптов *NIX, и именно туда мы будем добавлять команды для настройки и инициализации инферно (сейчас в этом файле никаких команд нет).Имейте в виду, что если при запуске инферно указать параметром emu имя запускаемого приложения, то команды из
/lib/sh/profile выполнены не будут (если только вы явно их не подгрузите). Пример:$ emu-g ; cat /lib/sh/profile # emu sh initialisation here ; echo 'echo executing /lib/sh/profile' >> /lib/sh/profile ; shutdown -h $ emu-g executing /lib/sh/profile ; shutdown -h $ emu-g sh ; shutdown -h $ emu-g sh -l executing /lib/sh/profile ; shutdown -h $ emu-g sh -c 'run /lib/sh/profile; echo ok; shutdown -h' executing /lib/sh/profile ok
Таймзона
Текущая зона определяется файлом
/locale/timezone, доступные варианты можно увидеть просмотрев имена других файлов в каталоге /locale/. В традиционных ОС мы бы просто скопировали файл /locale/наша_зона поверх /locale/timezone. В инферно тоже можно так сделать, но более естественным для инферно способом изменения таймзоны будет модификация namespace с помощью bind(1):Так что находим свою зону и добавляем в; date Sun Jun 17 19:00:28 BST 2012 ; bind /locale/EET /locale/timezone ; date Sun Jun 17 21:00:39 EEST 2012
/lib/sh/profile:bind /locale/выбранная_зона /locale/timezone
/chan
Ещё одна полезная команда, которую стоит добавить в
/lib/sh/profile, это:Она подключает драйвер srv(3) к каталогу /chan. По принятому в инферно соглашению, в этом каталоге создаются виртуальные файлы, чтение/запись которых преобразуется драйвером srv в сообщения, передаваемые через канал в процесс обслуживающий эти файлы. Использование таких файлов (создаваемых через file2chan(2) из Limbo или file2chan(1) из sh) является самым простым способом реализовать файл-сервер в инферно.bind -b '#s' /chan
Домашний каталог
Домашние каталоги пользователей инферно находятся в каталоге
/usr/. По умолчанию там только один подкаталог inferno/, который является по сути шаблоном для создания домашних каталогов других пользователей. Поэтому, если только ваш аккаунт в основной ОС называется не inferno, :) то своего домашнего каталога в инферно у вас пока нет:Самый простой способ его создать — просто скопировать$ emu ; pwd / ; cd cd: /usr/powerman: '/usr/powerman' does not exist ;
/usr/inferno/ в /usr/имя_вашего_аккаунта/ (фактически, это и есть способ добавления нового пользовательского аккаунта в инферно). Но мы пойдём другим, более гибким и эффективным путём — подключим в качестве домашнего каталога пользователя в инферно реальный домашний каталог пользователя в основной ОС (а файлы и подкаталоги из /usr/inferno/ можно скопировать в реальный домашний каталог в основной ОС).Файл-сервер mntgen(4) нужен для того, чтобы не создавать каталоги (точки монтирования), они будут появляться автоматически в каталоге куда подключен mntgen в тот момент, когда к ним кто-то обратится. В нашем случае (когда ОС Инферно установлена в нашем домашнем каталоге) можно было бы вместо использования mntgen просто создать каталог$ pwd /home/powerman $ emu ; mount {mntgen&} /usr ; bind -c '#U*/home/powerman' /usr/powerman ; cd ; pwd /usr/powerman
~/inferno/usr/powerman/, но если бы инферно была установлена root-ом общесистемно в /usr/local/inferno/, то у нас бы не хватило прав доступа для создания каталога /usr/local/inferno/usr/powerman/ и потребовались бы права root для добавления в инферно нового пользователя. А mntgen позволил эту проблему решить без root и создания физических каталогов там, где можно обойтись виртуальными.Для большей гибкости добавим поддержку переменной окружения INFERNO_HOME — если она не пустая, то в домашний каталог будет подключаться путь указанный в этой переменной. Итак, добавляем в
/lib/sh/profile:… *NIX
( home unused ) := `{os sh -c 'echo $INFERNO_HOME $HOME' </dev/null} home = '#U*'^$home user := `{cat /dev/user} mount {mntgen&} /usr bind -c $home /usr/$user cd
… Win
home := `{os cmd /C 'IF DEFINED INFERNO_HOME ( echo %INFERNO_HOME:\=/% ) ELSE ( echo %USERPROFILE:\=/% )'} home = '#U'^$home user := `{cat /dev/user} mount {mntgen&} /usr bind -c $home /usr/$user cd
Пользовательские настройки
Последнее, что имеет смысл добавить в
/lib/sh/profile, это поддержку дополнительных настроек пользователя:Модуль шелла std необходимо подгрузить, чтобы можно было использовать команду and (аналог if-а и &&). Если в домашнем каталоге пользователя есть подкаталогload std and {ftest -d tmp} {bind -c tmp /tmp} and {ftest -e namespace} {nsbuild} and {ftest -e profile} {run profile}
tmp/ — он будет подключен к системному /tmp/ (в нашем случае в этом особой необходимости нет, но при общесистемной установке инферно в /usr/local/inferno/ у нас не было бы прав на запись в /usr/local/inferno/tmp/ и эта команда была бы необходима). При наличии в домашнем каталоге пользователя файлов namespace и profile они будут выполнены.Скачать
Для удобства можете скачать рекомендуемый
/lib/sh/profile: *NIX, Win (не забудьте изменить в нём зону с GMT на свою).GUI (wm/wm)
При запуске wm/wm он выполнит
/lib/wmsetup и, если есть, ./lib/wmsetup в домашнем каталоге пользователя. Настройки plumber находятся в ./lib/plumbing в домашнем каталоге пользователя (не забудьте скопировать их в свой домашний каталог из /usr/inferno/). Прямо сейчас ничего настраивать в этих файлах необходимости нет, я их упомянул просто чтобы вы знали, где они находятся и посмотрели что в них).Ключи для аутентификации
Ключи по умолчанию будут записываться и использоваться из подкаталога
./keyring/ в домашнем каталоге. В старой статье я уже рассказывал как в инферно устроена аутентификация, и копипастить всё это сюда не вижу смысла.Сеть
В принципе, в hosted инферно сеть настраивать не требуется. Например, скачаем ya.ru (по IP):
$ emu ; webgrab -rv -o /dev/null 87.250.251.3 connecting to 87.250.251.3 writing request: GET / HTTP/1.0 Host: 87.250.251.3 User-agent: Inferno/webgrab Cache-Control: no-cache Pragma: no-cache response: HTTP/1.1 200 Ok created /dev/null, 7383 bytes
А вот для поддержки преобразования имён в IP, нужно запустить сервис
ndb/cs:; ndb/cs ; webgrab -rv -o /dev/null ya.ru connecting to ya.ru writing request: GET / HTTP/1.0 Host: ya.ru User-agent: Inferno/webgrab Cache-Control: no-cache Pragma: no-cache response: HTTP/1.1 200 Ok created /dev/null, 7689 bytes
Сервис cs(8) использует файлы
/lib/ndb/common (аналог /etc/services в *NIX), /lib/ndb/inferno (дополняет /lib/ndb/common специфичными для инферно портами) и /lib/ndb/local.Файл
/lib/ndb/local является основным — в нём описаны не только локальные настройки, но и подключаются остальные выше упомянутые файлы. В разделе infernosite= можно настроить соответствия между короткими именами серверов и их реальными именами или IP-адресами. Чаще всего используются короткие имена SIGNER и registry для указания серверов с CA (certificate authority) и registry(4) сервисами. Для подключения по короткому имени перед ним нужно добавить символ "$". Например, давайте добавим имя для яндекса:$ emu ; cat /lib/ndb/local ... infernosite= ... Yandex=www.yandex.ru ; ndb/cs ; webgrab -rv -o /dev/null '$Yandex' connecting to $Yandex writing request: GET / HTTP/1.0 Host: $Yandex User-agent: Inferno/webgrab Cache-Control: no-cache Pragma: no-cache response: HTTP/1.1 200 Ok created /dev/null, 7378 bytes
Файл
/lib/ndb/services содержит описание специфичных для инферно портов в формате *NIX /etc/services. Его имеет смысл дописать к /etc/services в основной ОС чтобы было удобнее подключаться из основной ОС к инферновским сервисам:cat ~/inferno/lib/ndb/services | sudo bash -c 'cat >>/etc/services'
Обновление OS Inferno
Для обновления системы необходимо просто повторить те же команды, которые использовались при установке:
… *NIX
cd ~/inferno hg pull -uv mk nuke mk install # пропустите эту команду на серверах без X-ов и GUI mk CONF=emu-g install
… Win
Запускаем «Windows SDK 7.1 Command Prompt» (или «Visual Studio Command Prompt (2010)» — смотря что вы устанавливали).
cd \inferno hg pull -uv mk nuke mk install