Linux下架设CSGO社区服务器以及性能优化

Mai Ooizumi
Mai Ooizumi 5月6日
  • 在其它设备中阅读本文章

免责声明

  1. 对于本教程造成的硬件或软件损坏,我概不负责。你做任何事情都需要自担风险。不正确的操作会导致系统不稳定,并且可能无法引导进系统。本教程适用于 Linux 初级以上用户,如果你是一个 Linux 初学者,建议您使用虚拟机(Virtualbox/VMWare/Hyper-V)。我建议先备份你的数据,然后再继续本教程。
  2. 本教程不保证性能一定有提升。因为我们不可能是完全相同的的软硬件。
  3. 本文以 Ubuntu 20.04 LTS 为例,不一定适用于其他 Linux 发行版。

准备工作

首先强烈不建议使用 root 用户运行服务端,会带来潜在的安全问题。
创建一个用户 这里用户名以steam为例:

adduser steam

接下来系统会提示你输入 两次 密码 和可以直接按回车跳过的一些信息(姓名啊之类)。
还可以把这个用户添加进 sudoers 中(可以使用sudo命令)

sudo usermod -G sudo steam

或者直接编辑sudoers文件

sudo vim /etc/sudoers

# User privilege specification下面加上刚刚新建立的用户:
按 I 键进入编辑模式 然后另起一行照抄 root 用户的就可以 完成之后按 esc 键然后键盘输入

:wq!

这个命令是强制写入并退出
putty_20200506174111030.png

然后就可以切换到新建的用户了:

su - steam

搭建依赖环境

第一步当然是:

sudo apt update && sudo apt upgrade -y && sudo apt --purge autoremove

检查是否有软件包的更新并且安装以及移除旧版本的软件包

性能优化 #1

CSGO 服务端需要足够的 CPU 性能,为了榨干 CPU 性能,我们来安装并且配置tuned

sudo apt install tuned

安装完成之后需要进行配置, 这里选择了效果好的低延迟性能模式:

sudo tuned-adm profile latency-performance

配置完成即可启动:

sudo tuned-adm active

以及开启睿频

echo 0 | sudo tee /sys/devices/system/cpu/intel_pstate/no_turbo

并锁定 CPU 频率

sudo apt install cpufrequtils
vim cpu.sh

创建一个cpu.sh并写入以下内容:

#!/bin/bash

cpufreq-set --cpu 0 --governor performance
cpufreq-set --cpu 1 --governor performance
cpufreq-set --cpu 2 --governor performance
cpufreq-set --cpu 3 --governor performance
cpufreq-set --cpu 4 --governor performance
cpufreq-set --cpu 5 --governor performance
cpufreq-set --cpu 6 --governor performance
cpufreq-set --cpu 7 --governor performance

cpufreq-set -u X.XXGHz
cpufreq-set -d X.XXGHz

cpufreq-set -r -g performance 

需要自行修改X.XXGHz为你需要的频率 --cpu 0--cpu 7是核心数量 按需求自己更改。

chmod +x cpu.sh
sudo ./cpu.sh

赋予运行权限并执行
或者可以添加进 rc.local 让每次服务器重启都自动执行,这里就不详细描述了
但这还不够,我们还可以选择优化过的的内核如 Xanmod 内核 或是 Liquorix 内核
下面会分别讲述这两个内核的安装:

Xanmod 篇

按照网站上的教程 输入以下命令添加源:

echo 'deb http://deb.xanmod.org releases main' | sudo tee /etc/apt/sources.list.d/xanmod-kernel.list && wget -qO - https://dl.xanmod.org/gpg.key | sudo apt-key add -

然后安装:

sudo apt update && sudo apt install linux-xanmod

如果 CPU 是 Intel 的话 还需要

sudo apt install intel-microcode iucode-tool

AMD 的则是

sudo apt install amd64-microcode

然后是网络优化

