TeamFortress2のサーバをFreeBSDで立ててみる

TeamFortress2の鯖を立ててみたくなった、のでやってみる。OSはFreeBSD。現在のsourceエンジンじゃない、hlds(half life dedicated server)の時代から、パフォーマンスを出すならLinuxで、というのが定石だ。詳しい仕組みはわからないんだけれど、サーバでの更新レートを秒間1000回出すためにはlinuxのネイティブ環境じゃないとダメなのだ。更新レート秒間1000回ってのは俗に言う、「鯖のFPS1000」ってやつ。hlds時代の実験ではFreeBSDで動くsteam鯖はあくまでlinuxのエミュレートなのでどうしても秒間500回までしかでなかった。でも今回はパフォーマンスをそこまで気にしていないのでFreeBSDでやってみる。

あと現状がどうなってるのかもよくわかんない。

以前にたぶんL4D2用にsrcds鯖を立てたことがあったので参考にしながらやってみた。

まずはsteam鯖をportsからインストール。linuxエミュレート環境がないとココのインスコでコケちゃう。

linuxエミュレート環境はrc.confにlinux_enableをYESと書いてlinux.koをkldloadしてやる。最近だと標準で付いてくるケースが多い気がするけど、もしかすると環境によってはportsでlinux.koを入れないとダメかも。

shell> echo ‘linux_enable=”YES”’ >> /etc/rc.conf

shell> kldload linux.ko

shell> games/linux-steam

インストールするとパッケージからの情報として下記の通りメモが出てきた。ログイン情報はいらなくなったよ、とのことらしい。前々からアレについてはよくわかんなかったんだよね。

===>>> pkg-message for linux-steam-1.1
------------------------------------------------------------------------
Linux HLDS Update Tool has been successfully installed!

To get started:
cd /usr/local/steam
./steam -command update -game [name] -dir .

Steam will then begin downloading the game content to your system.  Once
complete you may start your server by:

