понедельник, 4 июня 2012 г.

[OpenSim] Сервер

Я тут думал написать статью про SLVoice, но потом решил, что сделаю это в неком будущем, когда мне в очередной раз надоест играть в пиксели, ибо сейчас это относительно волнующая тема и все желающие могут потренировать свой мозг самостоятельно. Поэтому статья будет совсем про другое, в общем-то, даже не про SL.



Сразу говорю, статья будет скучная и без картинок, поскольку сегодня речь пойдет о том, как установить и запустить opensim-server и где есть какие «воздушные ямы». В качестве анонса хочу заметить, что в настоящее время опенсимы шагнули далеко вперед в своем развитии, при определенной сноровке там запускаются и голосовое общение, и группы, и платёжные модули и даже меши. Но все по порядку. Сегодня запускаем сам симулятор.

Работать мы будем с операционной системой linux (у меня стоит Ubuntu 11.10 Server). Сам же сервер прекрасно работает и под Windows и в конце статьи я приведу ссылку на форум, где описывается его установка под эту ОС. Что же касается настройки самого симулятора, то она ничем не отличается, поскольку мы имеем дело с приложением, как таковым.

Итак, первым делом нам нужно подготовить плацдарм. Это довольно просто - нужно создать пользователя в системе, под которым будет жить и работать наш симулятор и установить необходимые библиотеки, требуемые для жизнеобеспечения самого сима.
  1. Создаем пользователя opensim:
    # adduser opensim
  2. Устанавливаем mono и его окружение:
    # apt-get -y install nant mono-gmcs libmono-microsoft8.0-cil libmono-system-runtime2.0-cil libgdiplus libmono-i18n2.0-cil libmono-oracle2.0-cil
  3. Теперь необходимо удостовериться, что mono работоспособен:
    # mono -V
    Mono JIT compiler version 2.10.5 (Debian 2.10.5-1)
    Copyright (C) 2002-2011 Novell, Inc, Xamarin, Inc and Contributors. www.mono-project.com
            TLS:           __thread
            SIGSEGV:       altstack
            Notifications: epoll
            Architecture:  x86
            Disabled:      none
            Misc:          softdebug
            LLVM:          supported, not enabled.
            GC:            Included Boehm (with typed GC and Parallel Mark)
  4. Так как симу нужно где-то хранить свои данные, он активно использует различные базы данных. По уму, конечно, лучше использовать mysql, но сейчас мы поставим (если не стоит) упрощенный движок DB, который называется SQLite. Вообще вещь полезная и мощная, не нужно пренебрежительно относиться к слову «упрощенный», если что ;)
    # apt-get -y install sqlite
  5. Если у вас не стоит screen, то нужно его поставить, пригодиться в дальнейшем для запуска сервера как демона, потому что он сам этого не умеет, увы и ах:
    # apt-get -y install screen
Все дальнейшие действия теперь мы будем проводить от имени пользователя opensim, поэтому логинимся в систему под ним, причем, сразу предупрежу, что в нашем случае не стоит использовать su opensim, потому что потом возникнут сложности с запуском скрина.

Что ж, осталось совесем малое - скачать и распаковать сам сервер. Скачивать его можно либо с русского сайта проекта OpenSim или же с иностранного, разницы в данном случае нет никакой. Скажу только, что хотите или нет, а придется в дальнейшем читать оба сайта. Русский потому что он на русском, а иностранный, потому что там есть жизнь.
  1. Мы залогинились заново, находимся в своей домашней директории, скачиваем симулятор:
    $ wget http://opensim.ru/server/opensim_ru_build_722.zip
    и распаковываем его:
    $ unzip opensim_ru_build_722.zip
  2. Папку с распакованными файлами лучше всего сразу переименовать во что-нибудь удобоваримое:
    $ mv opensim_ru_build_722/ osim

    Хочу обратить особое внимание на выделение красным - эти названия справедливы в настоящее время, но когда версия сервера изменится и будут выложены новые файлы, они станут другими. Понимаю, что сейчас указываю на очевидное, но безо всякого снобизма я полагаю, что среди моих читателей все же могут оказаться и блондинки с КП ;)