echo 'net.core.default_qdisc = cake' | sudo tee /etc/sysctl.d/90-override.conf

接下来重启就会自动切换至 Xanmod 内核了

sudo reboot

Liquorix 篇

由于使用的是 Ubuntu 所以只需要简单的两行命令:

sudo add-apt-repository ppa:damentz/liquorix && sudo apt-get update
sudo apt-get install linux-image-liquorix-amd64 linux-headers-liquorix-amd64

然后重启

sudo reboot

顺带一说,目前 Xanmod 在 CSGO 服务端上性能不如 Liquorix。
回归正题,接下来安装需要的依赖:

sudo add-apt-repository multiverse
sudo dpkg --add-architecture i386
sudo apt update && apt install lib32gcc1 libcurl4 screen

进行第一步的时候有时你会遇到找不到命令的错误,这时需要

sudo apt install software-properties-common

安装 Steamcmd 并下载 CSGO 服务端

一行命令:

sudo apt install steamcmd

接下来我们选择简单的方法,新建一个自动更新脚本,这里的文件名为 update.txt 可以自行修改:

vim update.txt

然后按下 I 进入编辑模式,把下面的内容复制进去

@ShutdownOnFailedCommand 1 
@NoPromptForPassword 1
login anonymous
force_install_dir /home/steam/csgoserver/
app_update 740
quit

其中force_install_dir是指定服务端安装位置,可以自行修改
使用下面的命令来下载(或是之后更新)CSGO 服务端

steamcmd +runscript /home/steam/update.txt

接下来 steamcmd 会自动进行自我更新和下载 CSGO 服务端的任务,如果中途没有因为各种问题中断下载的话会显示:

Success! App '740' already up to date.
quit

这时你就得到了一个纯净的 CSGO 服务端

安装 Sourcemod 服务端模组

Sourcemod 是一个功能强大的 Source 引擎模组,可以进行服务器管理以及给服务器添加各种功能,服务器浏览器里的各种娱乐模式都是基于这个模组的插件。

curl -fsSL https://mms.alliedmods.net/mmsdrop/1.10/mmsource-1.10.7-git971-linux.tar.gz | tar -C csgoserver/csgo -xvz
curl -fsSL https://sm.alliedmods.net/smdrop/1.10/sourcemod-1.10.0-git6488-linux.tar.gz | tar -C csgoserver/csgo -xvz

安装完毕之后我们需要进行配置

vim csgoserver/csgo/addons/sourcemod/configs/admins_simple.ini

在最下方添加你的 SteamID,或是 IP,用户名:
putty_20200506184211644.png

SteamID 的格式是 STEAM_X:X:XXXXXXXX
如果不知道自己的 SteamID,可以到 https://steamidfinder.com/(或是其他类似的网站)输入自己的 steam 社区主页网址然后点击“Get SteamId”按钮
这里的示例是 第一行:给 STEAM_1:1:59886493 这个用户服务器的所有权限并且有“99”的“免疫值” 不需要验证密码并且有“99”的“免疫值”
第二行是给所有来自 127.0.0.1 这个 IP 地址的用户所有权限并且有“99”的“免疫值” 不需要验证密码(127.0.0.1 也就是本机 IP)
关于“免疫值”Immunity 的功能的说明:
一个例子,两个管理员如果都在游戏中,Immunity 低的管理员命令(如处死)不会生效在 Immunity 高的人身上。root 权限不受这个的影响(可以无视免疫操作任何人)。
附上一个权限的说明:

