ARTICLE DETAIL

资讯详情

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

Ubuntu云服务器搭建饥荒联机版专用服务器实战

Ubuntu云服务器搭建饥荒联机版专用服务器实战 现在很多玩家开饥荒联机版Dont Starve Together后面统一叫 DST的存档都遇到过同一个尴尬主机一关世界就没了主机一卡全员掉线主机上传带宽不够四个人一起跑图就开始漂移。我自己从最早用家里的旧笔记本开服到后来换成 Ubuntu 云服务器跑专用服务端Dedicated Server前后折腾了差不多两年踩过的坑基本能写一本小册子。这篇就把我目前稳定运行的一套 Ubuntu 云服务器搭建饥荒联机版服务器的完整流程拆开讲包括云主机怎么选、SteamCMD 怎么装、令牌怎么申请、配置文件每一项到底改什么、端口怎么放、崩了怎么查。不管你是完全没碰过 Linux 的新手还是已经会敲几行命令但被libcurl-gnutls.so.4报错卡住的老玩家这篇都能直接照着抄。全文的操作我在 Ubuntu 22.04 LTS 上实测过Ubuntu 20.04 和 24.04 也基本通用个别差异我会单独标出来。1. 开服之前先想清楚为什么是 Ubuntu 云主机跑饥荒联机版动手之前先花十分钟把思路理顺能省掉后面至少两小时的返工。我见过太多人上来就买机器、装系统、拉服务端结果发现要么配置买错要么方案本身就不适合自己。1.1 官方专服、主机直连、第三方面板三条路怎么选饥荒联机版的服务器形态其实有三条路。第一种是游戏里直接创建世界让好友加入本质是你的客户端既是玩家也是主机你一退房世界暂停别人就进不去了。第二种是用官方提供的专用服务端程序Dedicated Server跑在一台独立的机器上所有玩家包括你自己都作为客户端连进去主机退出不影响世界。第三种是各种第三方托管面板交钱包月你只负责点按钮。第三种省事但受制于人改个配置要提工单模组装多了一堆限制长期档数据也在别人手里。第二种才是真正属于自己的方案数据在你自己硬盘上配置随便改模组随便装成本其实只有第一种方案电费级别的花费。我最后选的就是第二种云主机跑官方专服。这里有个概念必须说清楚DST 的专服不是一个程序开一个世界而是一个程序开一个分片Shard。地面世界叫 Master 分片洞穴世界叫 Caves 分片两个分片各自是一个独立进程靠一个内部端口互相通信。所以你如果要开带洞穴的世界实际上要同时跑两个进程。这一点决定了后面所有的目录结构、端口规划和启动脚本写法。1.2 为什么是 Ubuntu而不是 Windows Server云主机上跑 DST 专服Windows 和 Linux 都能跑但我推荐 Ubuntu理由很实际资源占用低。Windows Server 光系统本身就要吃掉 1GB 到 2GB 内存Ubuntu Server 最小化安装大概 100MB 出头。小配置机器上这个差距直接决定你能开几个分片。命令行运维方便。DST 专服在 Linux 上就是一个不带界面的可执行文件配合screen或systemd做后台常驻重启、看日志、定时备份都是一行命令的事。Windows 上要么开个远程桌面盯着要么写一堆批处理。SteamCMD 支持成熟。Valve 的 SteamCMD 在 Linux 上跑得最稳DST 服务端AppID 343050本身就是通过 SteamCMD 分发的。社区资料最多。你遇到的绝大多数报错搜出来的解决方案都是 Linux 环境的。Ubuntu 版本上我建议22.04 LTS。20.04 也能用但部分依赖包名不太一样24.04 更新但有些第三方库的 32 位包还在磨合期。LTS 版本的意义是有五年安全更新你不用三天两头重装系统。1.3 配置到底买多大把 CPU、内存、带宽算明白这是新手最容易花冤枉钱的地方。先说结论我实测下来比较舒服的配置是场景CPU内存带宽系统盘只开地面世界4-6 人2 核2 GB3 Mbps40 GB地面洞穴4-6 人2 核4 GB5 Mbps60 GB地面洞穴10 人以上装大量模组4 核8 GB10 Mbps80 GB解释一下这几个数字怎么来的。内存是硬指标。DST 专服有个众所周知的问题内存会缓慢泄漏开久了占用会一直涨。单个分片启动后大约吃 500MB 到 800MB装模组之后能到 1GB 以上。你要开地面加洞穴两个分片再给系统留出余量2GB 内存是绝对不够的4GB 是底线。这就是为什么很多人反馈人一多就崩其实是内存被榨干被系统 OOM Killer 杀掉了。顺便回答一个热词里经常出现的问题云服务器 32 核 128G 中的 128G 指的是什么——它指的是内存RAM容量 128GB不是硬盘也不是带宽。云服务器的规格命名一般是核数 内存比如2 核 4G就是 2 个 vCPU 加 4GB 内存。饥荒专服对核数不敏感对内存和单核性能敏感所以别被32 核这种数字忽悠你要的是内存够大、单核主频高。CPU 看单核性能。DST 服务端的逻辑基本是单线程的多核并不会让它跑得更快。所以两台机器一台 2 核高主频一台 8 核低主频前者开服体验往往更好。选机器的时候别只看核数。带宽看上行。云服务器的带宽通常指公网出方向带宽。DST 一个玩家的同步流量在 20 到 50 Kbps 左右六个人同时在线峰值大概 300 Kbps也就是 0.3 Mbps。听起来很小但要注意突发玩家进出洞穴、传送、大批量实体刷新的时候会有瞬间抖动。3 Mbps 起步、5 Mbps 比较稳别买 1 Mbps 的入门款卡起来你会怀疑人生。系统盘 40GB 起步。服务端本体大概 2GB 左右加上 SteamCMD、模组、存档和备份40GB 比较安心。存档本身不大但备份会累积后面我会讲怎么清理。提示国内几家主流云厂商对新用户都有短期试用或者首年优惠用来练手完全够用。但正式长期档我建议直接买包年包月的基础配置别用那种随时回收的体验机型存档丢了哭都来不及。2. 环境准备从买到机器到能敲命令机器到手之后第一件事不是急着装服务端而是把系统环境收拾干净。这一步做扎实后面能少掉一半的坑。2.1 系统镜像选择与初始化设置创建云主机的时候镜像选Ubuntu 22.04 LTS 64 位。这里必须强调64 位虽然 DST 服务端历史上有 32 位版本但现在主推 64 位而且 64 位系统才能用满 4GB 以上内存。登录方式我强烈建议用SSH 密钥对而不是密码。云厂商控制台创建实例时可以选择密钥对或者自定义密码。密钥对的安全性高得多而且免去了每次输密码的麻烦。如果你只有一台电脑要登录用密钥最省事如果要在多台设备上管理可以自己生成一对密钥然后上传公钥。创建完成后控制台会给你一个公网 IP。这个 IP 后面填端口、连服务器都要用记下来。另外要注意很多云厂商的实例默认只有内网 IP公网 IP 是通过 NAT 映射的这在配置防火墙的时候有细微差别后面端口那一节会讲。首次登录ssh ubuntu你的公网IP如果用的是密钥文件ssh -i /path/to/your_key.pem ubuntu你的公网IP注意不同云厂商的默认用户名不一样Ubuntu 镜像一般是ubuntu有些是root。登录进去之后先别急着干别的跑几条命令看看家底。2.2 基础环境自检与系统更新登录后第一件事更新软件源sudo apt update sudo apt upgrade -y这条命令的含义是apt update刷新软件包索引不装东西apt upgrade把已安装的包升级到最新。第一次跑可能要几分钟耐心等。接着确认系统架构和内核uname -m # 应该输出 x86_64说明是 64 位 lsb_release -a # 看 Ubuntu 版本 free -h # 看内存 df -h # 看磁盘我习惯把这几条一次性跑完输出记在心里。特别是free -h你要清楚自己有多少可用内存因为后面决定开不开洞穴分片就靠它。然后装几个后面一定会用到的工具sudo apt install -y screen curl wget vim htop unzipscreen会话保持工具SSH 断开后进程还能继续跑开服必备。htop比top好用的进程查看器排查 CPU 和内存占用特别方便。vim编辑配置文件用你习惯nano也行。unzip、curl、wget装 SteamCMD 会用。在 Ubuntu 上软件源默认可能没开启multiverse仓库而 SteamCMD 的 32 位依赖有一部分在里面。先把仓库和 32 位架构支持打开sudo add-apt-repository multiverse -y sudo dpkg --add-architecture i386 sudo apt updatedpkg --add-architecture i386是告诉系统我允许安装 32 位的软件包。为什么需要 32 位因为 SteamCMD 本身是 32 位程序DST 服务端也依赖一批 32 位运行库。这行不加后面装依赖会一直报无法定位软件包。注意这三条命令执行顺序不能乱。先加 multiverse 仓库再加 i386 架构最后重新 update。顺序错了会出现依赖找不到的情况。2.3 专用账号与目录规划我强烈建议不要用 root 直接跑服务也不用默认的ubuntu账号跑而是专门建一个跑游戏的普通用户。理由有两个一是权限最小化万一服务端有漏洞影响范围可控二是目录清晰卸载重装的时候直接删用户目录就行。sudo adduser dst sudo usermod -aG sudo dst # 可选如果希望该用户能执行 sudo su - dst输入密码、一路回车dst这个账号就建好了。su - dst是切换到这个用户注意-号会加载它的环境变量。接下来规划目录。我习惯这套布局路径用途/home/dst/steamcmdSteamCMD 本体/home/dst/dst_server饥荒服务端程序文件/home/dst/.klei/DoNotStarveTogether/Cluster_1服务器配置和存档/home/dst/scripts自己写的启动/备份脚本为什么不把服务端装到/opt因为那样涉及 root 权限更新和改文件每次都要sudo很烦。放在用户 home 目录下权限问题一次性解决。创建目录mkdir -p ~/steamcmd ~/dst_server ~/scripts mkdir -p ~/.klei/DoNotStarveTogether到这里环境就干净了。接下来是真正的重头戏。3. 从零到能进游戏完整实操流程这一节是全文最长的部分每一步我都会说明为什么这么做而不是只给命令。你照着敲大概半小时能进游戏。3.1 安装 SteamCMD 和那些容易漏掉的 32 位依赖先说依赖。DST 服务端在 Linux 上有一批老依赖漏装任何一个都会卡在启动阶段。一次性装齐sudo apt install -y lib32gcc-s1 lib32stdc6 libcurl4-gnutls-dev:i386 \ libsdl2-2.0-0:i386 libcurl4-openssl-dev:i386如果报错说找不到lib32gcc-s1说明你的 Ubuntu 版本较老包名是lib32gcc1换成这个再跑一次。Ubuntu 20.04 之后的版本基本都是lib32gcc-s1。lib32gcc-s1是 SteamCMD 的硬依赖缺了它 SteamCMD 直接跑不起来。libcurl4-gnutls-dev:i386是 DST 服务端的依赖这就是那个经典报错error while loading shared libraries: libcurl-gnutls.so.4的元凶。然后是 SteamCMD 本体。切回dst用户su - dst cd ~/steamcmd curl -sqL https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz | tar zxvf -这条命令的意思是下载压缩包通过管道直接解压到当前目录不落中间文件。解压完你会看到steamcmd.sh这个脚本。先跑一次让它自己完成初始化./steamcmd.sh第一次运行会下载一堆东西进度条走完会进入Steam提示符。输入quit退出。这一步很关键很多人跳过它直接拉服务端结果因为 SteamCMD 还没自举完成而失败。初始化完成后还需要给 SteamCMD 建立steamclient.so的软链接否则后面跑服务端会报找不到 Steam 客户端库mkdir -p ~/.steam/sdk32 ~/.steam/sdk64 ln -sf ~/steamcmd/linux32/steamclient.so ~/.steam/sdk32/steamclient.so ln -sf ~/steamcmd/linux64/steamclient.so ~/.steam/sdk64/steamclient.soln -sf里的-s是建软链接-f是如果目标已存在就覆盖。这两条链接建好之后基本不会再报相关错误。3.2 拉取饥荒联机版服务端AppID 343050DST 专用服务端在 Steam 上的 AppID 是343050注意不是游戏本体的 322330填错了会拉下一个空壳。一条命令拉取cd ~/steamcmd ./steamcmd.sh force_install_dir /home/dst/dst_server login anonymous app_update 343050 validate quit拆解一下这条命令force_install_dir /home/dst/dst_server指定安装目录。这一项必须放在login之前否则 SteamCMD 会用默认目录你就得到处找文件了。login anonymous匿名登录。DST 专服是免费分发的不需要账号密码这是它比很多游戏专服友好的地方。app_update 343050 validate更新到最新版并校验文件完整性。validate会重新检查每个文件发现损坏就重新下载第一次装建议带上。quit装完退出别让它干等着。跑完检查一下目录ls ~/dst_server/bin64/应该能看到dontstarve_dedicated_server_nullrenderer_x64这个可执行文件。如果bin64不存在只有bin说明你拉到了 32 位版本那就是系统架构或者 AppID 的问题回头检查。顺手把可执行权限确认一下chmod x ~/dst_server/bin64/dontstarve_dedicated_server_nullrenderer_x64实操心得如果你在中国大陆的机器上拉取速度可能比较慢。可以重复执行同一条命令SteamCMD 支持断点续传第二次会快很多。不建议中途 CtrlC容易留下半个文件导致校验失败。3.3 申请服务器令牌 cluster_token.txt这是新手最容易卡住的一步也是整个流程里唯一必须依赖游戏账号的环节。为什么需要令牌因为饥荒联机版需要知道这个世界是谁开的。服务器令牌Cluster Token就是你向官方登记我要用这个账号开一个世界的凭证。没有它服务端启动时会报Invalid cluster token然后直接退出。申请步骤在浏览器里操作不在服务器上登录你的饥荒联机版绑定账号就是你能正常玩游戏的那个账号。进入账号的服务器管理页面找到游戏服务器或Game Servers入口。点击添加新服务器随便填个名字比如我的长期档。页面会生成一串很长的字符这就是令牌。把这串字符复制下来回到服务器上创建文件mkdir -p ~/.klei/DoNotStarveTogether/Cluster_1 vim ~/.klei/DoNotStarveTogether/Cluster_1/cluster_token.txt把令牌粘进去注意末尾不要有换行、不要有空格。这一点非常关键用vim的话粘完之后按Esc输入:set noeol再:wq保存。或者用printf写入printf %s 你的令牌内容 ~/.klei/DoNotStarveTogether/Cluster_1/cluster_token.txtprintf不像echo会自动加换行这里更稳妥。注意令牌和账号是绑定的。换账号开服要重新申请。不要把令牌文件发给别人也不要提交到任何公开的代码仓库它相当于你服务器的一把钥匙。3.4 目录结构与配置文件逐项拆解DST 的配置目录结构是固定的理解它比死记硬背强。整个Cluster_1目录长这样~/.klei/DoNotStarveTogether/Cluster_1/ ├── cluster_token.txt # 服务器令牌 ├── cluster.ini # 集群整个世界配置 ├── adminlist.txt # 管理员名单 ├── whitelist.txt # 白名单 ├── blocklist.txt # 黑名单 ├── Master/ # 地面世界分片 │ ├── server.ini # 该分片的网络配置 │ ├── worldgenoverride.lua # 世界生成参数 │ ├── modoverrides.lua # 模组配置 │ └── save/ # 存档 └── Caves/ # 洞穴世界分片 ├── server.ini ├── worldgenoverride.lua ├── modoverrides.lua └── save/cluster.ini整个世界共用的设置。这是最需要花心思的文件。我的实际配置[GAMEPLAY] game_mode survival max_players 6 pvp false pause_when_empty true vote_kick_enabled true [NETWORK] cluster_name 我的饥荒世界 cluster_description 长期档欢迎萌新文明游戏 cluster_password cluster_intention cooperative offline_cluster false lan_only_cluster false tick_rate 15 max_snapshots 6 [MISC] console_enabled true [SHARD] shard_enabled true bind_ip 127.0.0.1 master_ip 127.0.0.1 master_port 10888 cluster_key 换成一串你自己编的密码逐项解释几个关键项max_players最大人数。别贪心填 20你的带宽和内存扛不住。填多少前面配置选型表就对应哪一档。pause_when_empty true没人在线时暂停世界。这是长期档的救命设置没人玩的时候不消耗资源也避免季节白白流逝。tick_rate 15服务器逻辑帧率默认 15。有人会调到 30 追求流畅但那会显著增加 CPU 占用配置不够别动它。max_snapshots 6自动存档保留几个快照。默认值偏小调大一点容错更高但会占磁盘。[SHARD]这一段是分片通信配置。bind_ip和master_ip都填127.0.0.1因为地面和洞穴跑在同一台机器上走本地回环最快也最安全。master_port是两个分片的内部通信端口不需要对外开放。cluster_key分片之间的通信密钥。如果开了洞穴两个分片的这个值必须完全一致否则洞穴连不上地面。随便编一串足够长的字符就行。server.ini每个分片各自的网络配置。地面Master的配置[NETWORK] server_port 10999 [SHARD] is_master true [STEAM] master_server_port 27018 authentication_port 8768洞穴Caves的配置[NETWORK] server_port 10998 [SHARD] is_master false name Caves [STEAM] master_server_port 27019 authentication_port 8769这里三个数字是最容易出错的server_port玩家实际连接用的游戏端口。地面和洞穴必须不同默认就是 10999 和 10998。master_server_port给 Steam 服务器列表用的查询端口两个分片也不能一样。authentication_port认证端口同样要错开。is_master和name是分片身份标识写错会导致洞穴分片无法被识别。这些端口后面全部要在防火墙里放行先记住这套数字。worldgenoverride.lua世界生成参数。这个文件控制地图的大小、季节长度、资源丰富度。举个例子创建一个大世界 长秋天的配置return { override_enabled true, preset SURVIVAL_TOGETHER, overrides { world_size huge, autumn verylong, winter short, day longdusk, spawnmode relaxed, krampus never, }, }改完这个文件必须在第一次生成世界之前生效。世界一旦生成存档里的地图就固化了再改这个文件不会回溯生效。如果你想改只能删掉对应分片的save目录重新生成代价是整个世界的进度清零。所以第一次开服之前一定要把世界参数想清楚。提示这个文件在部分新版本文档里叫leveldataoverride.lua。两个名字服务端都认我一般用worldgenoverride.lua旧版本兼容性更好。放在哪个分片目录下就控制哪个分片的世界洞穴的世界参数放Caves/worldgenoverride.lua。adminlist.txt管理员名单。想把好友设成管理员需要他的 Klei 用户 ID格式是KU_开头的字符串。把他拉进服务器后控制台输入c_listallplayers()就能看到所有人的 ID或者让他在游戏里查看自己的账号信息。文件里一行一个KU_xxxxxxxx KU_yyyyyyyy管理员能在游戏里用控制台命令比如c_give、c_spawn、踢人等等长期档给一两个信得过的人就够了。3.5 启动脚本与后台常驻方案服务端程序必须在它的工作目录下运行而且要加正确的参数。手动启动长这样cd ~/dst_server/bin64 ./dontstarve_dedicated_server_nullrenderer_x64 -console -cluster Cluster_1 -shard Master参数含义-console启用交互式控制台可以在终端里直接敲游戏命令。-cluster Cluster_1指定配置目录名对应~/.klei/DoNotStarveTogether/Cluster_1。-shard Master指定启动哪个分片地面是Master洞穴是Caves。问题来了SSH 一断这个进程就没了。所以必须让它后台常驻。两种方案我都用过各有取舍。方案一screen。适合临时调试和快速上手。screen -S dst_master cd ~/dst_server/bin64 ./dontstarve_dedicated_server_nullrenderer_x64 -console -cluster Cluster_1 -shard Master # 按 CtrlA 再按 Ddetach 出来想回去看看screen -r dst_master。洞穴同理换个会话名dst_caves。方案二systemd。适合长期运行能做开机自启和崩溃自动重启。用sudo创建/etc/systemd/system/dst-master.service[Unit] DescriptionDont Starve Together Master Shard Afternetwork.target [Service] Typesimple Userdst WorkingDirectory/home/dst/dst_server/bin64 ExecStart/home/dst/dst_server/bin64/dontstarve_dedicated_server_nullrenderer_x64 -console -cluster Cluster_1 -shard Master Restarton-failure RestartSec15 StandardOutputappend:/home/dst/logs/master.log [Install] WantedBymulti-user.target洞穴的服务文件把Master换成Caves日志文件名也换掉Description改一下。启用sudo mkdir -p /home/dst/logs sudo chown dst:dst /home/dst/logs sudo systemctl daemon-reload sudo systemctl enable --now dst-master sudo systemctl enable --now dst-caves查看状态和日志sudo systemctl status dst-master tail -f /home/dst/logs/master.logRestarton-failure配合RestartSec15的效果是服务端崩了之后等 15 秒自动拉起来。DST 服务端跑久了容易因为内存问题崩这个设置能救你很多个凌晨。实操心得我现在的做法是 systemd 管常驻但会在启动参数里加不加-console上纠结过。结论是加上去没坏处日志里能看到游戏内控制台输出排查问题时信息更全。如果你完全不打算在终端里发命令去掉也行。3.6 端口、防火墙与安全组这是最容易看起来都配好了但就是连不上的环节。DST 需要放行的端口端口协议用途是否需要对外开放10999UDP地面世界游戏端口是10998UDP洞穴世界游戏端口是10888TCP UDP分片内部通信否仅本机27018UDP地面 Steam 查询端口是27019UDP洞穴 Steam 查询端口是8768UDP地面认证端口是8769UDP洞穴认证端口是注意全是 UDP除了分片内部那个。很多人照着教程放行了 TCP结果连不上就是因为协议选错了。服务器系统层面的防火墙Ubuntu 默认是 ufwsudo ufw allow 10999/udp sudo ufw allow 10998/udp sudo ufw allow 27018/udp sudo ufw allow 27019/udp sudo ufw allow 8768/udp sudo ufw allow 8769/udp sudo ufw allow 22/tcp # SSH千万别忘了否则自己都进不去 sudo ufw enable sudo ufw status numbered最后一条能列出所有规则确认一下都加上了。加22/tcp这一步必须在ufw enable之前不然你启用防火墙的瞬间就把自己的 SSH 连接切断了只能去控制台救急。云厂商的安全组是另一层。很多人只改了系统防火墙忘了控制台里的安全组结果一直连不上。这两层是与的关系任何一层没放行都不通。去控制台的安全组或者叫防火墙规则、网络 ACL里把上面那六个 UDP 端口加进去来源填0.0.0.0/0表示允许所有 IP协议选 UDP。SSH 的 22 端口一般默认已经开了。配完之后可以用在线端口检测工具从外部测一下 10999/udp 通不通。到这里服务器就起来了。在游戏里点浏览世界搜索你的世界名字应该能看到了。搜不到的话进收藏或者直接让朋友翻服务器列表有时候有延迟。4. 常见问题与排查实录这部分是我踩过的坑的合集也是这篇文章里最值钱的部分。我把高频问题和排查思路整理成表方便你对照。4.1 高频报错速查表现象大概率原因解决办法libcurl-gnutls.so.4找不到缺 32 位 curl 库装libcurl4-gnutls-dev:i386或建软链接Invalid cluster token令牌文件有问题检查文件末尾有无换行、令牌是否过期启动后秒退日志无输出存档损坏或配置语法错检查cluster.ini和server.ini格式游戏里搜不到服务器端口没放行 / 只在局域网检查 UDP 放行和lan_only_cluster洞穴进不去分片密钥不一致确认两个server.ini的cluster_key相同玩一段时间内存爆满被杀DST 内存泄漏定时重启加大内存进游戏一直正在连接客户端版本与服务端不一致更新服务端到最新版世界能搜到但密码错误特殊字符编码问题密码用纯字母数字libcurl-gnutls.so.4这个报错我要单独多说两句因为它太常见了。如果你装了 32 位库还是不行可以手动建一个软链接指向系统里已有的 32 位 curlln -sf /usr/lib/i386-linux-gnu/libcurl.so.4 /home/dst/dst_server/lib32/libcurl-gnutls.so.4原理是服务端在lib32目录下找libcurl-gnutls.so.4这个名字而 Ubuntu 装出来的库名可能是libcurl.so.4只是名字对不上而已建个软链接骗过它就完事了。4.2 几个只有踩过才知道的坑坑一世界参数改晚了。我第一次开服跑了三天才想起来世界应该调大一点。改完worldgenoverride.lua重启世界纹丝不动。后来才明白世界生成是一次性的改参数必须删档重来。所以第一次开服前把地图大小、季节、资源丰度、是否开洞穴全部定死这是最省事的做法。坑二模组一装洞穴就崩。模组的配置文件必须同时放在Master/modoverrides.lua和Caves/modoverrides.lua里。只在 Master 里配了洞穴分片加载时会找不到模组然后报错退出。这个坑我卡了整整一个下午。坑三以为是带宽问题其实是 CPU。有段时间朋友反映游戏里走路一卡一卡的我第一反应是加带宽加完没用。后来用htop一看CPU 一个核心长期跑满。原因是装了太多模组模组的逻辑运算都落在单线程上。换了个高主频的机型之后问题消失。卡顿先看 CPU 单核占用再看内存最后才看带宽。坑四自动存档保留了太多磁盘写满。max_snapshots设太大加上长期不清理备份磁盘写满会导致存档写入失败直接把档写坏。我现在的做法是快照保留 6 个另外用脚本每周做一次完整备份并保留最近 4 周。坑五防火墙只改了一层。前面说过系统防火墙和云安全组是两层。我最开始改完ufw就以为搞定了怎么都连不上折腾了两小时才发现安全组一条规则都没有。提示排查连不上问题的顺序永远是——服务端进程活着吗ps aux | grep dontstarve→ 日志里有报错吗tail -f 日志→ 端口监听了吗sudo ss -ulnp | grep 10999→ 系统防火墙放行了吗 → 安全组放行了吗。从内到外一层层查比东一榔头西一棒子快得多。5. 上线之后的运维更新、备份与模组服务器能跑起来只是开始长期档真正的门槛是运维。这一节讲我怎么让它稳定跑一年不用天天盯着。5.1 版本更新与优雅重启饥荒本体更新频率不低服务端也要跟着更新否则新旧版本客户端连不上。更新流程# 停服 sudo systemctl stop dst-master dst-caves # 更新服务端 cd ~/steamcmd ./steamcmd.sh force_install_dir /home/dst/dst_server login anonymous app_update 343050 validate quit # 重新拉起 sudo systemctl start dst-master dst-caves为什么要先停服再更新因为更新会替换bin64目录下的可执行文件如果进程还在跑文件可能被占用导致更新不完整出现更新了但还是旧版本的诡异情况。想省事的话写个脚本#!/bin/bash set -e sudo systemctl stop dst-master dst-caves cd /home/dst/steamcmd ./steamcmd.sh force_install_dir /home/dst/dst_server login anonymous app_update 343050 validate quit sudo systemctl start dst-master dst-caves echo 更新完成 $(date)set -e的作用是任何一步失败就立刻停止避免在更新失败的情况下把服务拉起来。另外我强烈建议配一个定时重启。DST 服务端的内存泄漏是客观存在的与其等它崩不如主动重启。用 cron 每天凌晨 5 点重启一次crontab -e # 添加一行 0 5 * * * /home/dst/scripts/restart.sh /dev/null 21凌晨重启玩家基本不在线体验最好。重启前脚本里可以先发一条公告不过那属于进阶操作了。5.2 存档备份的正确姿势长期档最怕的就是丢档。我的备份策略是三层第一层服务端自带的快照。max_snapshots控制每次自动存档会生成一个快照存在save目录里。这一层是分钟级的用来应对误操作比如有人手滑把基地烧了回滚到十分钟前就行。缺点是它在同一个磁盘上磁盘挂了就一起没。第二层本地定时打包。每天凌晨打包整个Cluster_1目录#!/bin/bash BACKUP_DIR/home/dst/backups mkdir -p $BACKUP_DIR tar czf $BACKUP_DIR/cluster_$(date %Y%m%d_%H%M).tar.gz \ -C /home/dst/.klei/DoNotStarveTogether Cluster_1 # 只保留最近 7 个备份 ls -t $BACKUP_DIR/cluster_*.tar.gz | tail -n 8 | xargs -r rm --tar czf是打包加压缩-C指定工作目录。最后一行ls -t按时间排序tail -n 8取第 8 个之后的xargs rm删掉实现只留 7 份。这个清理策略很重要不然备份会把磁盘吃光。第三层异地备份。把每周的完整备份下载到本地电脑或者推到另一个存储空间。这一层是应对云主机整机故障的频率不用高一周一次足够。注意打包备份前最好先让服务端完成一次自动存档否则可能备份到一个写了一半的存档文件。简单做法是在备份脚本里先执行一次重启让服务端在关闭时写盘。不要直接kill -9服务端进程那样有很大概率把存档写坏。systemd 的systemctl stop会发优雅终止信号等它写盘这是安全的做法。5.3 模组管理与性能权衡模组是长期档的乐趣来源也是性能杀手。装模组的正确流程分两步。第一步声明要下载哪些模组。编辑服务端目录下的mods/dedicated_server_mods_setup.luaServerModSetup(378160973) ServerModSetup(458587300) ServerModSetup(1196890102)每行一个括号里是 Steam 创意工坊的模组 ID。这个文件的作用是告诉服务端启动时把这些模组下载下来。服务端启动时会自动拉取下载到dst_server/mods/workshop-xxxxx目录。第二步在每个分片里启用模组。编辑Master/modoverrides.lua和Caves/modoverrides.luareturn { [workshop-378160973] { enabled true }, [workshop-458587300] { enabled true }, [workshop-1196890102] { enabled true, configuration_options {} }, }configuration_options是模组的配置项不同模组不一样一般模组的介绍页面会说明。注意这两个文件的内容必须保持一致只在一边配了另一方会报错退出这是我前面提到的坑。装多少个模组合适我的经验是小型功能模组比如显示血量、快捷栏装十几个问题不大大型模组比如增加大量生物、重构地图机制的最多两三个而且装之前先单独测试。判断标准很简单装完之后用htop看 CPU 单核占用如果稳定超过 60%就该考虑砍模组了。另外每次更新服务端之后模组也建议顺手更新一下。有些模组会跟着游戏版本更新旧版本模组在新版服务端上会报错。最省事的做法是删掉dst_server/mods目录让服务端重新下载一遍——前提是你的dedicated_server_mods_setup.lua文件完整。我个人在实际操作中的体会是开服这件事真正难的从来不是敲命令而是第一次把配置想清楚。世界参数、玩家上限、模组清单、备份策略这些东西在开服前花一个小时定下来能省掉后面无数次删档重来的痛苦。我最早那个档就是因为世界参数没想好改来改去删了三次一年多的进度全没了。现在这套流程跑下来一个长期档稳稳当当半年不用管偶尔上去看一眼日志就是全部工作量。还有个小技巧分享给准备长期开服的人把cluster.ini、server.ini、modoverrides.lua这几个文件在本地电脑上也存一份并且加注释写明每一项为什么这么改。半年之后你大概率会忘记当时为什么设了这个值有个备忘录能省掉重新研究一遍的时间。这套配置本身就是你这个世界最重要的资产之一比存档还值得备份。
返回列表