Linux用の専用ソースサーバーの構成、パート1

このガイドでは、Team Fortress 2ゲームを例として使用して、Linux用の複数の専用Steamゲームサーバーの同時操作をインストールおよび構成する方法について説明します。









はじめに



必要なもの:









以下はすべて、Linuxがインストールおよび構成されたコンソールアクセスのある物理サーバーまたは仮想サーバーに関連して説明されています。 すべての例で、サーバーのIPアドレスは192.0.2.0であり、クライアントコンピューターは198.51.100.0です。







ゲームサーバーは、起動して動作するためにルート権限を必要としないため、非特権ユーザーゲームの下からすべてをインストールして実行します。 rootになり、ユーザーを追加します。







# useradd --user-group --create-home --comment "Source dedicated server" game
      
      





スケジュールに従って多数のスクリプトを実行するため、ゲームユーザーがcrontabファイルを作成できるかどうかを確認します。







  # su - game $ crontab -e
      
      





エディターウィンドウが開く場合は、そうかもしれません。 画面に何かが表示される場合:







  cannot chdir(/var/spool/cron), bailing out. /var/spool/cron: Permission denied
      
      





できません。 次に、使用するcronプログラムとその設定に応じて、ユーザー(以前にゲームをルートに戻したユーザー)がcrontabファイルを作成できるようにします。







したがって、ユーザーが作成され、承認が構成されます。 ルートセッションを閉じ、ゲームのように動作し続けます。







SteamクライアントとTeam Fortress 2サーバーのインストール



複数のゲームサーバーの同時操作をインストールして構成するという目標は、さまざまな方法で達成できます。 最も単純なケースでは、それぞれ独自のディレクトリに個別のサーバーインスタンスを作成します。 これにより、ディスクスペースの非効率的な使用(ファイルシステムまたはデータウェアハウスが重複排除を使用しない場合)と同じ更新のダウンロードのためのトラフィック消費量が増加しますが、同じIPアドレスを使用する場合はすべてのゲームサーバーで使用する必要がありますが、サーバーを個別に構成、更新、管理できます異なるポート。 別の方法は、ゲームに単一のディレクトリを使用することですが、ゲームサーバーに個別の設定を使用します。 これが私たちが行く方法です。







64ビットのLinuxディストリビューションがある場合は、追加の互換性ライブラリをインストールする必要があります(rootユーザーの下から)。 steamcmd x64 YOUR_DISTRIBUTIVEというフレーズでグーグル検索されるのはどれですか 。 Ubuntu 13.10 x64の場合、たとえば、 apt-get install lib32gcc1



apt-get install lib32gcc1



場合-pacman pacman -S lib32-gcc-libs



(/etc/pacman.confでmultilibリポジトリが有効になっている)、CentOSの場合yum install glibc.i686 libstdc++.i686



およびなど。







それらがインストールされていない場合、フォームのエラーが発行されます:







  ./steamcmd.sh: line 29: /home/game/Steam/linux32/steamcmd: No such file or directory
      
      





どちらか







  ./steamcmd.sh: /home/game/Steam/linux32/steamcmd: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory
      
      





ゲームユーザーのホームディレクトリにある同じ名前のディレクトリにSteamクライアントをインストールし、tf2ディレクトリにゲーム自体をインストールします。 / etc / fstabでは、/ homeパーティションはnoexecなしでマウントされ、そこに十分な空き領域があると想定されています。







サーバー用のディレクトリを作成し、最初のディレクトリに移動します。







  $ mkdir ~/Steam $ mkdir ~/tf2 $ cd ~/Steam
      
      





Steamコンソールクライアントをダウンロードし、アーカイブを解凍します。







  $ wget http://media.steampowered.com/client/steamcmd_linux.tar.gz $ tar -xvzf steamcmd_linux.tar.gz
      
      





明確にするために、次のsteamcmd.shの起動を2つに分割します。 まず、自己更新手順を実行します。







  $ ./steamcmd.sh +quit
      
      





Steamクライアントをアップグレードする必要があります。 問題がある場合は、〜/ Steam / logsのログを読んでください。







次に、専用のゲームサーバーをインストールします。







  $ ./steamcmd.sh +login anonymous +force_install_dir ~/tf2/ +app_update 232250 validate +quit
      
      





コマンドラインパラメーターの「232250」という数字は、アプリケーションの識別子であるappidです。この例では、Team Fortress 2専用サーバーです。 コマンドについては、「サーバーの更新」セクションで詳しく説明します。







すべてが問題なければ、ダウンロードは元気に始まります:







  Redirecting stderr to '/home/game/Steam/logs/stderr.txt' ... Connecting anonymously to Steam Public...Logged in OK Waiting for license info...OK Update state (0x3) reconfiguring, progress: 0.00 (0 / 0) Update state (0x11) preallocating, progress: 8.28 (561715882 / 6785978023) Update state (0x61) downloading, progress: 0.20 (13671159 / 6785978023) Update state (0x61) downloading, progress: 0.70 (47497460 / 6785978023) ... Update state (0x61) downloading, progress: 99.96 (6783415033 / 6785978023) Update state (0x81) committing, progress: 7.66 (519615292 / 6785978023) Success! App '232250' fully installed.
      
      