"a"//reservation 预留通道 
"b"//generic 管理员菜单的权限
"c"//kick 踢人
"d"//ban BAN人
"e"//unban 解BAN
"f"//slay 娱乐命令(处死 火烧冰冻等)
"g"//changemap 更换服务器地图
"h"//cvar 修改服务器cvar参数 (例如更改重力 回合时间等等)
"i"//config 执行服务器cfg文件
"j"//chat 发送消息(指sm_chat 给在线的其他管理员发消息)
"k"//vote 发动服务器投票
"l"//password 修改服务器密码
"m"//rcon rcon命令 允许远程控制服务器(sm_rcon)
"n"//cheats 修改sv_cheats参数以及使用其他作弊参数(平时需要sv_cheats的参数)
"z"//root 顶级权限 拥有所有权限并且无视免疫
"o-t" //o p q r s t 自定义权限组(比如使用warmod菜单,自定义VIP等)

配置你的 CSGO 服务器

首先,如果你需要让你的服务器出现在游戏内的服务器浏览器中,你需要在 steam 上创建一个服务器令牌:
进入 https://steamcommunity.com/dev/managegameservers
在“创建一个新的游戏服务器帐户”下面填入你的服务端 APPID(CSGO 就是 730)和一个备注(方便管理)
点击创建之后 在“您的游戏服务器帐户”下会出现你刚刚创建的登录令牌,稍后会用到这个东西。

服务器的配置 + 性能优化 #2

这里选择一个便于维护的方式,新建一个服务端的配置文件

vim csgoserver/csgo/cfg/csgoserver.cfg

并且输入以下内容:

rcon_password "password" //这是服务器的远程管理密码 不是sourcemod的
sv_setsteamaccount "上面的登录令牌 32位数字+字母"
host_info_show 2 //服务器显示信息
host_players_show 2 //服务器显示玩家
sv_region 4 //服务器地区 不过现在好像没用了
sv_contact "" // 服务器联系人邮箱 现在好像没用了
sv_steamgroup "" //这个服务器关联的steam组,在编辑steam组资料里会显示id 等同于在sv_tag中加上*grp:123456i
sv_steamgroup_exclusive 0 //0 所有人都能进入服务器, 1 是当服务器为空时其他人可以进入服务器(不过跟0效果差不多),2 是只有加入steam组的人才能进入服务器
sv_tags "" //服务器的tag 下面有详细说明
sv_downloadurl "" // 服务器的资源下载网址,不使用非官方地图或是模型之类的可以不设置
sv_visiblemaxplayers 32 //服务器可见的最大人数
mp_disable_autokick "" //如果开启自动踢人(TK踢出等),设置的人不会被踢,这里要设置SteamID
sv_allowupload 0
sv_allowdownload 0
sv_mincmdrate 128 //强制128tick
sv_minupdaterate 128 //强制128tick
motdfile motd.txt // motd文件
exec banned_user.cfg
exec banned_ip.cfg
writeid
writeip
//性能优化
sv_clockcorrection_msecs 0
sm_cvar sv_client_min_interp_ratio 2
sm_cvar sv_client_max_interp_ratio 2
sm_cvar sv_parallel_sendsnapshot 1
sm_cvar sv_enable_delta_packing 1
sm_cvar sv_maxunlag 0.1
sm_cvar net_maxcleartime 0.001
sm_cvar net_minroutable 1000
sm_cvar net_earliertempents 1
sm_cvar net_compresspackets 0
sm_cvar net_maxfilesize 1024
sm_cvar g_ragdoll_important_maxcount 1
sm_cvar g_ragdoll_maxcount 1
sm_cvar phys_enable_experimental_optimizations 1
sm_cvar prop_active_gib_limit 1
sm_cvar prop_active_gib_max_fade_time 1
sm_cvar sv_turbophysics 1
sm_cvar fps_max 0
sm_cvar host_framerate 0
sm_cvar host_syncfps 0
sm_cvar pvs_min_player_distance 1
sm_cvar sv_alternateticks 1
sm_cvar sv_force_transmit_ents 0
sm_cvar sv_force_transmit_players 0
sm_cvar sv_forcepreload 1
sm_cvar sv_stats 0
sm_cvar sv_parallel_packentities 1
sm_cvar sv_multiplayer_maxtempentities 1
sm_cvar occlusion_test_async 1
sm_cvar host_threaded_sound 1
sm_cvar host_thread_mode 2
sm_cvar sv_threaded_init 1
sm_cvar mod_load_anims_async 1
sm_cvar mod_load_mesh_async 1
sm_cvar mod_load_vcollide_async 1
sm_cvar vprof_server_thread 1
sm_cvar g_ai_threadedgraphbuild 1
sm_cvar sv_server_verify_blood_on_player 0
sm_cvar net_queued_packet_thread 1
log on // 开启日志记录

