Source Dedicated Server (SRCDS)

Team Fortress 2 が play for free になったので、Ded鯖を立ててみることにしてみました。
Quake 系はガンガン立てていたけれど、Source 系はさっぱりだし良い機会ということで。

Dedicated Server

ここでは主に PC ゲームの専用サーバ、俗にいうゲームサーバを指します。
主に家庭用ゲーム機ではプレイヤーの一人がホストとなってマルチゲームを行いますが、PCゲームの大半ではマルチプレイ専用のサーバを別途用意することが多いです。

環境

FreeBSD-7.1 (amd64)
SRCDS は FreeBSD 向けのバイナリはありませんが、Linux エミュレーションで FreeBSD でも動作します。
今回は OS 依存の部分はあまりないので、Linux でも同じ手法でできるはずです。

また、あんまりスペックは要求されないですが、回線は光必須と考えたほうが無難です。
上り回線が細い ADSL や安定しない CATV は諦めてください。

FreeBSD での Linux エミュレーション

方法は割愛。ports から fc10 を使っています。

カーネルモジュールを確認します。

azusa# kldstat | grep linux
 7    1 0xffffffffb073f000 18a2c    linux.ko

linprocfs を mount します。

azusa# cat /etc/fstab | grep linprocfs
linprocfs               /compat/linux/proc linprocfs rw 0 0

SRCDS

FreeBSD ports でインストールします。

azusa# pwd
/usr/ports/games/linux-steam
azusa# make install clean
(ライセンスの確認を行って問題なければ yes)

ただし、SRCDS は ports を使う恩恵があまりないので直接ダウンロードしてもいいかもしれません。

azusa# wget http://steampowered.com/download/hldsupdatetool.bin

SRCDS 実行ユーザの作成

これがポイント。実行ユーザのホームディレクトリに .steam ディレクトリが必要です。
そこそこ大きいファイルがダウンロードされるため、root ではなく専用のユーザを作成したほうが無難です。
(データファイルの保存場所が設定できないっぽい?)

ユーザを作成します。FreeBSD の場合。Linux は useradd コマンドを使ってください。
(pw に -m オプション付けずに面倒くさいことをやっているのはskel経由で生成されるファイルが邪魔だからだけです)

azusa# mkdir /home/steam
azusa# pw useradd steam -d /home/steam
azusa# chown steam:stream /home/steam

steam ユーザにスイッチして初期設定を行います。
steam 側のサーバの機嫌が悪い時には数回行う必要があります。

azusa# su - steam
$ pwd
/usr/home/steam
$ mkdir .stream
$ ./steam
Checking bootstrapper version ...
Getting version 44 of Steam HLDS Update Tool
Downloading. . . . . . . . . . . .Steam Linux Client updated, please retry the command
CAsyncIOManager: 0 threads terminating.  0 reads, 0 writes, 0 deferrals.
CAsyncIOManager: 21 single object sleeps, 0 multi object sleeps
CAsyncIOManager: 0 single object alertable sleeps, 0 multi object alertable sleeps

Team Fortress 2 サーバの構築

サーバに必要なファイルをダウンロードします。
CDNに乗っていないせいか結構時間がかかりますので、風呂にでも入って身を清めておきましょう。

オプション の -game で対象のゲームを指定します。今回は tf です。

$ ./steam -command update -game tf -dir .
Checking bootstrapper version ...
Updating Installation
No installation record found at ./orangebox
No installation record found at ./orangebox
No installation record found at .
No installation record found at .
No installation record found at .
No installation record found at ./orangebox
Checking/Installing 'Team Fortress 2 Content' version 254

0.12%   downloading ./orangebox/tf/bin/server.dll
0.29%   downloading ./orangebox/tf/bin/server.dylib
(このあと延々と)

サーバの cfg をいじります。

% cd orangebox/tf/cfg
% vi server.cfg

Quake 系に近いので特に問題はないはずですが、マップを回すのは別ファイル (mapcycle.txt、maplist.txt)ぽい?
server cvar についてはググるとすぐ出てきます。

当たり前のことですが、テスト時には LAN モードにしてください。(sv_lan 1)

Team Fortress 2 サーバのテスト起動

コンソールから下記のコマンドで起動しみます。

azusa% orangebox/srcds_run -game tf +maxplayers 24 +map ctf_2fort

他のマシンで Team Fortress2 を起動して開発者コンソールから

connect <サーバの IP アドレス>

と実行してサーバに接続できるかを確認してください。

Team Fortress 2 サーバの起動

毎回コマンド打つのも面倒なので、起動用スクリプトを用意します。
FreeBSD なら $LOCALBASE/etc/rc.d あたりに設置します。
(Linux でも動くように依存した処理はいれていません)

azusa# cat tf2server.sh
#!/bin/sh

BASEDIR=/home/steam
USER=steam
CONSOLE_LOG=$BASEDIR/console.log
su "$USER" -c "exec $BASEDIR/orangebox/srcds_run -game tf +maxplayers 24 +map ctf_2fort > $CONSOLE_LOG  2>&1" &
exit

have fun :D