数分後、Team Fortress 2に6ギガバイトの容量が割り当てられます(2016年10月現在)。







〜/ tf2フォルダーに移動し、ゲームを手動で開始してみてください。







  $ cd ~/tf2 $ ./srcds_run -game tf +map cp_cloak
      
      





次のようなものがコンソールに表示されるはずです。







  Auto detecting CPU Using default binary: ./srcds_linux Server will auto-restart if there is a crash. WARNING: Failed to load 32-bit libtinfo.so.5 or libncurses.so.5. Please install (lib32tinfo5 / ncurses-libs.i686 / equivalent) to enable readline. Using Breakpad minidump system. Version: 3475087 AppID: 232250 Setting breakpad minidump AppID = 232250 Using breakpad crash handler Loaded 7510 VPK file hashes from /home/game/tf2/tf/tf2_textures.vpk for pure server operation. ... Network: IP 192.0.2.0, mode MP, dedicated Yes, ports 27015 SV / 27005 CL Initializing Steam libraries for secure Internet server ... Connection to Steam servers successful. Public IP is 192.0.2.0. Assigned anonymous gameserver Steam ID [A:1:1724597452:5521]. VAC secure mode is activated. Received 3825164 bytes item schema version DBDD1115 direct data; update is queued.
      
      





ncurses-libs.i686ライブラリをインストールすることにより、リクエストを尊重できます。 そうでなければ、すべてがうまくいきます。 行13(ネットワーク:...)および17(パブリックIP ...)で、サーバーが正しいIPを選択していることを確認してください。







「/home/game/.steam/sdk32/steamclient.so:共有オブジェクトファイルを開けません:そのようなファイルまたはディレクトリはありません」に関するエラーには注意を払いません。これは正常です。 ただし、修正することができます。







  $ mkdir -p ~/.steam/sdk32 $ ln -s ~/Steam/linux32/steamclient.so ~/.steam/sdk32
      
      





コンピューターでTeam Fortress 2を起動し、コンソール( ~



)を呼び出し、 connect 192.0.2.0:27015



:27015にconnect 192.0.2.0:27015