关于sv_tags
可以同时设置多个 tag 以半角逗号,分割,以及你设置特定内容可以起到一些特殊效果。例如:

sv_tags "*grp:123456i,hidden"

第一个参数是设置你的 steam 组为 123456,等同于 sv_steamgroup 123456
但是你如果设置了sv_steamgroup之后修改sv_tags 并且没有加*grp:123456i 你的服务器跟 steam 组关联会失效
这说明了sv_steamgroup做的就是在sv_tags中加入*grp:123456i参数
第二个参数是在服务器浏览器中隐藏 这跟服务器启动项加-nomaster或者修改服务器 cvar host_info_show 0的区别是:
-nomaster或者host_info_show 0:服务器浏览器,收藏夹,黑名单等都看不见这个服务器 只能通过 connect 或者通过好友进入
sv_tags hidden:服务器浏览器里面搜不到你的服务器,但是收藏夹,黑名单(如果你被服务器 ban 了)里可以看见。

启动服务器之前需要做的

新建一个启动脚本:

vim csgoserver/run.sh

输入以下内容:

#!/bin/bash
./srcds_run -game csgo -threads 4 -authkey * -maxplayers_override 32 -noipx -steam_dir /home/steam/.steam/steamcmd/ -steam_sh /home/steam/.steam/steamcmd/steamcmd.sh -steamcmd_script /home/steam/update.txt -autoupdate -aurorestart -port 27015 -tickrate 128 +game_mode 0 +game_type 0 +exec csgoserver.cfg +map de_dust2

说明:
-threads是服务端使用的线程数,但会影响服务器稳定性,建议不要超过 16
-authkey是你的 steam api key 主要用在使用 steam 创意工坊地图时 在 https://steamcommunity.com/dev/apikey 申请
-maxplayers_override 32 是服务器最大人数
-noipx 禁用 ipx 协议 能略微提升性能(在客户端也有效)
-aurorestart 在服务器崩溃时自动重启
-tickrate 服务器的 tickrate 或者说“刷新率”
-port 端口 默认是 27015 可以修改
-ip 服务器 ip 在服务器有多个 ip 的时候有用
+game_mode 0 +game_type 0 +exec csgoserver.cfg +map de_dust2 使用休闲模式开启服务器并且载入刚刚的配置文件 csgoserver.cfg 和 de_dust2 这张地图
-steam_dir -steam_sh -steamcmd_script -autoupdate这四个影响到服务端的自动更新

当然 还需要一点小改动才能实现服务端的自动更新

vim csgoserver/srcds_run

修改第 301 行的 "steam.sh" 为 "steamcmd.sh"
可以通过输入/steam.sh快速找到这一行再按 I 进入编辑模式修改
putty_20200506194522871.png

然后保存退出
新建立一个 screen 让服务端可以后台运行:

screen

按回车或者两下空格跳过 screen 的介绍

cd csgoserver
chmod +x run.sh
run.sh

这样你的服务器就开始运行了

性能优化 #3

这时候我们还需要把服务端的优先级设置为高:
这里参考了https://github.com/MikkelDK/GameServerKernel

wget https://raw.githubusercontent.com/MikkelDK/GameServerKernel/master/script.sh && chmod +x script.sh && sudo ./script.sh

这一步要在服务端开启之后使用 每次开服都要使用一次sudo ./script.sh