Итак, мы только что установили hosted 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»:
powerman@Ubuntu:~$ emu-g echo ok
ok
Убито
powerman@Ubuntu:~$
[powerman@freebsd ~]$ emu-g echo ok
ok
Killed: 9
[powerman@freebsd ~]$
Вреда от него никакого, и есть способ решения этой проблемы. Для этого потребуется запускать emu и emu-g через скрипты-обёртки ~/bin/emu и ~/bin/emu-g:
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
Под Linux достаточно создать эти скрипты и сделать их исполнимыми, а под FreeBSD нужно дополнительно установить bash и модифицировать значение 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
Более детально о параметрах emu можно почитать в man-странице emu(1).
Текущие значения некоторых параметров можно узнать внутри инферно:
; 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
Как видите (предпоследняя колонка) по умолчанию инферно использует не больше 32MB для каждого пула памяти.
; cat /dev/jit
0; echo 1 >/dev/jit
; cat /dev/jit
1; echo 0 >/dev/jit
; cat /dev/jit
0;
Хотя JIT можно динамически включать/отключать, изменённое значение JIT повлияет только на модули (в инферно нет разницы между программами и библиотеками, все они представляют из себя просто подгружаемые модули) которые будут загружаться после этого изменения. Поэтому значение JIT лучше указывать параметром 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
, это:
bind -b '#s' /chan
Она подключает драйвер srv(3) к каталогу /chan. По принятому в инферно соглашению, в этом каталоге создаются виртуальные файлы, чтение/запись которых преобразуется драйвером srv в сообщения, передаваемые через канал в процесс обслуживающий эти файлы. Использование таких файлов (создаваемых через file2chan(2) из Limbo или file2chan(1) из sh) является самым простым способом реализовать файл-сервер в инферно.
Домашний каталог
Домашние каталоги пользователей инферно находятся в каталоге /usr/
. По умолчанию там только один подкаталог inferno/
, который является по сути шаблоном для создания домашних каталогов других пользователей. Поэтому, если только ваш аккаунт в основной ОС называется не inferno, :) то своего домашнего каталога в инферно у вас пока нет:
$ emu
; pwd
/
; cd
cd: /usr/powerman: '/usr/powerman' does not exist
;
Самый простой способ его создать — просто скопировать /usr/inferno/
в /usr/имя_вашего_аккаунта/
(фактически, это и есть способ добавления нового пользовательского аккаунта в инферно). Но мы пойдём другим, более гибким и эффективным путём — подключим в качестве домашнего каталога пользователя в инферно реальный домашний каталог пользователя в основной ОС (а файлы и подкаталоги из /usr/inferno/ можно скопировать в реальный домашний каталог в основной ОС).
$ pwd
/home/powerman
$ emu
; mount {mntgen&} /usr
; bind -c '#U*/home/powerman' /usr/powerman
; cd
; pwd
/usr/powerman
Файл-сервер mntgen(4) нужен для того, чтобы не создавать каталоги (точки монтирования), они будут появляться автоматически в каталоге куда подключен mntgen в тот момент, когда к ним кто-то обратится. В нашем случае (когда ОС Инферно установлена в нашем домашнем каталоге) можно было бы вместо использования mntgen просто создать каталог ~/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
, это поддержку дополнительных настроек пользователя:
load std
and {ftest -d tmp} {bind -c tmp /tmp}
and {ftest -e namespace} {nsbuild}
and {ftest -e profile} {run profile}
Модуль шелла std необходимо подгрузить, чтобы можно было использовать команду and (аналог if-а и &&). Если в домашнем каталоге пользователя есть подкаталог 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
Автор: powerman