среда, 14 марта 2012 г.

MineCraft Server (CraftBukkit) на Linux

Решил раскрутить сервер MineCraft у себя на линуховой машине.

Подготовка

Буду я все это делать на свеже установленном Linux, установку производил

с CentOS-6.2-i386-minimal.iso (необходимый минимум и ничего лишнего).

Подготовим наш сервер к запуску серверной части MineCraft:

# yum update -y

Установим screen, mysql-server (wget, vim и mc по желанию)
# yum install -y  screen mysql-server wget vim mc

Установим Java

как это делать я описывал тут 
PS: # yum install -y java - такой метод нем не подходит, сервер не запустится.

# mkdir minecraft && cd minecraft

Установка и русификация

Последний рекомендуемый билд сервера

http://wiki.bukkit.org/Setting_up_a_server/

Нужен именно последний рекомендуемый билд, а не просто последний. Иначе прощайте плагины.

Русификатор

http://minecraft-game.ru/tag/rusifikator/

Из русификатора нужно взять папку lang и font.txt и заменить ими файлы внутри файла .jar сервера. Это удобно сделать в менеджере архивов, так как .jar почти обычный .zip.

После того как прорусифицировали заливаем файло на сервер. (как вариант через WinScp)

Запуск сервера

Запускать сервер тоже будем скриптом и обернём в screen. Скрипт запускает сервер и перезапускает если он уже запущен.(без сохранения мира и т.д.).

# vim start.sh

В нем рисуем:

#!/bin/bash
screen -X -S minecraft quit
cd ~/minecraft
screen -A -d -m -S minecraft java -Xincgc -Xmx1G -jar craftbukkit-1.1-R6-20120301.142116-2.jar

Делаем наш скрипт исполняемым

# chmod +x start.sh

Если нам неведомым образом удалось наплодить скринов minecraft, то для этого случая
приготовим скрипт который убьет все сессии screen со словом minecraft

# vim kill.sh

В нем рисуем:

#!/bin/bash
kill `ps -ef | awk '! /awk/ && /minecraft/ {print $2}'`

Скрипт на "правильный"  перезапуск:

# vim restart.sh

В нем рисуем:
#!/bin/bash
screen -x minecraft

Далее в консоль сервера ручками вбиваем:
save-all
stop

Запускаем сервер:

# ./start.sh

Файлов после этого прибавится, в том числе будут созданы файлы настроек.

Настройка
server.properties

Исчерпывающая информация по файлу настроек на русском


Многие значения имеют два параметра — true или false. Рассмотрим некоторые из них:

allow-nether=true — разрешить/запретить Нижний мир на сервере

level-name=world — имя карты. В большинстве случаев менять не требуется. Если вы закинули мир из сингла, то поменяйте значение на имя папки с вашим миром, или переименуйте его в world

allow-flight=false — вкл/выключить встроенную защиту от полетов. Будет кикать летающих игроков без creative режима. Если вы планируете другую защиту от полетов, можете отключить этот параметр.

enable-query=false
enable-rcon=false — эти 2 строки используются для удаленного подключения к консоли.

server-port=25565 — порт, по которому будет доступен сервер.

level-seed= — сид для генерации мира.

server-ip= — ip сервера. В большинстве случаев можно оставить пустым, особенно если все работает.

white-list=false — вкл/выкл вайтлист на сервере. При включенном параметре, зайти смогут только те игроки, которые прописаны в файле white-list.txt

spawn-animals=true — будут ли появляться нейтральные мобы
spawn-monsters=true — будут ли появляться агрессивные мобы

online-mode=true — при true зайти смогут только игроки с лицензией. При false — все. Не стоит выставлять его в false, если на сервере нет парольной защиты для игроков, иначе любой сможет зайти под вашим администраторским ником и натворить делов..

pvp=true — вкл/откл ПвП на сервере. при выключенном параметре, игроки не смогут атаковать друг друга.

difficulty=1 — сложность игры. Варьируется от 0 до 3
gamemode=0 — режим игры на сервере. 0 — выживание, 1 — креатив режим.

max-players=20 — максимальное количество игроков.

view-distance=10 — дальность вида на сервере. Влияет на то, сколько чанков в каждую сторону видит игрок. Может принимать значения от 1 до 15

motd=A Minecraft Server — имя сервера, будет отображаться в списке серверов в главном меню.


Bukkit.yml 
Bukkit.yml - файл, который предоставляет Вам большое разнообразие опций для того, чтобы сконфигурировать Ваш сервер CraftBukkit.

Меняем БД на Mysql:

database:
  username: minecraft
  isolation: SERIALIZABLE
  driver: com.mysql.jdbc.Driver
  password: pass
  url: jdbc:mysql://localhost:3306/minecraft

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