Собственно, все уже закончилось - сим установлен и готов к первому старту, во время которого придется ответить на несколько как простых, так и каверзных вопросов, что мы и сделаем. Следите за руками:
  1. Переходим в папку osim и, глубоко вдохнув носом, запускаем наш сервер:
    $ mono OpenSim.exe
Давайте сразу договоримся вот о чем - мы искренне и наивно полагаем, что сервер у нас стартует без ошибок и он изначально работоспособен. Если же что-то идет не так, где-то что-то жутко начинает ругаться и отваливается, то это мы разберем в индивидуальном порядке. Но для этого я хотел бы попросить вас при описании ваших трудностей как можно более полно рассказать о том, что происходит, прилагая всевозможные логи, ведь меня нет рядом с вами и я не вижу, что реально случилось.

После запуска, рано или поздно, сервер попросит вас дать ему имя:
=====================================

We are now going to ask a couple of questions about your region.

You can press 'enter' without typing anything to use the default

the default is displayed between [ ] brackets.

=====================================

New region name []: Kin-Dza-Dza
Назовите, как хотите, я свой назвал вполне предсказуемо - Kin-Dza-Dza. Если хотите, можете использовать русские буквы в кодировке UTF-8.

Дальше сервер предложит дать ему UUID вместо того, который он выбрал сам, здесь просто жмите ENTER и переходим к следующему вопросу, который стоит пометить, как каверзный:
Region UUID [f487bbdb-f591-493d-8c7d-7591f14db04b]:
Region Location [1000,1000]:
Чтобы правильно ответить на этот вопрос, стоит ознакомиться с тем, как вообще устроен грид. В данном случае нам интересно устройство координатной сетки. Как вы уже поняли, грид начинается с абстрактной точки с координатами X,Y 1000,1000. От нее симы расползаются в разные стороны до бесконечности, но при инициализации нужно точно знать место в гриде, куда вы хотите поместить свой сим. Поскольку сейчас мы будем запускать свой сим как standalone, то есть существующий в единственном экземпляре безо всякого грида, как сферический конь в вакууме, то просто нажимаем ENTER, оставляя координаты, как есть, но запоминим этот момент и потом мы к нему вернемся в статье, где я расскажу, как подключить свой сим к русскому гриду opensim.ru.

И снова каверзный вопрос задает нам железяка:
Internal IP address [0.0.0.0]:
Здесь кроются одни из основополагающих грабель, наступив на которые однажды, получаешь по башке еще продолжительное время. Дело в том, что «внутренний IP адрес», как можно понять эту надпись, совершенно не равняется адресу localhost'a компьютера, где запускается сервер, как и не равняется он внутреннему адресу в вашей локальной сети (к слову, для компьютера адрес локальной сети будет внешним, если этот момент не понятен, забейте, просто запомните как аксиому, а лучше запишите на клейкой бумажке и налепите по центру монитора). В данном случае этот адрес вообще не нужно трогать, оставив там предложенное значение, тогда сервер будет слушать все доступные интерфейсы, как внутрениий lo0 127.0.0.1, так и внешний изнутри eth0 192.168.0.2 (к примеру такой адрес, у вас может быть свой, не суть). Короче, просто жмите ENTER, но момент, опять же, запомните.
Internal port [9000]:
Добрались и до порта. Сейчас будет важно, не прохлопайте ушами ;) Дело в том, что для нормальной работы сервера должны быть открыты TCP и UDP порты 8895 и начиная с 9000 и выше по количеству запущенных на сервере симуляторов, ведь вы же знаете, что один сервер может поддерживать несколько симуляторов (регионов)? Так вот, на каждый сим по своему порту, причем здесь вы можете отойти от стандартных и предложить свои, но сейчас на это не нужно заморачиваться и просто опять, по привычке, нажимаем ENTER и запоминаем момент.
Allow alternate ports [False]:
External host name [SYSTEMIP]: 192.168.0.2
Опять же, на вопрос об альтернативных портах при помощи знакомой кнопки оставляем, как есть, а вот следующий вопрос про внешнее имя хоста опять коварен и каверзен до безобразия.

