Настройка OS Inferno

в 21:47, , рубрики: inferno, настройка, операционные системы, метки: ,

Итак, мы только что установили 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

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js