Многие из них предлагают на выбор хранить базу данных в Mysql или локально. Первый вариант всегда лучше. Во-первых он намного быстрее, во-вторых работать с базой будет проще - например если плагин создаст дубликаты записей и вам нужно будет это исправить.

Для удобства храните все данные плагинов в одной базе, но используйте для разных плагинов префиксы, например lwc_ для LWC.

Применение настроек, управление сервером

Чтобы применить настройки, сервер нужно перезапустить:
Юзаем на скрипт на "правильный"  перезапуск:

# restart.sh

и мы попадаем в консоль управления сервером.

Иногда достаточно дать комманду reload и этого бывает достаточно, иначе сначала необходимо сохраниться save-all остановить сервер stop и запустить ./start.sh

Получить помощь по командам сервера можно если вбить help


Общая информация о плагинах

Плагины можно найти на http://dev.bukkit.org/ http://rubukkit.org/forums/, обычно информация об установке и использовании находится в самом топике.

Чтобы включить плагин скопируйте .jar в папку plugins и перезапустите сервер, хотя обычно можно обойтись командой reload. После этого может появиться папка plugins/, в ней хранятся настройки (как правило в .yml) и локальные базы данных.

Некоторые плагины идут сразу с настройками в комплекте (папка , соответсвенно её нужно скопировать в plugins), некоторые работают вообще без папки с настройками.

Никогда не используйте символы табуляции при редактировании .yml, сервер просто не будет запускаться. Чтобы рекурсивно заменить табуляцию на четыре пробела во всех .yml файлах используйте этот скрипт:

# vim convert_tabs.sh

#!/bin/bash

find ~/minecraft -name "*.yml" |while read line
do
expand --tabs=4 $line > $line.new
mv $line.new $line
done

# chmod +x convert_tabs.sh

Он удобен, если вы работает в редакторе, который автоматически вставляет табы.

Список всех плагинов покажет команда plugins.

PS:  Версия клиента и сервера должна совпадать, иначе не подключимся. Например если сервер версии 1.1, то клиентом версии 1.2 мы подключиться не сможем, справедливо и обратное.

Screen – управления окнами из консоли


Иногда приходится работать с *nix серверами удаленно по ssh, в моем случае через putty. Если дисканектит по причине херового интернета, ссесия рвется, то хана всем нашим не завершенным процессам, наработкам в не сохраненных конфигах и.т.д. Что бы предостереч себя от подобных казусов, а так же хранить сессии и в любое время из любого места к ним подключаться я открыл для себя оконный менеджер Screen. Теперь по делу.

Устанавливаем:

#yum install -y screen

 Для начала, освоим основные действия для манипуляции с окнами
Открываем любой эмулятор терминала (в моем случае - это putty) и запускаем в нем Screen:

$ screen


Это окно - первое окно Screen, которое было создано программой автоматически, при ее запуске. Создадим еще одно окно.
Набираем на клавиатуре следующую комбинацию клавиш (везде без -, - это разделитель):
 Ctrl+ac




Запустим в этом окне какой-либо процесс. Пусть это будет top и создаем еще одно окно
 Ctrl+ac и запустим в нем какой-либо процесс. На этот раз путь это будет  man screen
 
На данный момент мы имеем  в одном окне терминала putty три запущенных окна screen.
Как глянуть сколько окон? как вариант Ctrl+aw

Мы видим в левом верхнем углу окна строку:
0$ bash 1*$ bash 2-$ bash

Это список активных, созданных нами окон screen. 0, 1, 2 - это номера окон, а bash - их имена (заголовки). Как видно, нумерация окон начинается с нуля. А вот имена у всех трех одинаковые - bash
 

Окна:
0$ bash - это то, которое Screen сам создал при своем запуске (забегая чуть вперед, можно сказать, что их колличество может быть не одно и выставляется оно в конфигурационном файле);
1-$ bash - в этом окне мы запутили top;
2*$ bash - в этом окне у нас запущен man screen.

Переключение производится сочетанием:
Cntrl+a - p - переключиться на предыдущую вирутальную консоль
Cntrl+a - n или пробел - переключиться на следующую вирутальную консоль
Ctrl+a“ -- интерактивный (в отличие от Ctrl+a – w) список созданных нами окон. Можно перемещаться по нему стрелками вверх-вниз и входить Enter‘ом в нужное.


Можно перейти на нужное окно, зная его номер, по команде:
Ctrl+aномер_окна

Например, перейдем на второе окно: 
Ctrl+a1

Или, чуть переиначив команду:
Ctrl+a

В нижней строке появится предложение ввести номер окна, в которое мы хотим перейти. Допустим, нам нужно перейти в первое окно — вводим номер 0 и нажимаем Enter:

Как мы видели из вывода команд Ctrl+a – w и Ctrl+a – “, имена (заголовки) окон одинаковые. Давайте исправим это. Наберем команду Ctrl+aA