(またはすぐにスチーム://connect/192.0.2.0:27015-デスクトップにショートカットを作成できます)。 ゲームサーバーへの接続を開始し、サーバーコンソールにこの時点で行が表示されました







  Client "Ich" connected (198.51.100.0:42380).
      
      





接続に成功しなかった場合、サーバーが正しいインターフェイスでリッスンしているかどうかを確認します。 ファイアウォールがある場合、必要なポートが開いているかどうかをValveのマニュアルに従って確認します 。 より複雑なネットワーク構成(NAT用のサーバーなど)の場合は、対応するマニュアルを参照してください。







quit



コマンドを使用してゲームサーバーを停止し、コンソールに入力して、コマンドラインに戻り、構成を開始します。







基本的なサーバー設定



理論



歴史的に、長年の開発の間に、サーバーを構成するためのさまざまな可能性がありました。







デフォルトでは、サーバーは〜/ tf2 / tf / cfg /で検索するいくつかのメイン設定ファイルを使用します。autoexec.cfg-サーバーの起動時に1回実行されます。server.cfg-任意のカードの開始時に、<card_name> .cfg-対応する開始時にカード。







また、サーバーの起動時に、コマンドラインで+servercfgfile my.cfg



パラメーターを指定できます。この場合、サーバーはserver.cfgではなくmy.cfg、および+exec file1.cfg +exec file2.cfg +exec file3.cfg



形式のいくつかのパラメーターを使用しなくなります。 +exec file1.cfg +exec file2.cfg +exec file3.cfg



これらのファイルは、autoexec.cfgの直後にサーバーの起動時に1回実行されます。







さらに、メインディレクトリをチェックする前でも、サーバーは起動時に〜/ tf2 / tf /カスタムファイルを検索します。拡張子は.vpkで、ディレクトリ構造はmy_dir / cfg /、my_dir / maps /、my_dir / materials /などとそこにあるファイルです。同じ名前の標準の代わりに使用します。







しかし、それだけではありません。 2013年5月14日のTeam Fortress 2更新で 、新しいコマンドラインパラメーター-insert_search_path



。 カスタムディレクトリ構造(カスタム/に類似)を追加しますが、絶対パスを指定する機能があります。つまり、サーバーディレクトリ〜/ tf2 / tf /内にある必要はありません。 以前は、これを工夫する必要がありましたが、srcds_runコマンドラインで-insert_search_path / var / dir1を指定するだけで十分であり、このディレクトリを検索パス(/ var / dir1 / maps、/ var / dir1 / cfg、...)として使用しますcustom /および構成ファイルを含むメインディレクトリ〜/ tf2 / tf / cfg /。 -insert_search_pathでコンマを使用して複数のディレクトリを指定できます。 さらに、ディレクトリはアルファベット順に処理されるカスタム/のディレクトリ構造とは対照的に、リストされている順に処理されます。







つまり、異なるディレクトリに複数のserver.cfgファイルがある場合:







  ~/tf2/tf/cfg/server.cfg ~/tf2/tf/custom/my_files/cfg/server.cfg ~/tf2/tf/custom/another/cfg/server.cfg /var/dir1/cfg/server.cfg
      
      





また、サーバーのコマンドラインで-insert_search_path /var/dir1



を指定します。その後、サーバーを起動し、コンソールとexec server.cfg



形式のスクリプトを実行すると、このファイルは最初に/ var / dir1 / cfgで、次にcustom / anotherで検索されます/ cfg /、次にcustom / my_files / cfg /(custom /のディレクトリはアルファベット順にソートされます)、最後に基本的にcfg /になります。 これはserver.cfgだけでなく、motd.txt、マップなどにも適用されます。検索パスの詳細(および設定の選択)は〜/ tf2 / tf / gameinfo.txtで確認できます。ここでは説明していませんが、多くの興味深いことから、システム言語から。







検索パスの検索順序は非常に簡単です-実行中のサーバーのコンソールでpath



コマンドを入力するだけです:







  path --------------- Paths: "maps/cp_cloak.bsp" "GAME" (map) "/home/game/tf2/bin/" "EXECUTABLE_PATH" "/home/game/tf2/" "BASE_PATH" "/var/dir1/" "GAME" "/var/dir1/" "MOD" "/home/game/tf2/tf/custom/another/" "GAME" "/home/game/tf2/tf/custom/another/" "MOD" "/home/game/tf2/tf/custom/my_files/" "GAME" "/home/game/tf2/tf/custom/my_files/" "MOD"   , , 
      
      





また、<map name> .cfgという形式の設定ファイルも忘れないでください。 さらに、replay.cfg、sourcemod.cfg、mmmなどもあります。







このような動物園では、サーバーの個々の構成をセットアップするときに、さまざまな方法で自分自身を撃つことができます。 また、srcdsは動的に開発される若いサーバーであるため、「なぜSUDDENプレーヤーはユーザーカードのダウンロードを停止したのですか。ダウンロードはもちろん、高速でも... 2年間は問題ありませんでした」という質問に対する答えを探して、 ...」







提案されている豊富な選択肢の中から、スタートアップパラメータで+ execおよび+ servercfgfileの構成ファイルを指定することに焦点を当てます。







〜/ tf2のインストール中にインストールされる完全なファイルは、〜/ tf2 / tf / cfgのファイルを含め、次のサーバーの更新中に変更できることに注意してください。 したがって、既存の構成ファイルを直接使用するのではなく、独自の構成ファイルを作成します。







つまり、たとえば+mapcyclefile mapcycle_quickplay_cp.txt



ように、ローテーション用のマップのリストを含む既存の完全なファイルを使用する代わりに、たとえそれが完全に私たちに合っていたとしても、それをmapcycle.txtにコピーして接続します。







私たちが変更または削除した完全なファイル(設定だけでなく、すべて)は、「検証」パラメーターでゲームサーバーの更新を開始することで元の状態に戻すことができますsteamcmd.sh +login anonymous +force_install_dir ~/tf2/ +app_update 232250 validate +quit



。 その後、そのような新しい更新がない場合でも、すべての完全なファイルのチェックサムがチェックされ、不一致がある場合、変更されたファイルが再度ダウンロードされます。


練習する



この例では、2つのゲームサーバーを構成します。









サーバー設定ファイルを保存するディレクトリを作成します。 同時に、ログ用のディレクトリを作成します。 現時点では、すでにSteamクライアントのログがありますので、すぐにリンクを作成してください:







  $ mkdir ~/cfg $ mkdir ~/log $ ln -s ~/Steam/logs ~/log/steam
      
      





可能であれば、すべての設定ファイルを〜/ cfgに作成し、適切なサーバーディレクトリにシンボリックリンクを配置します。 このような配置により、サーバーのバックアップと復元の手順が大幅に簡素化され、さまざまなサーバーの設定の混合が削減されますが、これを完全に回避することはできません。







設定は条件付きで3つのカテゴリにグループ化できます。







  1. サーバーの起動コマンドラインでのみ指定する必要があるパラメーター。 例-値が2のmaxplayersおよびsv_pure
  2. マップをロードする前に指定する必要があるパラメーターは、autoexec.cfg、またはコマンドラインのプラグイン+ exec file.cfgにあります。 例は、mapcyclefile、motdfile、tv_enable、はい、それらの多くです
  3. server.cfgおよびその他のファイルで指定できる他のすべて。


ただし、最大長の制限のため、またはセキュリティ上の理由のために、サーバーのコマンドラインで多くを指定しません。適切に締め付けられたナットがない場合、シェルアクセスを持つLinuxサーバー上の他のユーザーは互いのプロセスとコマンドラインを表示できます- cat /proc/<id>/cmdline



rcon_password、tf_server identity <...>、sv_setsteamaccount、sv_passwordなど)のような重要なパラメーターを使用します。







