环境要求

  • Internet (Upload) = 8Kbytes / player / s
  • Ram = around 65Mbytes/player

搭建的环境配置

本机,使用VMware 开Linux虚拟机搭建:

系统:centos 7 x64

参数:2核2G

平台:Steam

ssh软件:Xshell

前置工作

饥荒的运行与本地跑是一样需要载体,这里我们使用Steam平台:

yum -y update

yum -y install glibc.i686 libstdc++.i686 libcurl.i686 screen#安装环境依赖

其他可能需要的依赖:

yum install -y wget #链接下载
yum install -y unzip zip #解压缩
yum install lrzsz -y #上下载文件

新建用户,为了服务器的安全请不要随意使用root账号操作!

useradd -m dst #新增用户 dst
passwd dst #设置密码,公网服务器的密码一定要非常非常复杂,否则容易被爆破!!!

为dst用户添加sudo权限

chmod 777 /etc/sudoers
vi /etc/sudoers

找到root ALL=(ALL) ALL,按 i 键进入编辑,在下面添加新的一行:

dst    ALL=(ALL)    ALL

ESC退出编辑,然后在vi键入命令 :wq 保存并退出。

恢复/etc/sudoers的访问权限为440:

chmod 440 /etc/sudoers

切到dst账号进行操作:

su dst

安装Steam CMD

mkdir ~/steamcmd #创建安装位置
cd ~/steamcmd
wget https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz #下载
tar -zxvf steamcmd_linux.tar.gz ##解压
./steamcmd.sh +login anonymous +force_install_dir ~/dst +app_update 343050 validate +quit

之后会进行下载更新,耐心等待一会。

检查依赖

cd ~/dst/bin
./dontstarve_dedicated_server_nullrenderer

这时候可能会显示

./dontstarve_dedicated_server_nullrenderer: error while loading shared libraries: libcurl-gnutls.so.4: cannot open shared object file: No such file or directory

在CentOS下没有这个链接库,可以用其它的库代替一下

root权限执行如下命令:

sudo ln -s /usr/lib/libcurl.so.4 /usr/lib/libcurl-gnutls.so.4 && ldconfig

另外也可以使用如下命令来查看程序缺少的动态链接库:

ldd ./dontstarve_dedicated_server_nullrenderer

这时候我们再次执行./dontstarve_dedicated_server_nullrenderer,你会看到如下日志:

[00:00:02]: [200] Account Failed (6): "E_INVALID_TOKEN"
[00:00:02]: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
[00:00:02]: !!!! Your Server Will Not Start !!!!
[00:00:02]: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
[00:00:02]: No auth token could be found.
[00:00:02]: Please visit https://accounts.klei.com/account/game/servers?game=DontStarveTogether
[00:00:02]: to generate server configuration files
[00:00:02]: 
[00:00:02]: Alternatively generate a cluster_token you can
[00:00:02]: open the console from a logged-in game
[00:00:02]: client with the tilda key (~ / ù) and type:
[00:00:02]: TheNet:GenerateClusterToken()
[00:00:02]: This will create 'cluster_token.txt' in
[00:00:02]: your client settings directory. Copy this
[00:00:02]: into your cluster settings directory.
[00:00:02]: [Connect] PendingConnection::Reset(true)

我们可以在~/.klei/DoNotStarveTogether目录下通过命令看到默认的一个配置Cluster_1,如果想在~目录看到.klei需要使用ls -la命令。

配置准备

这里我们只介绍比较快捷的方式:

创建本地存档

首先在本地的steam开一个新存档,选择好游戏模式、最大玩家数、mod等一系列初始化世界的配置之后开始游戏,直到加载出角色选择界面,直接退出。到时候我们会以当前的配置作为服务器世界初始化的配置。

Klei官方添加服务器并获取token

使用Steam账号登录:https://accounts.klei.com/login

第一步
第一步

添加新服务器:
第二步
第二步

这一串被打码的就是服务器票据(token)

修改存档配置

windows下的路径一般是

文档/Klei/DoNotStarveTogether/你的steamId一串数字/Cluster_X

X是你的当前存档的编号,比如排第4个就是Cluster_4,copy出我们之前创建的存档信息:

修改cluster_token.txt的内容换成上面的token

上传本地存档到服务器

这里我们就用Cluster_4作为示例。

压缩Cluster_4文件夹为zip格式

cd ~/.klei/DoNotStarveTogether