В нижней строке появится приглашение изменить заголовок окна. Исправляем с bash на main и нажимаем Enter. Узнать имя текущего окна можно Ctrl+aN мы увидим в левом верхнем углу окна его имя.

Информацию об окне:
Ctrl+ai

 
Мы увидим в левом верхнем углу окнаинформацию и его имя, в нашем случае имя Main.

Как видно из предыдущих выводов, нумерация окон происходит последовательно, с возрастанием номера: 0 - 1 - 2. Если мы закроем одно из них, нумерация оставшихся окон не изменится.

Закрытие окна в Screen производится выполнением команды exit в окне. Предварительно, нужно остановить все запущенные процессы в нем. Закрытие окон можно произвести и комбинацией Ctrl+a – k. Однако, выполнять ее не рекомендуется, так как эта операция идентична команде kill – “убить” процесс.

Давайте закроем второе окно. Остановим процесс top и выполним exit. А затем посмотрим вывод команды.

Было:

 
Стало:

Видим, что нумерация теперь следующая: 0 — 2. Давайте поменяем нумерацию окон, в частности, окна под номером 2 и присвоим ему номер 1. Выполним команду:
Ctrl+a:
Внизу окна появится приглашение в виде двоеточия для ввода команды.
Введем команду:
number 1
И нажимаем Enter.
Смотрим результат:
Ctrl+a

Cправка по клавиатурным комбинациям Screen:
Ctrl+a?

По умолчанию, Screen отображает только одно окно на экране эмулятора терминала. Однако, имеется возможность разбивать окно Screen в терминале на несколько. Для этого существует команда разбивки окна на горизонтальные части – регионы. Удобство в этом случае заключается в том, что нет надобности переключаться между окнами – все они находятся на виду и все процессы под контролем, достаточно лишь перевести взгляд на нужное окно.
Открываем эмулятор терминала и запускаем в нем Screen и выполняем команду разбивки экрана эмулятора на две горизонтальные части – регионы:
Ctrl+aS

Как видно на скриншоте, окно эмулятора терминала putty было разбито на две одинаковые горизонтальные части. В Screen такие части, выполненные с помощью команды Ctrl+a – S, называются регионами. Таких регионов может быть не обязательно два, а много больше. Допустим, чтобы получить три окна Screen в нашем случае, нужно в текущем регионе (он у нас верхний) снова выполнить команду Ctrl+a – S. Так можно создать три, четыре, пять и т. д. окон Screen. Но мы остановимся на варианте из двух окон, для наглядности.

В верхнем регионе у нас запущен Screen и на этом регионе установлен фокус (зеленый курсор). Нижний регион у нас пуст – в нем не запущен Screen и пока там ничего нет. Нам необходимо перейти на нижний регион, создать там окно Screen и запустить в нем процесс.
Переведем фокус на нижний регион:
Ctrl+aTab
и создадим в нем окно Screen:
Ctrl+ac
У нас появилась командная строка.
Запустим в здесь процесс – top


Теперь переместимся (переведем фокус) опять на верхний регион и запустим там ps -aux.
Снова вводим команду:

Ctrl+aTab
и выполняем:
ps -aux

Получаем:

Закрытие текущего региона в Screen производится командой Ctrl+a – X. Выполним ее в нашем текущем верхнем регионе:
Ctrl+aX

Получим:
Если открыто несколько (больше двух) регионов, можно закрыть сразу все, кроме одного – текущего, выполнив команду:
Ctrl+aQ

и вот еще:
Ctrl+a-| (вертикальное разбиение)

Ctrl+A - d - deattach - отключитсья от окна (но не закрыть)
Ctrl+A - H - записывать в журнал
Ctrl+A - C - (clear) очистить экран.
Ctrl+A - d - (detach) отключить screen от этого терминала.
Ctrl+A - D-D - (pow_detach)  отключиться и разрегистрироваться. 
 
Полезные опции командной строки:
 
-ls и -list
не запускает screen, а показывает вместо этого список идентифицирующих сеансы screen 
строк pid.tty.host. Сеансы, которые отмечены словом "detached" могут быть продолжены 
с помощью команды "screen -r". Сеансы, которые отмечены словом "attached", работают, и 
у них есть управляющий терминал. Если сеанс работает в многопользовательском режиме, 
он отмечен словом "multi". Сеансы, которые отмечены словом "unreachable" или работают на 
другом хосте, или умерли (dead). Недоступный (unreachable) сеанс считается мёртвым, если 
его имя соответствует или имени локального хоста, или указанному параметру (если такой есть).
Как описывать строки для выбора рассказывается в описании ключа -r. Сеансы, отмеченные 
как "dead", нужно проверить и удалить. Если вы не уверены, нужно ли удалять какой-то сеанс,
 вы можете обратиться к системному администратору (если это не вы сами, иначе может 
возникнуть бесконечная рекурсия). Удалить сеансы можно с помощью опции -wipe. 
 