したがって、最初に、5つのファイルのみを設定に使用します。autoexec.cfgファイル内の両方のサーバーの一般設定、最初のサーバーの個々の設定はautoexec1.cfgおよびserver1.cfg、autoexec2.cfgおよびserver2.cfgの2番目のファイルです。 個々の設定を2つのファイルに分けることの適切性は、上記のパラメーターを3つのカテゴリーに分割し、カードが変更されるたびに実行されるファイル(server.cfgなど)を使用する必要性によって決まります-個々のマップ設定ファイルで変更されたパラメーターを復元するか、コンソールで手動で、cronまたは別の方法で。 結局のところ、autoexec.cfgなどのファイルは、ゲームサーバーの起動時にのみ実行されます。







3つの非常に便利なコマンドに言及するしかありません。 最初のecho "- , "



です。 各構成ファイルの先頭で使用すると、非自明なサーバーの動作を分析する場合に、さまざまなファイルの実行シーケンスを視覚的に確認できます。 2番目はdifferences



。サーバーコンソールに入力すると、値がデフォルト値と異なるすべての変数が表示されます。 「なぜすべてが間違っているのか?すべてがいつものように見える...」という質問に対する答えを見つけやすくなります。 3番目exec <config>



-ある構成ファイルを別の構成ファイルから呼び出すことができます。 思慮深いセットアップと、ファイルをcronで置き換える機能と組み合わせて、スクリプトからファイルを実行する機能と組み合わせて(tmux send-keysを使用-「サーバーの更新」セクションのupdate.shスクリプトの例を参照)、ゲームサーバーを生きた生物に変えることができます自分の人生。

ゲームサーバーの内部構成の詳細な設定についてはここでは説明しません。各サーバーには独自の設定があり、2台のサーバーの同時操作に関連する瞬間についてのみ説明します。







単一のサーバー用の既製の設定ファイルが既にある場合は、それらを使用して開始できます。そうでない場合(わからない-初めてのゲームサーバー)、 tf2の設定server.cfgをグーグルで検索できます。 私がアドバイスできる唯一のことは、10年前の誰かの最も洗練された構成ファイルを探すことではありません。これは、廃止されたパラメーターを含む、可能な限りすべてをリストします。そのほとんどは、cvarlistからのデフォルト値と説明です最大限に文書化された説明、これは簡単ではないかもしれませんが、はい。







一般に、server.cfgを用意せずに起動する方が良い-ゲームサーバーはそれなしでも正常に起動しますが、これは既に確認しましたが、何かを変更する場合-ラウンドの数と期間、チームの自動バランスなど-すでに認識していますこれを制御するパラメーターを処方します。







「all-all-all」サーバーのパブリックコマンドと変数を引き続き知りたい場合は、実行中のサーバーのコンソールで次のように入力します。







  cvarlist log allcvars.txt cvar list -------------- _resetgamestats : cmd : : Erases current game stats and writes out a blank stats file _restart : cmd : : Shutdown and restart the engine. ... -------------- 1908 total convars/concommands
      
      





〜/ tf2 / tf / allcvars.txtはすべてのコンソール変数をリストします。 cvarlist tf_



cvarlist sv_



など、特定のプレフィックスを持つコマンドのみを表示できます。 substring- find log



。 この場合、検索は名前と説明の両方で実行されます。







そのため、構成ファイルを作成します。







多くのチームが互いに依存し合っていることを念頭に置く必要があり、場合によってはその順序が重要です。 したがって、たとえば、最初にファイルへのログ記録を有効にし(ログオン)、次にどのディレクトリ(sv_logsdir)およびどの名前(sv_logfilename_format)をポイントし始めると、結果は期待を満たしません。

ファイル〜/ cfg / autoexec.cfg-最初に実行され、両方のサーバーに共通の設定を規定します:







autoexec.cfg
 //     echo "*** ~/cfg/autoexec.cfg (global)" //    ,     exec banned_user.cfg exec banned_ip.cfg writeid writeip // ,    // -1 - , 0 -  , 1 -  , 2 -  , 3 - , // 4 - , 5 - , 6 -  , 7 -  sv_region 3 //   //        (1), //        (0) sv_log_onefile 0 //      sv_logbans 1 //     ,   ,   UDP. //      sv_logfile 1 //     sv_logecho 0 //    (log on)      //   -     (sv_logsdir)
      
      