删除默认的配置

rm -rf ~/.klei/DoNotStarveTogether/Cluster_*

使用 rz 命令选择我们的压缩包进行上传,可以看到已经上传OK了

[dst@localhost DoNotStarveTogether]$ ll
总用量 1944
-rw-r--r--. 1 dst dst 1988490 9月   1 2020 Cluster_4.zip

解压

unzip Cluster_4.zip -d .

因为之前打包是把Cluster_4这个文件夹一起打包了,所以解压后:

[dst@localhost DoNotStarveTogether]$ ll
总用量 1944
drwxrwxr-x. 4 dst dst      77 9月   1 00:07 Cluster_4
-rw-r--r--. 1 dst dst 1988490 9月   1 2020 Cluster_4.zip

删除不必要的东西

rm -rf Cluster_4.zip

添加mod配置

在服务器上想要运行我们在本地配置的mod必然需要配置下载

cd ~/dst/mods/

里面有一个dedicated_server_mods_setup.lua文件

文件内容配置格式ServerModSetup("创意工坊id"),示例:

ServerModSetup("1084023218")
ServerModSetup("1207269058")
ServerModSetup("1418746242")
ServerModSetup("1458450094")
ServerModSetup("1699194522")
ServerModSetup("1898292532")
ServerModSetup("1991746508")
ServerModSetup("2032577827")
ServerModSetup("2078243581")
ServerModSetup("2121392316")
ServerModSetup("2126680407")
ServerModSetup("2151452010")
ServerModSetup("2174620235")
ServerModSetup("347079953")
ServerModSetup("353697884")
ServerModSetup("356930882")
ServerModSetup("367546858")
ServerModSetup("374550642")
ServerModSetup("375850593")
ServerModSetup("375859599")
ServerModSetup("378160973")
ServerModSetup("380423963")
ServerModSetup("458940297")
ServerModSetup("463621557")
ServerModSetup("466732225")
ServerModSetup("501385076")
ServerModSetup("543945797")
ServerModSetup("551324730")
ServerModSetup("623749604")
ServerModSetup("646227245")
ServerModSetup("666155465")
ServerModSetup("784481384")

你可以根据存档里的Cluster_4/Master/modoverrides.lua文件的内容进行配置

例如:

["workshop-1458450094"]={
    ["configuration_options"]={
      [""]=0,
      ["houndstooth"]=false,
      ["livinglog"]=false,
      ["log"]=false,
      ["mode"]="fix",
      ["retrapfix"]=60,
      ["retraprandomx"]=10,
      ["retraprandomy"]=120,
      ["rope"]=false,
      ["stinger"]=false 
    },
    ["enabled"]=true 
  },

这里的workshop-1458450094的1458450094就是我们要的。

在本地都编辑完毕后将配置好的内容通过vi dedicated_server_mods_setup.lua编辑,放在文件末尾并保存。并把这个文件设置成只读

chmod 444  dedicated_server_mods_setup.lua

启动脚本

在真正运行服务器之前,需要先写一个服务器启动脚本。

脚本命名为startup.sh,放置于~目录下

cd ~
vi startup.sh

内容:

#!/bin/bash

steamcmd_dir="$HOME/steamcmd"
install_dir="$HOME/dst"
cluster_name="Cluster_4"
dontstarve_dir="$HOME/.klei/DoNotStarveTogether"

function fail()
{
        echo Error: "$@" >&2
        exit 1
}

function check_for_file()
{
    if [ ! -e "$1" ]; then
            fail "Missing file: $1"
    fi
}

cd "$steamcmd_dir" || fail "Missing $steamcmd_dir directory!"

check_for_file "steamcmd.sh"
check_for_file "$dontstarve_dir/$cluster_name/cluster.ini"
check_for_file "$dontstarve_dir/$cluster_name/cluster_token.txt"
check_for_file "$dontstarve_dir/$cluster_name/Master/server.ini"
check_for_file "$dontstarve_dir/$cluster_name/Caves/server.ini"
check_for_file "$install_dir/bin"

cd "$install_dir/bin" || fail

run_shared=(./dontstarve_dedicated_server_nullrenderer)
run_shared+=(-console)
run_shared+=(-cluster "$cluster_name")
run_shared+=(-monitor_parent_process $$)
run_shared+=(-shard)

"${run_shared[@]}" Caves | sed 's/^/Caves: /' &
"${run_shared[@]}" Master | sed 's/^/Master: /'