-wipe [match]   
работает также как "screen -ls", только удаляет файлы уничтоженных сеансов вместо того чтобы 
помечать их как "dead" (мёртвые). Сеанс, который не отвечает, считается мёртвым, или если его
имя соответствует имени локального хоста, или указанному явно параметру match. См. описание
ключа -r, где рассказаны правила составления match.   
-r [pid.tty.host]   
-r sessionowner/[pid.tty.host] 
возобновляет работу отключённого сеанса. Никакие другие опции (за исключением комбинаций 
с -d/-D не допускаются). Необязательный параметр [pid.]tty.host может указываться для того
чтобы определить какой именно сеанс из множества отключённых имеется в виду. Вторая форма 
используется для подключения к работающему в многопользовательском режиме сеансу другого 
пользователя. Эта опция говорит о том, что файл нужно искать в каталоге другого пользователя. 
Требует наличия бита setuid-root у программы screen. 
-x 
Подключиться к активной (not detached) сессии screen. (Многодисплейный режим). 
-X 
Отправить указанную команду в работающий сеанс screen.
 
-S sessionname 
Эта опция может использоваться для задания имени сеансу при его создании. Имя используется 
для идентификации при вызове "screen -list" и "screen -r". Оно заменяет префикс "tty.host", 
использующийся по умолчанию. 
 
-A
Адаптирует размеры всех окон под размер текущего терминала. По умолчанию screen пытается 
восстановить старый размер окна (при подключении к терминалам с изменяемыми размерами 
(те у кого есть "WS" в описании, например, suncmd или xterm). 
-d -m 
Запустить сеанс в "отключенном" режиме. Сессия создаётся, но к ней не выполняется 
подключение. Это полезно для загрузочных системных скриптов. 
-D -m
Тоже запускает screen в "отключенном" режиме, но не создаёт новый процесс. Команда 
завершается, если сессия прерывается.

 d|-D [pid.tty.host]

не запускает новый сеанс, а отключает вместо этого уже запущенный ранее. Достигается тот же 
эффект, что и в с случае нажатия клавиш "C-a d" на управляющем терминале screen. Ключ -D 
эквивалентен ключу power detach. Если ни к одному сеансу нельзя обратиться, опция 
игнорируется. В связке с -r/-R могут быть достигнуты другие более интересные эффекты.
 
-d -r 
Подключить к сеансу, и если необходимо, сначала отключить его.  

В каждом сеансе, свои окна! 

Разберем на примере скрипт:

#!/bin/bash
 
'Тут мы направляем комманду exit в ссесию Proga1' 
screen -X -S Proga1 exit
 
 
'Тут мы переходим в каталог program, который находится в нашей домашней дериктории 
и запускаем в "отключенном" режиме ссесию с именем Proga1 и в этой же ссесии сразу 
запускаем nasha_program.sh'
 
cd ~/program/
screen -A -m -d -S Proga1 nasha_program.sh

Т.е. мы создаем сессию с  именем Proga1, но к ней не подключаемся и запускаем в ней программу и если сессия с таким именем уже существует,мы ее сначала закрываем посылая команду exit.

Управление внутри скрина: 
Ctrl+a - c - создание новой вкладки внутри текущей сессии скрина.
Ctrl+a - цифра - переход на  вкладку "номер" в текущей сессии скрина.
Ctrl+a - A - создание имени для текущей вкладки.
Ctrl+a - " - удобное перемещение по именованным вкладкам.
Ctrl+a - d - detach, отсоединение от сессии скрина, выход в обычный баш. Все задачи продолжают выполнятся, но внутри скрина.
Ctrl+d - обычный логауат, как из терминала из . Если вкладка единственная в сессии, текущий скрин завершит работу. Если одна из нескольких, то она закроется, а вы переместитесь в предыдущую вкладку по номеру.
Ctrl+D – выйти из всех сеансов screen

Управление скрином снаружи, из баша.
screen -r - attach, при наличии единственной сессии запущенного скрина - присоединение к ней.
screen -r proc-id  - присоединение к указанной сессии по номеру ее процесса.
screen -ls - распечатка списка текущих запущенных скринов.

Если ссесия запущена с другого терминала (Attached),то можно попробывать -D -R

Тюнинг
Можно так же слегка тюнинговать внешнее отображение виртуальных консолей, для этого создайте в домашней директории файл .screenrc и впишите в него следующее:
caption always
caption string "%{kw}%-w%{wr}%n %t%{-}%+w"
shell -$SHELL
Теперь внизу всегда будет отображаться количество виртуальных консолей и цветное отображение текущей.

Русский MAN ТУТ
Хорошая статья
http://hlabs.org/development/screen