ログ管理コマンドについては、「ログ」セクションで詳しく説明します。

(今のところ)空のbanned_user.cfgおよびbanned_ip.cfgファイルを作成します







  $ touch ~/cfg/banned_user.cfg ~/cfg/banned_ip.cfg
      
      





ファイル〜/ cfg / autoexec1.cfgに、最初のサーバーの設定を書き込みます。







autoexec1.cfg
 //     echo "*** ~/cfg/autoexec1.cfg" //  ,          hostname Public Server No 1 //    . //        rcon_password rconPasswordServer1 //  .       //     .    map cp_granary // sv_allow_point_servercommand //   message of the day motdfile motd1.html motdfile_text motd1.txt //       mapcyclefile mapcycle1.txt //      sv_logsdir /home/game/log/server1 //    log on
      
      





motdおよびmapcyclefileファイルについては、以下で説明します。 サーバーは、ログ自体のディレクトリを作成します。







2番目のサーバーには、標準のTeam Fortress 2ディストリビューションに含まれていないcp_orange_x3カードをインストールします。カスタムマップをインストールする最も簡単な方法は、マップファイルを〜/ tf2 / tf / mapsまたは検索パスの1つのディレクトリに置くことです ただし、サードパーティ製のカードを接続する方法はまだあります。 そのようなマップがSteamワークショップで表示される場合、mapコマンドとmapcycleファイルの両方で、「workshop /」または「workshop / <map name> .ugc」と呼ぶことができます。 次に、ゲームが開始されると、サーバーがValveサーバーからゲームをダウンロードし、プレーヤーが接続すると、コンピューターがそこからマップをダウンロードします。 カードが変更されるたびに、更新が確認されます。 Steamワークショップからのみ非標準マップを使用する場合、高速ダウンロードを有効にする必要はなくなります。 しかし、コインの裏側は、Workshopサーバーへの依存もあるということです。





したがって、Steam Workshopブラウザーで上記のリンクを開き、検索バーに「cp_orange_x3」と入力し、検索結果のマップページに移動します-https://steamcommunity.com/sharedfiles/filedetails/?id=454299390 このURLから数値IDを取得し、autoexec2.cfgで「workshop / 454299390」または「workshop / cp_orange_x3.ugc454299390」の形式で書き込みます。 2番目のオプションはより明確です。







ファイル〜/ cfg / autoexec2.cfgに、2番目のサーバーの設定を書き込みます。







autoexec2.cfg
 echo "*** ~/cfg/autoexec2.cfg" hostname Private Server No 2 rcon_password rconPasswordServer2 //map workshop/454299390 map workshop/cp_orange_x3.ugc454299390 sv_allow_point_servercommand always motdfile "motd2.txt" mapcyclefile "mapcycle2.txt" sv_logsdir /home/game/log/server2 log on
      
      





もう一つの小さなポイント。 各カードに対して、サテライトファイル<カード名> .cfgを作成できます。これは、server.cfgの実行直後に、このカードの起動時にサーバーによって実行されるコマンド用です。 標準カードの場合、ファイルは〜/ tf2 / tf / cfgに配置する必要があります。 Steam Workshop, "< >.ugc.cfg" ~/tf2/tf/cfg/workshop. , , Steam Workshop. cp_orange_x3, id 454299390, ~/tf2/tf/cfg/workshop/cp_orange_x3.ugc454299390.cfg





sv_allow_point_servercommand, "official" — Allowed for valve maps only. "always" autoexec2.cfg







- Steam Workshop, tf_workshop_map_sync <id >



. — changelevel wohrkshop/<id>



. tf_workshop_map_status



, ~/tf2/steamapps/workshop{1,2}/appworkshop_440.acf.

~/cfg/server1.cfg , :







server1.cfg
 //     echo "*** ~/cfg/server1.cfg" // ***       //   ,        UDP    HLstatsX //        //    127.0.0.1 (!) //  "log on"  -   (    autoexec1.cfg) logaddress_delall logaddress_add 192.0.2.0:27500 //      (1 - , 0 - ) sv_cheats 0
      
      





- HLstatsX ( — , ) logaddress_delall



< >.cfg, - , logaddress_add server1.cfg . logaddress_delall logaddress_add "logaddress_add: 192.0.2.0:27500 is already in the list"







, sv_cheats "0" — , - ( , ) "1".







~/cfg/server2.cfg :







server2.cfg
 echo "*** ~/cfg/server2.cfg" //   -      27500,   - 27501 !!! logaddress_delall logaddress_add 192.0.2.0:27501 sv_cheats 0 tf_bot_quota 0
      
      





. , Control Point, mapcycle_quickplay_cp.txt, .







  $ cp ~/tf2/tf/cfg/mapcycle_quickplay_cp.txt ~/cfg/mapcycle1.txt $ dos2unix ~/cfg/mapcycle1.txt $ chmod 664 ~/cfg/mapcycle1.txt
      
      





