ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Ubuntu下L4D2专用服务器搭建:对抗、药抗与特殊模式配置指南

Ubuntu下L4D2专用服务器搭建:对抗、药抗与特殊模式配置指南 1. 把 L4D2 服务端搬到 Ubuntu先弄清楚它到底能干什么很多人第一次接触求生之路2专用服务器搭建这件事脑子里只有一句话我要开个服。但真正在这个圈子里待过就知道开服只是起点后面还有对抗模式怎么切、药抗模式怎么配、特殊模式怎么起、控制台代码怎么调这一整套东西。我最早是把服务端扔在 Windows 上跑后来因为长期运行稳定性和资源占用的问题整体迁到了 Ubuntu前后折腾了大概两周踩的坑足够写满一页纸。这篇就把这套流程完整过一遍包括 Ubuntu 系统的依赖处理、SteamCMD 拉取服务端、对抗与药抗模式的参数配置、突变类特殊模式的启动方式以及我平时真的会用到的那批控制台代码。先把范围说清楚。L4D2 的服务端在 Ubuntu 上能做的事情大致分三块一是标准的战役/对抗/生存/清道夫这些官方模式二是通过治疗类物品参数调整出来的社区玩法大家习惯叫药抗这类名字三是靠mp_gamemode切换的突变模式和社区自定义玩法。这三块共用同一套服务端本体区别只在于启动参数、cfg 文件和插件配置。也就是说你不需要为每种玩法装一份服务端只要把参数管理做好一台机器上跑多个实例、每个实例一种玩法是很常见的做法。这篇文章适合谁看手上有台 Ubuntu 机器物理机、虚拟机、云主机都行想自己开一个能长期跑、能自己改规则的 L4D2 专用服务器的朋友以及已经开起来了但搞不定对抗模式的完整 8 人体验、搞不懂药抗模式到底改哪些数值、每次切特殊模式都要重启一遍的人。我会把每一步为什么这么做讲清楚而不是只丢一串命令给你。1.1 三种玩法形态共用一个服务端本体我先把概念理顺不然后面的配置很容易乱。L4D2 服务端的模式本质上是一个字符串它会去读游戏目录下对应的模式脚本。官方的基础模式有战役、对抗、生存、清道夫、写实这几类突变模式则是在基础模式上叠了一套额外的规则脚本。社区说的药抗模式严格来说不是一个官方模式名。它的实现方式是基础模式仍然是对抗然后在服务器 cfg 或插件层面对治疗类物品的数值做调整——医疗包回复比例、止痛药的临时血量、肾上腺素的加成时长这些。为什么大家都往治疗物品上改因为在对抗里谁手里有药、什么时候吃药直接决定了这一波能不能守住、能不能翻盘。把药的规则改掉就等于把整局的节奏重心挪了一个位置。所以药抗这个名字核心在药抗指的是它仍然建立在对抗这套框架上。而特殊模式这个说法更宽泛既包含官方的突变编号也包含社区用community1、community2这种编号加载的自定义玩法。搞清楚这三个概念的区别后面的命令你就不会抄错了。1.2 硬件和带宽别被专用服务器四个字吓到L4D2 的服务端对硬件的胃口其实不大但它有个特点非常吃单核性能。Source 引擎的服务端主线程基本是单线程跑逻辑所以八核十六核的机器跑一个 L4D2 实例也只用得上其中一两个核。选机器的时候主频比核心数重要得多。内存方面一个标准对抗实例8 人跑起来大概占 1G 到 1.5G加上 SourceMod 和插件留 2G 到 3G 就比较稳。磁盘 30G 左右够用服务端本体加插件加自定义内容一般不会超过这个数。带宽反而是最容易被忽略的8 人对抗每人上行下行都在几十 KB/s 的量级但你还要算上玩家进服时的内容下载如果服务器里塞了自定义模型和地图那瞬间带宽就上去了。我自己的经验是5M 上行跑 8 人对抗基本不会卡但如果要分发大体积自定义内容最好配一个 HTTP 下载源让玩家从 Web 服务器拉文件而不是从游戏端口挤。1.3 为什么我坚决不用 root 跑服务端这条放在最前面说因为它后面会反复出现。Source 专用服务端是以文件为核心运行的它会不断读写游戏目录下的 cfg、日志、缓存文件。用 root 跑一次插件失控或者目录权限写错就可能把整个系统目录搅乱。我第二次迁移的时候就因为图省事用了 root结果一个日志文件被写成了 root 所有后面换普通用户启动直接报权限错误排查了半小时才发现是文件属主的问题。正确做法是建一个专门的系统用户比如叫l4d2把服务端目录的属主给它所有操作都用这个用户执行。用useradd -m -s /bin/bash l4d2建用户然后su - l4d2切过去干活。这样即使服务端进程出问题影响范围也只在用户目录里。2. SteamCMD 与 32 位运行库Ubuntu 上九成的启动失败都出在这如果你的 L4D2 服务端在 Ubuntu 上起不来或者起来之后立刻退出、报一堆找不到库的错误先别怀疑参数写错了——九成的情况是 32 位运行库没装全。L4D2 的专用服务端二进制是 32 位的哪怕你跑在 64 位的 Ubuntu 22.04 或者 24.04 上它依然要求系统提供 i386 架构的兼容库。这一点在很多教程里被一笔带过然后新手就在那儿对着报错发呆。2.1 i386 架构和 lib32 依赖的正确安装顺序顺序很重要先加架构再更新源最后装库。如果你先apt install再去dpkg --add-architecture包是装不上的。sudo dpkg --add-architecture i386 sudo apt update sudo apt install -y lib32gcc-s1 lib32stdc6Ubuntu 22.04 及以后包名是lib32gcc-s1更老的版本上是lib32gcc1。如果你执行的时候提示找不到包先用apt-cache search lib32gcc查一下实际包名。另外有几个系统是精简安装的还缺curl、tar、screen或者tmux顺手一起装上sudo apt install -y curl tar screen ca-certificates这里我说一下为什么推荐 screen 而不是直接 nohup。服务端是有控制台的你需要在里面敲 rcon 命令、看日志输出、临时改 cvar。screen 会话可以随时切回去nohup 就只能靠日志文件盲猜了。后面讲 systemd 的时候也是通过脚本把 screen 管起来两套方案不冲突。2.2 steamclient.so 的归属问题这是第二个高频坑。SteamCMD 拉完服务端第一次启动时经常会报类似Failed to load steamclient.so或者Could not load tier0的错误。原因在于服务端期望在用户目录下的 Steam SDK 路径里找到 32 位的steamclient.so但 SteamCMD 拉取时只把它放在了服务端目录里的linux32文件夹下。解决办法是把文件软链接或者复制到期望的位置mkdir -p ~/.steam/sdk32 cp /home/l4d2/l4d2server/linux32/steamclient.so ~/.steam/sdk32/steamclient.so注意这一步必须在服务端的 SteamCMD 更新之后做因为每次更新都可能覆盖linux32目录里的文件。我习惯把这两条命令写进一个update.sh里更新完自动同步省得每次手动补。顺带说一个判断技巧如果报错里出现的库名是以libtier0、libsteam_api、steamclient开头的那基本可以锁定是 32 位依赖或者 sdk32 路径的问题不用去翻 cfg。2.3 拉取 222860 与服务端目录规划L4D2 专用服务端的 Steam 应用编号是222860这个号记牢更新和校验都用它。我的目录习惯是这样分的SteamCMD 自己放在~/steamcmd服务端实例放在/home/l4d2/instances/实例名。为什么要分实例目录因为你想同时开一个对抗服和一个药抗服的时候两个实例可以有各自的 cfg互不干扰。拉取命令cd ~/steamcmd ./steamcmd.sh force_install_dir /home/l4d2/instances/versus01 \ login anonymous app_update 222860 validate quit第一次拉取大概要下十几到二十几个 G看你网络情况。validate参数不要省它会在更新后校验文件完整性能省掉很多文件损坏导致服务端起不来的玄学问题。拉完之后目录结构里你会看到srcds_run、srcds_linux、left4dead2/这些left4dead2下面才是真正的游戏资源和你以后要天天打交道的 cfg、addons 目录。如果你要跑多个实例不建议复制整个目录那样太占磁盘。轻量一点的做法是每个实例都独立完整拉一份因为 Source 服务端的很多数据是写在自己目录里的共享目录容易出权限和缓存冲突。磁盘够的话就一人一份省心。3. 对抗模式的完整启动链路从命令行参数到 mp_gamemode对抗模式是 L4D2 最消耗配置精力的一种玩法因为它默认只要 8 个人才能凑成一局完整的对局而且服务端对模式这件事的处理方式和你想的可能不一样。很多人第一次启动对抗服兴致勃勃连进去发现进去的是战役或者选人的时候只有四个位置。问题都出在启动链路的第一环。3.1 srcds_run 参数逐条拆解先说启动命令。我平时用的版本大概是这个形态cd /home/l4d2/instances/versus01 ./srcds_run -game left4dead2 \ -console -condebug -norestart \ -ip 0.0.0.0 -port 27015 \ hostport 27015 \ sv_setsteamaccount 你的GSLT令牌 \ exec server.cfg \ map c1m1_hotel versus逐条说。-console让服务端带控制台运行你才能在 screen 里敲命令-condebug会把控制台输出同时写进console.log排错全靠它-norestart是告诉srcds_run这个包装脚本不要在进程退出后自动重启——因为我要用 systemd 管它两层守护会打架出现关了又起来的诡异现象。-ip 0.0.0.0表示监听所有网卡多网卡机器上如果只填一个 IP玩家从另一个网卡进来就连不上。-port和hostport都写 27015前者是进程监听端口后者是告诉服务端对外宣告的端口在单机单实例的情况下两者一致如果做了端口映射hostport要写实际映射出去的那个。sv_setsteamaccount后面跟的是游戏服务器登录令牌。这一步非常关键没有有效令牌服务端会以匿名方式运行不会出现在服务器浏览器列表里玩家只能靠 IP 直连。令牌需要在游戏平台的服务器管理页面申请绑定到一个游戏账号上一个令牌对应一个服务端实例。如果你只是局域网内自娱自乐可以不加但记得把sv_lan设成 1。最后一行map c1m1_hotel versus是整个链路里最容易被写错的地方。L4D2 的map命令支持带第二个参数指定模式模式是在开图这一刻定下来的。如果你只在server.cfg里写mp_gamemode versus那是在地图已经加载完之后才执行当前这一局还是战役要等下一张图才生效——这就是我明明配了对抗进去却是战役的根本原因。3.2 server.cfg 里真正影响对抗体验的几行server.cfg放在left4dead2/cfg/下启动时通过exec server.cfg加载。里面能写的项非常多但真正影响对抗能不能好好玩的其实就那么几行hostname 对抗服 01 rcon_password 换成你自己的强口令 sv_lan 0 sv_region 4 sv_allow_lobby_connect_only 0 sv_allowdownload 1 sv_consistency 0 sv_pure 0 sv_password mp_gamemode versus z_difficulty Normalsv_region 4是亚洲区影响服务器浏览器里的区域筛选不设的话可能被归到别的地方玩家搜不到。sv_allow_lobby_connect_only 0允许玩家直接连 IP设为 1 的话就只能通过大厅组队进——这两种做法各有取舍允许直连方便调试和朋友进来但会带来一些不受控的玩家只允许大厅进则更正规但你自己测试的时候会麻烦。sv_consistency 0和sv_pure 0这两个是搭配自定义内容用的。服务端一旦装了自定义模型、贴图或者插件改动过的资源sv_consistency开着就会把所有客户端踢出去。我一般在装了 SourceMod 和自定义内容后就把这两个关掉。如果你追求纯净公平的对抗环境反过来把它们打开代价是自定义内容全部不能用了。提示z_difficulty在对抗模式里基本是被服务端忽略的因为对抗的难度由游戏模式脚本决定。你在对抗服里调它不会有明显变化别在那儿浪费时间。3.3 八人对抗l4dtoolz 与 sv_maxplayers这里是对抗服最核心的一环。L4D2 原生服务端只认 4 个真人玩家位你直接写maxplayers 8是没用的那是旧版参数早就不生效了。要实现 8 人对抗必须装一个扩展。社区里最常用的是Left 4 Downtown简称 l4dtoolz它是一个 Metamod 扩展装上之后会带来sv_maxplayers、sv_removehumanlimit、sv_force_unreserved这几个 cvar。安装流程是先装 Metamod:Source把解压出来的addons目录覆盖进left4dead2/然后在left4dead2/addons/下放一个metamod.vdf内容指向../left4dead2/addons/metamod/bin/server。接着装 SourceMod同样是覆盖addons目录。最后把 l4dtoolz 的.vdf放进addons/扩展二进制放进addons/l4dtoolz/bin/。装完之后在server.cfg里写sv_maxplayers 8 sv_removehumanlimit 1 sv_force_unreserved 1sv_maxplayers 8把上限提到 8sv_removehumanlimit 1解除真人位限制sv_force_unreserved 1让服务端一开始就为满人数预留资源避免玩家进来的时候出现人数没满但进不去的情况。验证是否装成功有两个办法控制台敲meta list能看到 l4dtoolz 说明 Metamod 层没问题敲sm plugins list能看到 SourceMod 插件列表说明 SourceMod 层没问题。这两条命令我建议你每次改完插件都跑一遍比看日志猜快得多。4. 药抗模式的规则到底落在哪几个数值上先说一句实在话药抗这个叫法在社区里没有统一标准不同服务器指的具体规则不完全一样有的侧重药少、吃药慢有的侧重药还是那些药但受伤更狠所以药更金贵。但不管是哪种落点都在治疗类物品的一组 cvar 上。你只要搞清楚这几个数值的含义就能自己定义出你想要的药抗。4.1 治疗类 cvar 清单与调整方向L4D2 里跟治疗相关的 cvar 大概有这么几个默认值我按当前主流版本列出实际操作时你应当以服务端里find出来的实时值为准cvar大致默认值作用药抗方向的取法first_aid_heal_percent0.8医疗包回复的血量比例相对最大生命调到 0.5 到 0.65first_aid_kit_use_duration5使用医疗包耗时秒调到 6 到 8pain_pills_health_value50止痛药提供的临时血量调到 30 到 40pain_pills_decay_rate约 0.27止痛药临时血量的衰减速率适当调高加大衰减adrenaline_health_buffer25肾上腺素提供的临时血量缓冲调到 15 到 20adrenaline_duration15肾上腺素持续时间秒调到 10 到 12pain_pills_health_threshold99临时血量封顶阈值一般不动survivor_revive_duration约 5拉起倒地队友的耗时加大制造救人压力z_tank_health4000 起坦克血量受难度影响略微上调配合药少这张表里最核心的是前四个。first_aid_heal_percent决定了一个医疗包能救回多少血量把它从 0.8 降到 0.6意味着原本能回满的血包现在回不满玩家必须更谨慎地选治疗时机。pain_pills_health_value影响的是临时血的厚度调低之后止痛药只能当应急手段用不能当半个医疗包使。first_aid_kit_use_duration和survivor_revive_duration这两个时间类参数改的是治疗期间的风险窗口——时间越长你在治疗时被特殊感染者打断的概率越高这个改动对对抗节奏的影响比单纯改数值更明显。z_tank_health我只建议小幅上调比如从默认值加 20% 左右。如果你一次加到两倍坦克那一波会变成纯粹的排队送死体验会很差。经验上把药减弱 30% 再配合坦克血量加 20%就已经能明显感受到节奏变了。4.2 隐藏 cvar 与 sm_cvar 的关系这里有个坑一定要说清楚上面这些 cvar 里有相当一部分是隐藏 cvar直接在控制台敲first_aid_heal_percent 0.6是不生效的控制台会告诉你这个命令不存在或者被锁定。要改隐藏 cvar必须通过 SourceMod 的sm_cvar命令sm_cvar first_aid_heal_percent 0.6 sm_cvar pain_pills_health_value 35 sm_cvar first_aid_kit_use_duration 7在 cfg 文件里也一样所有隐藏 cvar 前面都要加sm_cvar前缀否则怎么写都不生效。我建议你养成一个习惯在改任何 cvar 之前先在控制台敲find 关键词比如find pills、find aid把相关的 cvar 和它们的当前值列出来。这样你能确认三件事名字写对没有、当前值是多少、它是不是隐藏的。比对着教程猜要可靠得多。还有一点sm_cvar只能改 cvar不能凭空创造。如果你某个名字敲进去提示无法执行大概率是你把它记错了或者这个 cvar 在当前版本已经被移除。别在一个不存在的 cvar 上耗时间。4.3 一份可以直接抄的药抗 cfg把上面的东西组合起来我平时用的药抗配置大致长这样。放在left4dead2/cfg/下命名成medres.cfg然后通过exec medres.cfg加载// 药抗规则 sm_cvar first_aid_heal_percent 0.6 sm_cvar first_aid_kit_use_duration 7 sm_cvar pain_pills_health_value 35 sm_cvar pain_pills_decay_rate 0.35 sm_cvar adrenaline_health_buffer 18 sm_cvar adrenaline_duration 11 sm_cvar survivor_revive_duration 6 sm_cvar z_tank_health 4800 // 基础节奏 sm_cvar z_common_limit 30 sm_cvar director_no_death_check 0z_common_limit是小丧尸同屏上限默认 30调高会让场面更乱、帧数更低调低会让场面偏空。这个值跟药抗没有直接关系但它影响混战压力配合药少以后场面压力感会更明显。改完一定要做验证找个人进服让他故意受伤然后吃药、用医疗包看回复量对不对。我见过太多次配置写了但其实没生效原因要么是没加sm_cvar前缀要么是加载顺序不对——exec的 cfg 如果在mp_gamemode生效前执行可能在换图时被重置。稳妥的做法是把关键 cvar 写在server.cfg末尾或者干脆放到 SourceMod 的cfg/sourcemod/目录下让它在每次换图时重新应用。5. 特殊模式与突变玩法官方编号加社区自定义官方在 L4D2 里内置了一批突变模式社区习惯叫特殊模式。它们的启动方式和普通对抗不太一样容易踩的坑也不一样。5.1 mp_gamemode 与 map 命令的写法差异基础模式是那几个固定字符串coop、versus、survival、scavenge、realism。突变模式则是用mutation加编号社区自定义玩法用community加编号。启动的时候有两种写法效果不一样第一种是启动参数里直接开map c1m1_hotel versus第二种是运行中切换mp_gamemode mutation7 changelevel c2m1_highway注意第二种一定要先改mp_gamemode再changelevel顺序反了的话换过去的图还是旧模式。为什么必须换图因为模式相关的脚本是在地图加载阶段读取的不换图就不会重新读。很多人改完mp_gamemode发现没反应原因就在这里。另外mp_gamemode在服务端里通常是个隐藏 cvar你在控制台直接敲可能会被拦需要走sm_cvar mp_gamemode mutation7。这一点跟前面药抗的参数是一个道理。5.2 官方突变编号速查与几个现实问题官方突变的编号在不同的版本和社区打包里可能会有差异所以我一直建议以你本地服务端实际能加载的编号为准。下面这几个是我经常用到、并且验证过的类型供参考玩法方向特征注意点爆头类只有爆头才能造成有效伤害需要配合准星和武器限制不然体验很怪流血类玩家持续掉血节奏极快对治疗资源要求高和药抗思路接近单人/少人类极大压缩真人位记得同步调整sv_maxplayers写实对抗类去掉了部分 UI 提示新玩家上手困难适合熟人局生存对抗类对抗与生存结合地图需要支持对应的模式脚本我特别想提醒一点突变模式和插件经常冲突。你装了 SourceMod 的一套增强插件之后切到突变模式可能会出现规则被覆盖、或者某个玩家直接掉线的情况。排查办法是先把addons目录临时改名用干净的服务端跑一次突变模式确认游戏本体没问题再逐个把插件加回来。这个二分法定位的思路虽然笨但非常管用。5.3 社区玩法与竞技配置的接入思路社区自定义玩法的加载方式和官方突变类似只是编号用community开头规则文件放在服务端脚本目录里。这类玩法通常包含一份规则脚本加一份配套 cfg你拿到之后要做三件事确认编号没和官方冲突、确认它依赖的插件你装了、确认它的 cvar 不会被你的server.cfg覆盖。顺序上我建议server.cfg里只放全局通用的东西社区玩法的配置单独成一个 cfg最后加载。因为 Source 服务端的 cfg 是后加载的覆盖先加载的你如果先加载玩法 cfg 再加载server.cfg玩法里的自定义数值全被冲掉了。这个坑我踩过一次改了半天数值没生效最后发现是加载顺序的问题。还有一类是竞技向的对抗配置包它们本质上也是 cfg 加插件的组合特点是会严格控制武器、道具、坦克和女巫的分布。接入之前先想清楚你是要一个和朋友随便玩的服还是一个按固定规则打的服。两者的配置方向完全不同混在一起会两边不讨好。6. 控制台代码清单运维、调试、录制三张表标题里提到的控制台代码我按用途分成三张表。这些命令在 screen 会话里直接敲或者在游戏客户端通过 rcon 发到服务端都可以。注意大多数 cvar 类的修改需要sv_cheats 1或者sm_cvar前缀。6.1 服务端管理与玩家处置status // 查看当前玩家、地图、帧数 changelevel c2m1_highway // 换图 mp_gamemode versus // 改模式改完要换图 kick 玩家名 // 踢人 banid 分钟 SteamID // 封禁 sv_maxplayers 8 // 人数上限需 l4dtoolz restart // 重开当前局 meta list // 查看 Metamod 扩展 sm plugins list // 查看 SourceMod 插件 sm_admin // 打开管理菜单需管理员权限status是我用得最多的一条玩家进不来、怀疑有人在捣乱、想看服务器负载全靠它。它输出的最后几行会显示服务器 FPS如果这个数长期低于 30说明你的机器撑不住当前配置要么降玩家数要么换 CPU。sm_admin需要先把自己加进 SourceMod 的管理员列表编辑addons/sourcemod/configs/admins_simple.ini格式是STEAM_1:0:xxxxx 99:z。搞不定管理员权限的话SourceMod 的大部分功能你就用不了这一步别跳过。6.2 调试与压力测试sv_cheats 1 // 打开作弊调试用正式服必须关 director_no_mobs 1 // 停止刷小丧尸 director_no_specials 1 // 停止刷特感 z_common_limit 0 // 清空小丧尸上限 nb_delete_all // 删除场上所有丧尸 z_spawn tank // 手动刷一只坦克 z_spawn hunter // 手动刷一只猎人 give rifle_ak47 // 给自己一把 AK give medkit // 给自己一个医疗包 give pain_pills // 给自己一瓶止痛药 give adrenaline // 给自己一支肾上腺素 god 1 // 无敌调试用 noclip // 穿墙调试用调试模式的正确用法是先把director_no_mobs 1和director_no_specials 1打开把场面清干净然后手工刷出你想测的东西。比如你要测药抗参数就清场之后让自己掉血再用give medkit拿包测试回复量。如果不清场一波小丧尸冲过来你根本看不清数值变化。测完记得sv_cheats 0不然被玩家发现是可以搞出很多麻烦的。give系列的名字是跟着武器的脚本命名走的常见的有rifle_ak47、rifle_desert、smg、autoshotgun、hunting_rifle、sniper_military、chainsaw、grenade_launcher、pistol_magnum这些。记不住的话直接在游戏里翻武器脚本名或者用find give看有没有帮助信息。6.3 录制与演出用的命令如果你要录教学视频、拍服务器宣传片这套命令很有用sv_cheats 1 director_stop // 冻结导演场景不再自行推进 nb_blind 1 // 让丧尸看不见你方便站位 thirdperson // 切第三人称 firstperson // 切回第一人称 cl_drawhud 0 // 隐藏 HUD r_drawviewmodel 0 // 隐藏手上的武器模型 sv_infinite_ammo 1 // 无限弹药director_stop是拍摄的核心它把整个 AI 导演冻住刷怪、推进全部停下来你可以自由走位取景。nb_blind 1让丧尸对你视而不见用来拍近景特别好使。这两条配合thirdperson能拍出很多平时看不到的镜头。用完之后记得把sv_cheats 0、cl_drawhud 1、r_drawviewmodel 1全部还原。我有个朋友拍完片子忘了关sv_cheats服务器一直挂着被玩家用作弊代码刷了一地坦克重启之后才恢复正常。这种低级错误一次就够记一辈子了。7. 上线之后systemd 守护、端口、日志与排错服务端能跑起来只是第一步能稳定跑下去才是真本事。7.1 systemd 单元文件与 -norestart 的配合我前面在启动参数里加了-norestart就是为了配合 systemd。写一个单元文件放到/etc/systemd/system/l4d2-versus.service[Unit] DescriptionL4D2 Versus Server Afternetwork-online.target Wantsnetwork-online.target [Service] Typesimple Userl4d2 Groupl4d2 WorkingDirectory/home/l4d2/instances/versus01 ExecStart/home/l4d2/instances/versus01/srcds_run -game left4dead2 \ -console -condebug -norestart \ -ip 0.0.0.0 -port 27015 hostport 27015 \ sv_setsteamaccount 你的GSLT令牌 \ exec server.cfg map c1m1_hotel versus Restarton-failure RestartSec10 [Install] WantedBymulti-user.targetRestarton-failure配合RestartSec10表示进程异常退出后等 10 秒重拉。服务端如果因为 GSLT 无效或者端口被占用退出它会一直重试你要通过日志确认原因别让它无限重启把 CPU 吃掉。systemctl daemon-reload之后systemctl enable --now l4d2-versus就能开机自启。要看实时输出用journalctl -u l4d2-versus -f要进控制台的话我一般还是另外开一个 screen 会话手动跑一份用于调试生产实例交给 systemd。7.2 端口与防火墙L4D2 服务端需要的端口不复杂但漏了任何一个都会导致服务器在线但没人连得上sudo ufw allow 27015/tcp sudo ufw allow 27015/udp sudo ufw allow 27020/udp # 如果开了 SourceTV游戏端口同时需要 TCP 和 UDP很多人只开了 UDP结果就是自己能从控制台看到服务器正常但玩家进不来。云主机的话还要检查安全组那是在系统防火墙之外的独立一层两层都要放行。查端口有没有真的在监听用ss -lunp | grep 27015能看到进程说明监听成功。7.3 常见报错对照表我把这几年遇到的报错整理成一张表出问题的时候先对着查现象大概率原因处理方式启动即退出报找不到库32 位运行库缺失装lib32gcc-s1、lib32stdc6Failed to load steamclient.sosdk32 路径缺文件复制linux32/steamclient.so到~/.steam/sdk32/服务端在线但浏览器搜不到无 GSLT 或sv_lan 1配令牌sv_lan 0检查区域设置玩家只能进 4 个未装 l4dtoolz装扩展并设sv_maxplayers 8进了对战但不是对抗模式在地图加载后才设用map 图 versus或先改mp_gamemode再换图自定义内容导致掉线sv_consistency/sv_pure拦截临时设 0 验证再决定是否放开日志文件写不进去目录属主是 root改回l4d2用户所有服务器 FPS 长期偏低玩家数或插件超出 CPU 能力降人数、减插件、提高单核主频这张表里有一半的问题我都亲身遇到过尤其是服务端在线但搜不到和玩家只能进 4 个这两条几乎每个新手都会撞一次。排查的思路永远是先看console.log和journalctl有没有明确报错再看meta list、sm plugins list、status这三条命令的输出是否正常最后才去怀疑 cfg 写错了。顺序反了你就会在一个语法完全正确的配置文件里找半天问题。最后分享一个小习惯我每次改完配置都会先在本地用map起一个临时实例进去跑一圈确认没问题再更新到生产实例。多花五分钟能省掉半夜被玩家喊服务器又炸了的麻烦。
返回列表