На самом деле здесь можно написать что угодно, все зависит от того, где мы хотим видеть наш сим и где он стоит - на локальной тачке, откуда и клиент потом вы будете запускать, на отдельной машине в вашей локалке или же должен быть виден из грида. В первом случае просто напишите localhost и, по привычке, запомните это место. Во втором случае, как у меня, пишем IP внутри сети - 192.168.0.2. Если же ваш сим должен быть виден из грида, то здесь нужно написать ваш внешний IP, который виден из «большого интернета». Но по первости я бы рекомендовал поступить без лишних жоподвижений и просто написать там localhost, потому что мне что-то подсказывает, что сим вы запускаете на своем локальном компьютере.

Похрустев немного, сервер приступит к конфигурированию эстейта и спросит, как его назвать:
New estate name [My Estate]: Pluk Planet
На самом деле здесь есть небольшая разница с терминологией, принятой в SL, поэтому поясняю - это на самом деле имя парселя, который по умолчанию будет размером на весь сим, поэтому я называю его просто и без затей «Pluk Planet».

Следующий вопрос - имя владельца, вписываем себя или оставляем дефолтного чувака Test User, абсолютно не принципиально. Дело в том, что в новой версии симулятора, что мы установили, не все радужно и просто с владельцем и это тема отдельной статьи, которую я скоро напишу. Так что не мудрствуя лукаво, вписывайте себя и опять же, запомните этот момент.
Estate owner first name [Test]: Manoul
Estate owner last name [User]: Carnell
И, о ужас! Красная надпись, ошибка, все пропало, крах устоев и ткани мироздания!
14:14:43 - [GRID SERVICE]: Region Kin-Dza-Dza (f487bbdb-f591-493d-8c7d-7591f14db04b) registered successfully at 256000-256000
14:14:43 - [GRID CONNECTOR]: Registration failed: Region overlaps another region
14:14:43 - [STARTUP]: Registration of region with grid failed, aborting startup due to Region overlaps another region   at OpenSim.Region.Framework.Scenes.Scene.RegisterRegionWithGrid () [0x00000] in :0
  at OpenSim.OpenSimBase.CreateRegion (OpenSim.Framework.RegionInfo regionInfo, Boolean portadd_flag, Boolean do_post_init, IScene& mscene) [0x00000] in :0
А давайте проанализируем ошибку? Смотрите, что он нам пишет:
«[GRID CONNECTOR]: Registration failed: Region overlaps another region»
Это означает то, что мы пытаемся занять место, которое в гриде уже занято чьим-то симом. Дело в том, что если вы ставили ту версию, ссылку на которую я дал выше, то этот вариант уже сконфигурирован на работу с русским гридом и при старте ломится там регистрироваться, но глобальные координаты мы ему оставили 1000,1000, а этот «пуп земли» уже давно и прочно занят. Но сейчас мы хотим запустить свой сим как отдельно стоящий, поэтому переходим плавно к третьей части марлезонского балета в пилотажном кубе. Это будет незабываемо, я вам обещаю ;)

Открываем конфигурационный файл сервера и двигаем в его самый-самый конец:
  1. $ vi OpenSim.ini
Там будут вот какие строки (привожу блок целиком):
[Architecture]
    ;# {Include-Architecture} {} {Choose one of the following architectures} {config-include/Standalone.ini config-include/StandaloneHypergrid.ini config-include/Grid.ini config-include/GridHypergrid.ini config-include/SimianGrid.ini config-include/HyperSimianGrid.ini} config-include/Standalone.ini
    ;; Uncomment one of the following includes as required.  For instance, to create a standalone OpenSim,
    ;; uncomment Include-Architecture = "config-include/Standalone.ini"
    ;;
    ;; Then you will need to copy and edit the corresponding *Common.example file in config-include/
    ;; that the referenced .ini file goes on to include.
    ;;
    ;; For instance, if you chose "config-include/Standalone.ini" then you will need to copy
    ;; "config-include/StandaloneCommon.ini.example" to "config-include/StandaloneCommon.ini" before
    ;; editing it to set the database and backend services that OpenSim will use.
    ;;
    ; Include-Architecture = "config-include/Standalone.ini"
    ; Include-Architecture = "config-include/StandaloneHypergrid.ini"
    Include-Architecture = "config-include/Grid.ini"
    ; Include-Architecture = "config-include/GridHypergrid.ini"
    ; Include-Architecture = "config-include/SimianGrid.ini"
    ; Include-Architecture = "config-include/HyperSimianGrid.ini"