, ~/cfg/mapcycle1.txt :







mapcycle1.txt
 cp_5gorge cp_badlands cp_coldfront cp_fastlane cp_freight_final1 cp_granary cp_well cp_yukon_final cp_foundry cp_gullywash_final1 cp_process_final cp_standin_final cp_snakewater_final1 cp_powerhouse cp_vanguard cp_sunshine cp_metalworks
      
      





~/cfg/mapcycle2.txt . cp_orange_x3 , autoexec2.cfg — "workshop/454299390", "workshop/cp_orange_x3.ugc454299390":







mapcycle2.txt
 //  cp_orange_x3  https://steamcommunity.com/sharedfiles/filedetails/?id=454299390 workshop/cp_orange_x3.ugc454299390
      
      





. , html , url. - 1-2 .







~/cfg/motd1.html :







motd1.html
 <html> <head> <title>Message of the day</title> </head> <body> <h1>Welcome to our server!</h1> </body> </html>
      
      





~/cfg/motd1.txt , html motd (cl_disablehtmlmotd 1):







motd1.txt
 Welcome! Have fun and be safe
      
      





~/cfg/motd2.txt url, motd :







motd2.txt
 http://m.forum.example.org/news.html
      
      





url motdfile. motdfile_text, url .







MOTD — from Jimo , .