赋予脚本文件以执行权限:

chmod u+x ~/startup.sh 

防火墙开放端口

查看防火墙状态:

sudo firewall-cmd --state

如果是running就需要开放端口,强烈建议开启防火墙!!

sudo firewall-cmd --zone=public --add-port=10998/udp --permanent
sudo firewall-cmd --zone=public --add-port=10999/udp --permanent
sudo firewall-cmd --reload

查看当前已开放的端口:

sudo firewall-cmd --list-ports
输出:10998/udp 10999/udp

如果真的不想开端口,想直接关闭防火墙:

sudo systemctl stop firewalld.service

启动游戏

开启虚拟窗口:

screen -S myDSTserver

运行脚本:

sh startup.sh

执行之后就会开始跑了,如果有安装mod会先下载mod,耐心等待,只有mod都下载完才会真正跑起来,看到如下日志即执行成果,按下Ctrl+A+D最小化虚拟窗口,后台运行服务器。

Caves: [00:02:54]: Validating portal[10] <-> 1[10] (active)
Caves: [00:02:54]: Validating portal[3] <-> 1[3] (active)
Caves: [00:02:54]: Validating portal[9] <-> 1[9] (active)
Caves: [00:02:54]: Validating portal[2] <-> 1[2] (active)
Caves: [00:02:54]: Validating portal[4] <-> 1[4] (active)
Caves: [00:02:54]: Validating portal[1] <-> 1[1] (active)
Caves: [00:02:54]: Validating portal[5] <-> 1[5] (active)
Caves: [00:02:54]: SimLuaProxy::QueryServer()
Caves: [00:02:55]: [Shard] secondary shard LUA is now ready!
Caves: [00:02:55]: Sim paused
Master: [00:03:01]: Registering master server in Sing lobby

如果想恢复窗口,使用screen -r以下是一个示例,74234.myDSTserver就是查看的session-id

[dst@localhost ~]$ screen -S myDSTserver
[detached from 74234.myDSTserver]
[dst@localhost ~]$ screen -r 74234.myDSTserver
[detached from 74234.myDSTserver]

开始游戏

服务器列表
服务器列表

进入游戏
进入游戏

更新游戏/MOD

列出当前的screen

screen -ls
[dst@localhost root]$ screen -ls
There is a screen on:
    74234.myDSTserver    (Detached)
1 Socket in /var/run/screen/S-dst.

杀掉进程

 screen -dr 74234.myDSTserver -X quit

更新

cd ~/steamcmd
./steamcmd.sh +login anonymous +force_install_dir ~/dst +app_update 343050 validate +quit

注意更新之后需要重新修改dedicated_server_mods_setup.lua ,如果你没有把这个文件设置成可读的话

开启虚拟窗口:

screen -S myDSTserver

运行脚本:

cd ~
sh startup.sh

按下Ctrl+A+D最小化虚拟窗口,后台运行服务器。

内存占用

top

内存占用
内存占用

可以看到洞穴和地上世界各占700M左右。所以内存要大一些。

其他可选配置

copy[[重写]饥荒服务器搭建 配置篇](https://www.vincehut.top/index.php/2020/03/19/重写饥荒服务器搭建-配置篇/#toc-head-5)

管理员

管理员拥有控制台指令权限,比如可以实现回档、创建新世界、开挂等等。你只需要把玩家的id放到adminlist.txt里,一行一个。

举个栗子:

KU_xxxxx
KU_xxxxxxxx
KU_xxxxxxxx
KU_xxxxxxxx
KU_BAv10492

黑名单

我不想让熊孩子跑进我的服务器,我想屏蔽他!从日志中找到他的 SteamID64,添加到 blocklist.txt 中,一行一个

白名单

连接服务器的人太多,导致管理员都进不来,怎么办呢?编辑 whitelist.txt 和cluster.ini。
whitelist.txt和blocklist.txt很像,但是里面的内容是以 KU_ 开头的用户id
cluster.ini中的whitelist_slots字段限制了服务器的最大玩家数。 现在假设最大玩家数为6,whitelist_slotst里有2个玩家,所以实际上普通玩家的最大数量是4

参考

http://blog.ttionya.com/article-1235.html

https://zhuanlan.zhihu.com/p/105219404

https://steamcommunity.com/sharedfiles/filedetails/?id=590565473