Нужно раскомментировать строчку Include-Architecture = "config-include/Standalone.ini" и закомментировать Include-Architecture = "config-include/Grid.ini". Думаю, по названиям файлов уже догадались, что к чему, верно? ;) Все, сохраняем файл и приводим в порядок конфиги одиночного режима. Для этого идем в папку config-include/, находим файл StandaloneCommon.ini.example и копируем его с новым именем:
  1. $ cp StandaloneCommon.ini.example StandaloneCommon.ini
Теперь можно запускать наш сим снова. Убедившись, что мы находимся в папке osim, а не остались в гнездилище конфигов, запускаем сим заново уже знакомой командой. В результате получаем приглашение в консоли сервера:
Region (Kin-Dza-Dza) #
Вы можете посмотреть весь список доступных команд самого симулятора простой и интуитивной командой help, которую нужно напечатать там же, в консоли, сейчас же я расскажу об одной, которая создаст вам пользователя, чтобы вы могли зайти клиентом на свежесозданный сим.
  1. Region (Kin-Dza-Dza) # create user Manoul Carnell MYPASSWORD MY@EMAIL
На что сервер ответит примерно следующее:
14:50:57 - [AUTHENTICATION DB]: Set password for principalID cddc6ad9-77fa-447b-beb0-a8bbdf0f98cf
14:50:57 - [GRID SERVICE]: GetDefaultRegions returning 0 regions
14:50:57 - [USER ACCOUNT SERVICE]: Unable to set home for account Manoul Carnell.
14:50:59 - [USER ACCOUNT SERVICE]: Creating default appearance items for cddc6ad9-77fa-447b-beb0-a8bbdf0f98cf
14:50:59 - [USER ACCOUNT SERVICE]: Creating default avatar entries for cddc6ad9-77fa-447b-beb0-a8bbdf0f98cf
14:50:59 - [AVATAR SERVICE]: SetAvatar for cddc6ad9-77fa-447b-beb0-a8bbdf0f98cf, attachs=0
14:51:00 - [USER ACCOUNT SERVICE]: Account Manoul Carnell created successfully
Ну что, осталось взять клиент и шагать осваивать просторы. Какой брать клиент для этого - ну уж явно не стандартный Viewer2 ;) На самом деле можно и его, просто задать ему параметр loginuri при запуске с адресом вашего сима, я просто не помню, как там точно пишется. Или любой другой клиент, тот же «Феникс». Включите отображать список доступных гридов в настройках клиента и выбирайте там. Если у вас сим на той же машине, то localhost, если же нет, то нажимайте кнопку «Grids» и добавляйте свой грид, как это сделано у меня для сима, работающего на другой машине в локальной сети:



Собственно, вот и все на сегодня. Развлекайтесь, пробуйте, ругайтесь, спрашивайте, снова пробуйте. Кстати, обещанная ссылка на установку сервера под Windows, тоже ничего сложного, а все остальное точно так же.

Ах да, чуть не забыл. Выключается сервер командой shutdown, отданой ему в консоли. Не стоит просто прибивать процесс - это дурной тон, который рано или поздно закончится весьма печально для всей организации. А вот чтобы сим не болтался под руками постоянно, нужно запустить его в скрине. Сделать это достаточно просто:
  1. $ screen -S osim -d -m mono OpenSim.exe
Сим запустится в фоновом режиме и можно смело закрывать терминал. Если же вам понадобиться что-то сделать в его консоли, просто вызовите скрин простой командой:
  1. $ screen -x osim
Отключиться от скрина с симом, оставив его в работоспособном состоянии, можно комбинацией клавиш Ctrl-A-D.

Ну а дальше я расскажу, как подключить сим к гриду, привести это все хозяйство к более-менее удобоваримому виду, разбирая тонкие настройки сервера и как подключить сервис групп и войса, но это будет в другой раз и в другой истории.

1 комментарий:

  1. А можно поднять свой сервер, а потом подключить в режиме Standalone;

    а потом уже менять на другие режимы?
    Standalone;

    - Standalone Hipergrid;

    - Grid;

    - Grid Hipergrid

    ОтветитьУдалить