, , cfg :







  $ ln -s -v ~/cfg/* ~/tf2/tf/cfg/
      
      





ネットワーク設定



( ), netstat -lpn | grep srcds



, :







  tcp 0 0 192.0.2.0:27015 0.0.0.0:* LISTEN 3456/./srcds_linux udp 0 0 192.0.2.0:27005 0.0.0.0:* 3456/./srcds_linux udp 0 0 192.0.2.0:27015 0.0.0.0:* 3456/./srcds_linux udp 0 0 192.0.2.0:27020 0.0.0.0:* 3456/./srcds_linux udp 0 0 192.0.2.0:26901 0.0.0.0:* 3456/./srcds_linux
      
      





. srcds:







UDP/27005





+clientport



— Game client port







UDP/27015





-port



— The port the server advertises to clients







TCP/27015





, RCON, -port



, TCP. ssh ( — ), TCP ( UDP!) , . , . .







UDP/27020





-tv_port



— SourceTV port ( "SourceTV")







UDP/26901





-steamport



— Steam/VAC connection port







, , , "-port 27015 -steamport 26900 +clientport 27005 +tv_port 27020". 26900 — , .







. , , (27015 -> 27017 -> 27019 ). . .







"-port 27016 -steamport 26901 +clientport 27006 +tv_port 27021".







, , , . , , :







  WARNING: Port 27015 was unavailable - bound to port 27016 instead WARNING: Port 27005 was unavailable - bound to port 27006 instead WARNING: Port 27020 was unavailable - bound to port 27021 instead Network: IP 192.0.2.0, mode MP, dedicated Yes, ports 27016 SV / 27006 CL
      
      





. , -strictportbind



( ).







, , "-port 50000 +clientport 50001 +tv_port 50002 -steamport 50003", ISteamApps/GetServersAtAddress . .









-:







  1. Steam — ~/Steam/steamcmd.sh, linux32/steamcmd. ;
  2. , — ~/tf2/srcds_run, srcds_linux, .


, / , — ~/start1.sh ~/start2.sh. . , ~/start1.sh:







start1.sh
 #!/bin/sh # #   . #     ,    srcds_run GAMEFOLDER=/home/game/tf2 CMDLINE="-port 27015 -steamport 26900 +clientport 27005 +tv_port 27020 -strictportbind \ +sv_pure 2 -game tf +maxplayers 24 \ -pidfile ${GAMEFOLDER}/tf/srcds1.pid \ -ugcpath ${GAMEFOLDER}/steamapps/workshop1 \ +exec autoexec1.cfg +servercfgfile server1.cfg" #    ${GAMEFOLDER}/srcds_run ${CMDLINE}
      
      





( "-") ( "+"):







-port





. — 27015. , ,







-steamport





VAC (Valve Anti-Cheat). . 26900, 26901







+clientport











+tv_port





SourceTV. , +tv_port -nohltv







-strictportbind





, , "ERROR: Port 27015 was unavailable — quitting due to "-strictportbind" command-line flag!". .







-ip





ip , . - , 0.0.0.0 — . , , ip







-game





. — "tf" — Team Fortress 2.







+maxplayers





. . — 24, 32. Mann vs. Machine 32







-pidfile





PID .







-ugcpath





Steam Workshop. — ~/tf2/steamapps/workshop. , ~/tf2/tf. , workshop , .







+sv_pure





— , ( , , ). -1, 0, 1, 2. sv_pure 0 , , ( , ), , , . pure_server_full.txt, pure_server_minimal.txt pure_server_whitelist_example.txt ~/tf2/tf/cfg/. — sv_pure 2



, srcds_run, , .vpk .







+exec





, autoexec.cfg. .







+servercfgfile





, server.cfg — ,







+map





( ). , autoexec.cfg ( server.cfg !). , . . , autoexec.cfg







Valve Developer Community wiki







~/start2.sh, CMDLINE ( ), .







start2.sh
 #!/bin/sh #   . GAMEFOLDER=/home/game/tf2 CMDLINE="-port 27016 -steamport 26901 +clientport 27006 +tv_port 27021 -strictportbind \ +sv_pure 2 -game tf +maxplayers 24 \ -pidfile ${GAMEFOLDER}/tf/srcds2.pid \ -ugcpath ${GAMEFOLDER}/steamapps/workshop2 \ +exec autoexec2.cfg +servercfgfile server2.cfg" #    ${GAMEFOLDER}/srcds_run ${CMDLINE}
      
      











  $ chmod u+x ~/start{1,2}.sh
      
      





(- game, root !), -. :







  ... *** ~/cfg/autoexec.cfg (global) Writing cfg/banned_user.cfg. Writing cfg/banned_ip.cfg. -------------------------------------------------------- sv_pure set to 2. -------------------------------------------------------- maxplayers set to 24 *** ~/cfg/autoexec1.cfg Server logging enabled. Server logging data to file /home/game/log/server1/L1007000.log ... Executing dedicated server config file server1.cfg Using map cycle file 'cfg/mapcycle1.txt'. Set motd from file 'cfg/motd1.html' Set motd_text from file 'cfg/motd1.txt' Connection to game coordinator established. tf_server_identity_account_id not set; not logging into registered account *** ~/cfg/server1.cfg logaddress_delall: no addresses in the list logaddress_add: 192.0.2.0:27500 'cp_granary.cfg' not present; not executing. Connection to Steam servers successful. ...
      
      





, , . . , L1007000.log, l1007000.log. — Linux ! , — . . — .







, , .







  ... *** ~/cfg/autoexec2.cfg ... [TF Workshop] Waiting for steam connection [TF Workshop] Preparing map ID 454299390 [TF Workshop] Map ID 454299390 isn't tracked, adding ... [TF Workshop] New version available for map, download queued [ workshop/cp_orange_x3.ugc454299390 ] ... [TF Workshop] Installed subscribed map [ workshop/cp_orange_x3.ugc454299390 ] [TF Workshop] Successfully prepared client map from workshop [ workshop/cp_orange_x3.ugc454299390 ] ... 'workshop/cp_orange_x3.ugc454299390.cfg' not present; not executing. ...
      
      





, . Steam Workshop ~/tf2/steamapps/workshop2, ~/tf2/steamapps/workshop2/content/440/454299390/cp_orange_x3.bsp. , "[ workshop/cp_orange_x3.ugc454299390 ]" — , . , autoexec2.cfg







Team Fortress 2, "Find a game" — "Community servers" — "" — "" — ip "192.0.2.0" — " " — . :-). .







, - Valve Web API, ip http://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr=192.0.2.0 — source , Team Fortress 2







(quit, Ctrl+C), .







, srcds_run, , quit



, "Sat Jun 18 10:28:33 VOST 2016: Server restart in 10 seconds", Ctrl+C. , — 8 . - .




, , , , .







Valve , , :







,     ,







— , — () . — Valve https://list.valvesoftware.com/cgi-bin/mailman/listinfo/hlds_linux . , "Optional TF2 update released" — . "Mandatory Team Fortress 2 update released" — . . , , — hlds_linux.







.









— :







start1.sh
 CMDLINE="... -autoupdate -steam_dir /home/game/Steam -steamcmd_script /home/game/cfg/tf2_update \ ...
      
      





-autoupdate





.







-steam_dir





steam.sh steamcmd.sh







-steamcmd_script





, "-steam_dir",







, () ./srcds_run +runscript ~/cfg/tf2_update



~/cfg tf2_update — . , .







tf2_update
 @ShutdownOnFailedCommand 0 @NoPromptForPassword 1 login anonymous force_install_dir /home/game/tf2/ app_update 232250 quit
      
      





:







@ShutdownOnFailedCommand





Valve "0" .







@NoPromptForPassword





, "1", Steam , login. , .







login <username> [<password>] [<Steam guard ode>]





Steam. , "ERROR! Failed to request AppInfo update, not online or not logged in to Steam." "anonymous" — . , , . Dedicated Servers List . , , steam guard, , set_steam_guard_code.







set_steam_guard_code <ode>





steam guard. .







force_install_dir





./SteamApps/common/< >. , . app_update.







app_update <appid> [-validate] [-language <lang>] [-beta <betaname>] [-betapassword <pwd>]





( ), . appid. validate — , , . , " ..." Steam, , . , , , , .







app_set_config <appid> <key> <value>





.







Steam , steamcmd.sh . help



, find <>



.







- Steam , .







:







  ^CMasterRequestRestart Your server will be restarted on map change. Your server will be restarted on map change. Your server needs to be restarted in order to receive the latest update. Your server needs to be restarted in order to receive the latest update.
      
      





:







  L 07/08/2016 - 05:07:17: Your server will be restarted on map change. L 07/08/2016 - 05:07:17: Your server needs to be restarted in order to receive the latest update.
      
      





, ~/cfg/tf2_update , , . .













, , .







. , , . , ( mp_maxrounds, = 0), (mp_winlimit = 0), (mp_fraglimit = 0), (mp_timelimit = 0), , , , . , - , .







.









— cron steamcmd.sh (, "-"), .







, ~/Steam/steamcmd.sh +runscript ~/cfg/tf2_update



, steamcmd.sh :







  ... Connecting anonymously to Steam Public...Logged in OK Waiting for license info...OK Success! App '232250' already up to date.
      
      





, :







  ... Update state (0x61) downloading, progress: 99.63 (3616706682 / 3630011517) Update state (0x81) committing, progress: 100.00 (606937472 / 606937472) Success! App '232250' fully installed.
      
      





"fully installed" . . ~/update.sh:







update.sh
 #!/bin/sh ~/Steam/steamcmd.sh +login anonymous +force_install_dir /home/game/tf2/ +app_update 232250 +quit > ~/steamcmd.log if grep --quiet "fully installed" ~/steamcmd.log; then # kill `cat /home/game/tf2/tf/srcds1.pid` # ~/start1.sh & # kill `cat /home/game/tf2/tf/srcds2.pid` # ~/start2.sh & fi rm -f ~/steamcmd.log
      
      





, , steamcmd.sh — "+login anonymous +force_install_dir ~/tf2/ +app_update 232250 +quit", tf2_update — "+runscript ~/cfg/tf2_update"







, . , " ", tmux sudo, , . :







update.sh (v2)
 #!/bin/sh ~/Steam/steamcmd.sh +login anonymous +force_install_dir /home/game/tf2/ +app_update 232250 +quit > ~/steamcmd.log if grep --quiet "fully installed" ~/steamcmd.log; then echo "Update installed" tmux -L socket1 send-keys "say New update installed. Server will be restarted in 10 seconds. Please join us after a minute" Enter tmux -L socket2 send-keys "say New update installed. Server will be restarted in 10 seconds. Please join us after a minute" Enter sleep 10s sudo /usr/bin/systemctl reload srcds1.service sudo /usr/bin/systemctl reload srcds2.service else echo "Update not found" fi rm -f ~/steamcmd.log
      
      





"say", SourceMod .







crontab , :







  $ chmod 744 ~/update.sh $ crontab -e
      
      





:







crontab
 */30 * * * * ~/update.sh
      
      