./hlds_run -game [name] +map [mapname] -maxplayers [#] \
-autoupdate

OR

./srcds_run -game [name] +map [mapname] -maxplayers [#] \
-autoupdate


NOTE: Steam no longer requires login information.
------------------------------------------------------------------------

メモにあるとおり、/usr/local/steamにsteamという名前のバイナリが転がってる。ココにゲームのサーバ本体を入れたりして運用しましょう、ということらしい。アップデートのためにsteamバイナリを何度か動かして、その後でゲームリストを拾ってみる。steamバイナリを動かすときはroot権限とかの、/usr/local/steamに書き込み権限がないとアップデートで落としてくるファイルを書き込めなくてエラーになる。

shell> ./steam -command help
Checking bootstrapper version ...
Getting version 48 of Steam HLDS Update Tool
Downloading. . . . . . . . . . . .Steam Linux Client updated, please retry the command
shell> ./steam -command help
Checking bootstrapper version ...
removing stale semaphore last operated on by process 2786 with name 0eBlobRegistryMutex_07692C9F0DCCAB9B49E0AA2095A1952C
removing stale semaphore last operated on by process 2786 with name 0eBlobRegistrySignal_07692C9F0DCCAB9B49E0AA2095A1952C

Use: steam -command <command> [parameters] [flags]

Commands:

update: Install or update HLDS

parameters:
-game <game>            -   Game name (use '-command list' to see available games)
-dir <installdir>       -   HLDS Install dir
(if dir not specified, will use value from last run of tool)

flags:
-verify_all             -   Verify all HLDS files are up to date
-retry                  -   Automatically retry every 30 seconds if the Steam Network is busy
-remember_password      -   Remember password (if a username is supplied)

For example: steam -command update -game cstrike -dir /hlds

version: View installed versions

list: View available games

Optional parameters for all commands:

-nobootstrapupdate      -   Do not check for updates to the update tool

shell> ./steam -command list
Checking bootstrapper version ...
removing stale semaphore last operated on by process 2793 with name 0eBlobRegistryMutex_07692C9F0DCCAB9B49E0AA2095A1952C
removing stale semaphore last operated on by process 2793 with name 0eBlobRegistrySignal_07692C9F0DCCAB9B49E0AA2095A1952C
** 'game' options for Source DS Install:

"Counter-Strike Source"
"ageofchivalry"
"alienswarm"
"cssbeta"
"diprip"
"dods"
"dystopia"
"episode1"
"esmod"
"garrysmod"
"garrysmodbeta"
"hl2mp"
"insurgency"
"l4d_full"
"left4dead"
"left4dead2"
"left4dead2_demo"
"orangebox"
"pvkii"
"smashball"
"synergy"
"tf"
"tf_beta"
"zps"

** 'game' options for HL1 DS Install:

"cstrike"
"cstrike_beta"
"czero"
"dmc"
"dod"
"gearbox"
"ricochet"
"tfc"
"valve"

** 'game' options for Third-Party game servers:

"ageofchivalry"
"aliensvspredator"
"americasarmy3"
"brink"
"darkesthour"
"darkmessiah"
"defencealliance2"
"dinodday"
"diprip"
"dystopia"
"esmod"
"garrysmod"
"garrysmodbeta"
"hauntedhellsreach"
"homefront"
"homefrontjpn"
"insurgency"
"killingfloor"
"killingfloor_beta"
"marenostrum"
"modernwarfare3"
"mondaynightcombat"
"naturalselection2"
"nucleardawn"
"pvkii"
"redorchestra"
"redorchestra2"
"redorchestra_beta"
"serioussam3"
"serioussamhdse"
"ship"
"sin"
"smashball"
"synergy"
"tshb"
"zps"

どうやらTeamFortress2のゲーム名はtfらしい。TeamFortressClassicとカブりそうな気もするけどいいのかな。

下記のコマンドを入れるといろいろとファイルをダウンロードしてくる。結構時間かかりました。

shell> ./steam –command update –game tf –dir ./

…(略)…

102:08    100.00%  downloading .//orangebox/hl2/navplace.db
102:08    100.00%  downloading .//orangebox/hl2/pure_server_whitelist.txt
102:08    100.00%  downloading .//orangebox/libcurl.so.4
102:08    100.00%  downloading .//orangebox/libcurl.so.4.2.0
102:09    100.00%  downloading .//orangebox/srcds_linux
102:09    100.00%  downloading .//orangebox/srcds_run
102:09 [63.150.140.70:27030] Disconnecting
HLDS installation up to date

http://tfortress2.wikiwiki.jp/?server.cfg

上記サイトを参考にサーバの設定をしてみた。コンフィグの置き場所はsteamバイナリが置いてある場所から相対で orangebox/tf/cfg/server.cfg に新規作成。

shell> cat orangebox/tf/cfg/server.cfg


hostname "l2tp tf2 server"
rcon_password "rcon"

mp_chattime 10
mp_stalemate_enable 0
mp_stalemate_timelimit 240
mp_bonusroundtime 5
mp_winlimit 0
mp_maxrounds 0
tf_flag_caps_per_round 3
sv_alltalk 0
mp_timelimit 15
hostname
sv_pure 0
sv_lan 0
sv_consistency 1
sv_stats 1
sv_region 4
log on
sv_log_onefile 0
sv_logfile 1
sv_logbans 1
sv_logecho 1
fps_max 600
sv_minrate 0
sv_maxrate 20000
sv_minupdaterate 10
sv_maxupdaterate 66
sv_allowupload 1
sv_allowdownload 1
net_maxfilesize 15
mp_autoteambalance 1
mp_autoteambalance_delay 60
mp_autoteambalance_warning_delay 30
mp_teams_unbalance_limit 1
mp_enableroundwaittime 1
mp_bonusroundtime 8
mp_restartround 0
mp_stalemate_enable 1
mp_stalemate_timelimit 300
mp_timelimit 35
mp_forcecamera 0
mp_allowspectators 1
mp_footsteps 1
sv_cheats 0
sv_timeout 900
mp_idlemaxtime 15
mp_idledealmethod 2
decalfrequency 0
sv_voiceenable 1
mp_chattime 10
tf_birthday 1

tv_enable 1
tv_name "l2tp hltv"
tv_maxclients 5 // (0-255, default 128)
tv_delay 10 // (10-120[sec], default 30)
tv_delaymapchange 1 // (1 | 0)
tv_port 21520 // (default 27020)
tv_maxrate 0 // (default 5000[bps], 0:unlimited)
tv_autorecord 0
tv_debug 1 // (1 | 0)
//tv_snapshotrate 24 // (default 16)
tv_dispatchmode 1 // (0=never, 1=if appropriate, 2=always)
//tv_overrideroot 0 // (0 | 1)
tv_allow_camera_man 1
tv_allow_static_shots 1 //
//tv_relayvoice 1
tv_transmitall 1


そして実行。+ipで与えるアドレスはsrcds_runのプロセスがバインドするアドレスなのでnapt配下の環境ではローカルipを渡してやる。

一瞬ゲームサーバとかに広告するアドレスでグローバルを書くべきかなとか思ったけど違うみたい。

shell> cd orangebox
shell> ./srcds_run -console -game tf +map ctf_2fort +maxplayers 20 +ip 192.168.1.1 –autoupdate
Auto detecting CPU
Using default binary: ./srcds_linux
Server will auto-restart if there is a crash.
INFO: Located steam: ../steam
Updating server using Steam.
Checking bootstrapper version ...
Getting version 48 of Steam HLDS Update Tool
Downloading. . . . . . . . . . . .Cannot open output file 'LinuxHldsUpdateTool_48.pkg'
2012G/ 47n14F| EZMKF| 11;~42J,28IC JST: Steam Update failed, ignoring.
Unable to determine CPU Frequency
2012G/ 47n14F| EZMKF| 11;~42J,28IC JST: Server restart in 10 seconds
Updating server using Steam.
Checking bootstrapper version ...
removing stale semaphore last operated on by process 22499 with name 0eBlobRegistryMutex_1F7241AEB333B3B7B12FBB9F8A43FDED


なにやら更新作業をしようとして失敗のループをしてる。

Downloading. . . . . . . . . . . .Cannot open output file ‘LinuxHldsUpdateTool_48.pkg’

どうやらファイルをダウンロードしたけど書き込めないよ、とのことらしい。

root権限で動かすとセキュリティリスクがあるよって怒られた。プロセスが乗っ取られるとまずいよね、って。ひとまずroot権限で動かして後でユーザ所有のディレクトリに変えてやる。

shell> sudo ./srcds_run -console -game tf +map ctf_2fort +maxplayers 20 +ip 192.168.1.1 -autoupdate


************** WARNING ***************
Running the dedicated server as root
is highly discouraged. It is generally
unnecessary to use root privileges to
execute the dedicated server.
**************************************


The server will continue to launch in 10 seconds\rThe server will continue to launch in 9 seconds\rThe server will continue to launch in 8 seconds\rThe server will continue to launch in 7 seconds\rThe server will continue to launch in 6 seconds\rThe server will continue to launch in 5 seconds\rThe server will continue to launch in 4 seconds\rThe server will continue to launch in 3 seconds\rThe server will continue to launch in 2 seconds\rThe server will continue to launch in 1 seconds\rAuto detecting CPU
Using default binary: ./srcds_linux
Server will auto-restart if there is a crash.
INFO: Located steam: ../steam


と、またもやループしてる。

見れば

Unable to determine CPU Frequency
と出ている。どうやらCPUの周波数が分からないよ、と。FreeBSDだとLinuxと違ってprocinfoにCPUの情報が無いからだろう。

過去の記事を参考にprocinfoを引けるようにしてあげる。

shell> echo "linprocfs /compat/linux/proc linprocfs rw 0 0" >> /etc/fstab

shell> mount -a

動いた。でもLANモードオンリーとかって気になる文字列が。

shell> ./srcds_run -console -game tf +map ctf_2fort +maxplayers 20 +ip 192.168.1.1 –autoupdate

…(略)…

*********************************************************
*       Unable to load Steam support library.*
*       This server will operate in LAN mode only.*
*********************************************************



原因はポートの待ち受け設定をnaptでやってないことだった。naptでポートの転送先をちゃんと設定するとうまく動いた。

以上で一通りの動作を確認できた。あとは動かしながら調整していこうと思う。

FreeBSDでwsgiを使ったtracがどうもおかしい

FreeBSDでwsgiを使ったtracがどうもおかしい。なんだか重い。もともとfcgiを利用してたんだけれどfcgi版のtrac(というかpythonかな)って重い、なのでwsgiにて動かすことにした。

過去にyubirdたんがdebianで、また別件でcentosにてwsgi版のtracを動かしたけどとっても快調だった。

どうやらapache+pythonでの最近のハヤリはwsgiらしい。ということでテキトウにインストールした。

さて、confの変更もすんで動かしてみたんだけれどどうにも重い。topすればpythonの名前でapacheから独立してプロセスが走り続けてたりする。なんかおかしいな、って。ログを見ると気になる記述が。


[Wed Apr 11 13:37:47 2012] [info] mod_wsgi (pid=1189): Attach interpreter ''.
[Wed Apr 11 13:37:52 2012] [info] mod_wsgi (pid=1189): Cleanup interpreter ''.
[Wed Apr 11 13:37:52 2012] [info] mod_wsgi (pid=1189): Terminating Python.
[Wed Apr 11 13:37:52 2012] [error] Exception KeyError: KeyError(34382823872,) in <module 'threading' from '/usr/local/lib/python2.6/threading.pyc'> ignored

最後の行にあるException KeyError: KeyErrorのあたり。なんかスレッド周りの処理でエラーが出てるらしい。

でググってみるとそれらしき記述を発見。

InstallationOnFreeBSD -  modwsgi - Python WSGI adapter module for Apache. - Google Project Hosting

http://code.google.com/p/modwsgi/wiki/InstallationOnFreeBSD

上記のgoogle codeによるとあれしろコレしろ、ってあるけど、結局最後にはwsgi3.3使ったら直ったよってことが。

調べてみるとwsgiのバージョンは2.8を使ってた。

shell> pkg_info -Ix wsgi
ap22-mod_wsgi-2.8_2 Python WSGI adapter module for Apache
shell> psearch wsgi

www/mod_wsgi              Python WSGI adapter module for Apache
www/mod_wsgi3             Python WSGI adapter module for Apache


どうやらバージョンデュアルツリー(っていう名前を今作った!)らしくて2系がstableで3系は実験的なのかな、両方存在してた。2系をアンインスコして3系を入れる。

shell> pkg_deinstall -f www/mod_wsgi
** No matching package found.
shell> portinstall –c www/mod_wsgi3

以上でちゃんといけたっぽい。めでたしめでたす。

でも早くなったかどうかは微妙、残念。

TeamSpeak3で起動時に自動的に接続するように設定する

TeamSpeak3(チームスピーク3。以下、TS3)で起動時に自動的に接続するように設定する。

Windowsでの操作を前提に進めていくけれど、Mac OS用のTS3でもほぼ同じように設定できる。

また日本語化はしておらず英語版でのメモメモ。日本語化してても問題ナッシング。

まずTS3のメインウィンドウを開いて、上のメニューバーにある左から二番目、”Bookmarks”を選ぶ。

その中にある”Add to Bookmaks”をクリック。

1

するとTS3のブックマーク管理画面が表示される。

TS3のブックマークというのは、世界中に数あるTeamSpeak3のサーバへのアクセスをブックマークとして保存しておき、好きなサーバへ接続する、というために使われる。

(でもぶっちゃけ、複数のTS3サーバを渡り歩いている人というのは限られるんじゃないかな。)

 

次に開いたブックマーク画面について。

2

今回はts.l2tp.orgのTeamSpeakのサーバをブックマークに追加したので項目として一つだけ、”みんなでつかってね~”というのが追加されてる。これで次回からts.l2tp.orgを利用する場合にはこのwindowを開いてクリックするとつなぐことができる。

で、今回のお題は自動接続。自動接続の設定を行うには画面左したにある”More”をクリックして詳細画面を表示してやる。

3

”More”をクリックして詳細画面を表示するとそのサーバに関するいろいろな設定が表示される。

主要なところだと表示名、使用するニックネーム、サーバのアドレス、サーバのパスワード、デフォルトでログインするチャンネル名。

で、”チームスピーク起動時に自動でサーバにログインする”ためには、詳細画面右下にある”Connect on Startup”にチェックを入れる。

コレでTS3起動時にこのサーバへ自動的に接続されるようになる。

 

また併せて使いたい便利機能としてデフォルトでログインするチャンネルも設定できる。「このサーバではこのチャンネルしか使ってないんだな~」というときには便利。

詳細画面真ん中にある”Default Channel”のところにチャンネル名を指定すればOK。パスワードが必要なチャンネルの場合にはその下にある”Channel Password”も設定が必要。ちなみに右側の緑色の丸い矢印をクリックすると現在居るチャンネルをデフォルトで入室するチャンネルに指定できる。便利便利。

 

最後は忘れずに”OK”を押して保存して閉じる。コレで完璧!