cron , game ""









, .







Valve Steam Web API . ISteamApps/UpToDateCheck, , Team Fortress 2 — http://api.steampowered.com/ISteamApps/UpToDateCheck/v1?appid=440&version=3528598 , version ( - ). appid = 232250 (, , ), "Couldn't get app info for the app specified.". ああ。







, , Team Fortress 2 dedicated server — https://api.steampowered.com/IGCVersion_440/GetServerVersion/v1?format=json . - :







  { "result": { "success": true, "deploy_version": 3531256, "active_version": 3531256, "min_allowed_version": 3528598 } }
      
      





— json, xml, vdf. — Valve Data Format , Valve, json . — items_game.txt, , .acf, .vdf .







, deploy_version active_version Valve , , . , , api.







version



, ~/tf2/tf/steam.inf







, , Web API, , . - :







update.sh (v3)
 #!/bin/sh wget -q --no-check-certificate "https://api.steampowered.com/IGCVersion_440/GetServerVersion/v1?format=json" -O=~/GameVersion.json VERSION_DEPLOYED=`grep deploy_version ~/GameVersion.json | sed -s 's/[^[:digit:]]//g'` VERSION_INSTALLED=`grep ServerVersion ~/tf2/tf/steam.inf | sed -s 's/[^[:digit:]]//g'` if [[ $VERSION_DEPLOYED -gt $VERSION_INSTALLED ]]; then echo "New update is ready, $VERSION_DEPLOYED vs $VERSION_INSTALLED" # -  fi
      
      





, crontab.







, . , Steam Web API, ~/tf2/steamapps/appmanifest_232250.acf, "buildid". — steamcmd.sh +login anonymous +app_info_update 1 +app_info_print 232250 +quit



, "buildid" depots -> branches -> public ( app_info_print , , app_info_update 1. rm -f ~/Steam/appcache/appinfo.vdf). grep, cut, tr , , json ( sed + tr) .







" ".













All Articles