如何在CentOS7(Linux)安装一个或多个欧洲卡车模拟2(欧卡2)专用服务器


若条件允许,建议在对服务器操作前拍摄快照,以防误操作方便回滚。

此教程需要你对Linux的基础使用有一定了解。至少了解一种文本编辑器的基本使用,例如vim(如果你安装了图形界面可以忽略)。至少了解一种将文件上传至服务器的方法,例如ftp。

基础配置

安装服务器

以root用户身份创建steam用户,并创建steam用户的主目录

bash 复制代码
useradd -m steam

设置steam用户密码

bash 复制代码
passwd steam

安装运行 SteamCMD 所需的依赖项

bash 复制代码
yum install glibc.i686 libstdc++.i686

切换到steam用户【!!!注意这里切换了用户】,为 SteamCMD 创建一个目录并切换到它

bash 复制代码
mkdir ~/Steam && cd ~/Steam

下载并解压适用于 Linux 的 SteamCMD

bash 复制代码
curl -sqL "https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz" | tar zxvf -

启动 SteamCMD

bash 复制代码
/home/steam/Steam/steamcmd.sh

在SteamCMD中设置欧卡2安装目录

bash 复制代码
force_install_dir ./ets2/

使用以下命令匿名登录,匿名登录后可以下载大部分游戏服务器

bash 复制代码
login anonymous

使用命令安装或更新欧卡2,欧卡2的Steam应用程序ID为1948160,美卡为2239530

bash 复制代码
app_update 1948160

等待安装完成,使用quit或者exit或者按下Ctrl+C退出steamCMD

bash 复制代码
exit

配置和运行服务器

如果你直接通过绝对路径执行/home/steam/Steam/ets2/bin/linux_x64/server_launch.sh

可能会收到错误:/home/steam/Steam/ets2/bin/linux_x64/server_launch.sh: line 2: ./eurotrucks2_server: No such file or directory,解决方案请往后看。

切换到服务器程序所在目录

bash 复制代码
cd /home/steam/Steam/ets2/bin/linux_x64

运行服务器,此种方式在关闭ssh会话时也会关闭服务器

bash 复制代码
./server_launch.sh

服务器执行后可在此处找到日志文件:/home/steam/.local/share/Euro Truck Simulator 2/server.log.txt

在尝试运行服务器的过程中,如果你收到报错如下(如果没有,请跳过):

./eurotrucks2_server: error while loading shared libraries: libatomic.so.1: cannot open shared object file: No such file or directory

请切换至root权限安装依赖项libatomic

复制代码
yum install libatomic

在尝试运行服务器的过程中,如果你收到报错如下(如果没有,请跳过):

./eurotrucks2_server: error while loading shared libraries: libX11.so.6: cannot open shared object file: No such file or directory

请切换至root权限安装依赖项libatomic

复制代码
yum install libX11

在尝试运行服务器的过程中,如果你收到报错如下(如果没有,请跳过):

*** ERROR *** : [MP] Error: Server packages file not found. This is required to load proper map, DLCs and mods.
*** ERROR *** : [MP] Error: Use "export_server_packages" command in game to export server game settings.
*** ERROR *** : [MP] Error: See server_readme.txt.
*** ERROR *** : [MP] Error: Server was teminated.

服务器程序已经为你创建好了/home/steam/.local/share/Euro Truck Simulator 2目录,需要你将 server_packages.dat 文件和 server_packages.sii 这两个文件上传到此目录,具体操作流程如下:

现在从你的服务器回到你的电脑本身,在你的电脑上为你的欧卡2游戏开启飞行模式(开发者模式和控制台)。如果你不会开启飞行模式,请点击文章结尾处链接查看教程或者自行在搜索引擎上查找相关教程。

在欧卡2中按下Esc下面的 "~" 按键(在Tab上面)呼出控制台,在控制台键入命令 export_server_packages 并回车, 此时C:\Users\你的用户名\Documents\Euro Truck Simulator 2 会生成 server_packages.datserver_packages.sii 这两个文件。

然后把 server_packages.dat 文件和 server_packages.sii 这两个文件上传到服务器 /home/steam/.local/share/Euro Truck Simulator 2目录下。

关于本地文件上传至服务器,你可以在服务器上配置ftp服务,或者在服务器上安装管理面板等。具体过程稍显繁琐就不再赘述了,如果暂时还不会请自行在搜索引擎查询学习。

欧卡2服务器配置文件server_config_ai.sii 的详细介绍请参考文章结尾处。

那么如何让服务器程序能够在后台运行,不会随ssh连接关闭而关闭呢?

尝试使用nohup让程序后台执行,nohup.out会将程序在终端打印的信息收集到server_launch.sh同级目录下的nohup.out文件里。

执行命令后会提示【nohup: 忽略输入并把输出追加到"nohup.out"】,你可以忽略此提示。

bash 复制代码
nohup ./server_launch.sh &

如有你的服务器具有公网ip请开放如下端口,以便其他玩家在服务器列表检索

如果你未曾开放以下端口,其他玩家只能搜索数字id找到你的房间

请在先在本机防火墙开放以下端口,如果你使用云服务器请在服务商网站控制台安全组内再次开放端口

来自官网文档的解释:

connection_virtual_portquery_virtual_port是用于连接到服务器的虚拟端口。允许的范围为 <100,200>。

connection_dedicated_portand query_dedicated_port是 Steam 游戏服务器 API 用来填充会话浏览器的物理端口。对于局域网游戏,query_dedicated_port范围为 <27015、27020>。

至此你的服务器基础配置已经完成,你的服务器已经可以正常使用了。

:warning: 注意

如果你只需要简单的搭建一个专用房间,那么下面进阶配置的内容可看可不看。

在使用了一段时间之后,我发现使用nohup对服务器进程进行保活时,服务器进程或许几个月都还在,或许几天就挂了。我猜的话大概是代码车进房或者是有人故意跑进来炸房的,不过也可能单纯是我自己没弄好。后面没怎么玩了也就没折腾了。如果你只是想简单弄一下,并且时常能连上服务器瞅两眼,那么我觉得用nohup就行。如果你希望长期稳定运行的话,还是另外找方法保活吧。

进阶配置

通过绝对路径执行server_launch.sh

为了避免运行前需要先切换目录,修改/home/steam/Steam/ets2/bin/linux_x64/server_launch.sh文件

1.使用vim编辑器打开/home/steam/Steam/ets2/bin/linux_x64/server_launch.sh

bash 复制代码
vi /home/steam/Steam/ets2/bin/linux_x64/server_launch.sh

2.按下i键,编辑文档如下

bash 复制代码
#! /bin/sh
# LD_LIBRARY_PATH='$ORIGIN/../../linux64' ./eurotrucks2_server
# 将 "./eurotrucks2_server" 改为绝对路径
LD_LIBRARY_PATH='$ORIGIN/../../linux64' /home/steam/Steam/ets2/bin/linux_x64/eurotrucks2_server

3.按下ESC,输出:wq回车保存并退出即可

现在可以通过绝对路径运行程序了,无需在运行前切换目录

bash 复制代码
nohup /home/steam/Steam/ets2/bin/linux_x64/server_launch.sh &
将终端打印的信息收集成日志,每行加上时间戳

为服务器创建一个存储日志的目录

bash 复制代码
mkdir ~/logs

方式一【使用while+do添加时间戳】:


bash 复制代码
nohup stdbuf -oL -eL /home/steam/Steam/ets2/bin/linux_x64/server_launch.sh | while IFS= read -r line; do echo "$(date '+%Y-%m-%d %H:%M:%S') $line"; done >> /home/steam/logs/ets2_server.log 2>&1 & disown

stdbuf -oL -eL 将标准输出(stdout)和标准错误(stderr)设置为行缓冲,这样输出会立即写入日志文件中。为了提高性能nohup似乎会缓存一部分日志,等收集到足够的日志再输出到文件,导致你在日志文件中看到的日志可能会滞后。如果你不是时时刻刻喜欢盯着日志看的话,那将毫无影响,可以不添加此选项。

disown disown 命令将作业从当前 shell 会话的作业表中移除,使其不会受到 SIGHUP 信号的影响。实践中,使用以上方式收集终端的信息作为日志输出到文件时,都会因ssh连接断开导致日志停止输出,但并不会影响服务器程序本身的运行(很奇怪,也许欧卡服务器就是这样设计的)。当关闭终端或注销会话时会发送 SIGHUP(挂起信号)给所有与该终端相关联的作业。会话中的所有作业都会收到 SIGHUP 信号并被终止,即使你使用了 nohup,作业也有可能因为没有解除关联而被终止。

查看最后100行日志

bash 复制代码
tail -100 /home/steam/logs/ets2_server.log

实时查看日志

bash 复制代码
tail -f /home/steam/logs/ets2_server.log

方式二【使用ts添加时间戳】:


在 CentOS 上安装 ts 工具,首先需要安装 moreutils 包,因为 tsmoreutils 工具包的一部分。以下是详细的步骤(此操作需切换至root权限,验证安装完成之后请切换回steam用户):

  1. 安装 EPEL 仓库

moreutils 包不在默认的 CentOS 仓库中,而是在 EPEL(Extra Packages for Enterprise Linux)仓库中。因此,首先需要安装 EPEL 仓库。

bash 复制代码
yum install epel-release
  1. 安装 moreutils 包:
bash 复制代码
yum install moreutils
  1. 验证 ts 是否成功安装:
bash 复制代码
echo "Test" | ts

如果 “Test” 文本前面打印了时间,说明安装成功。

安装完成后,你可以按照以下命令使用 ts 为日志添加时间戳:

服务器一:不带ai的服务器

bash 复制代码
nohup stdbuf -oL -eL /home/steam/Steam/ets2/bin/linux_x64/server_launch.sh 2>&1 | ts '[%Y-%m-%d %H:%M:%S]' >> /home/steam/logs/ets2_server.log & disown

服务器二:带ai的服务器【关于如何运行多台服务器,请往后看】

bash 复制代码
nohup stdbuf -oL -eL /home/steam/Steam/ets2/bin/linux_x64/server_launch_ai.sh 2>&1 | ts '[%Y-%m-%d %H:%M:%S]' >> /home/steam/logs/ets2_server_ai.log & disown

将添加时间戳的方式更换为ts后不再提示【nohup: 忽略输入重定向错误到标准输出端】,看着清爽点。

如果觉得以上命令的稍显复杂,你可以将其写成一个脚本简化操作。

按天分割日志文件

以下提到的命令通过date +%Y-%m-%d命令替换,已经非常接近实现按天分割日志的需求。不过,由于 date 命令只在启动时执行一次,导致日志文件名不会每天自动更新。如果你希望他能够正常运行,那么你大概需要添加一个定时器,每天重启一次服务器。如果此时有人在服务器中?所以不建议。

bash 复制代码
nohup stdbuf -oL -eL /home/steam/Steam/ets2/bin/linux_x64/server_launch.sh | while IFS= read -r line; do echo "$(date '+%Y-%m-%d %H:%M:%S') $line"; done >> /home/steam/logs/ets2_server_`date +%Y-%m-%d`.log 2>&1 & disown

为了不影响服务器正常运行,可以选择编写一个 Shell 脚本并使用 corn 定时执行。通过直接重定向日志输出到带日期的文件中,来实现日志的分割和存储。创建文件 /home/steam/bin/log_rotate.sh

1.创建目录。

bash 复制代码
mkdir /home/steam/bin

2.在该目录下创建脚本文件。

bash 复制代码
touch /home/steam/bin/log_rotate.sh

3.编辑 /home/steam/bin/log_rotate.sh 文件

bash 复制代码
#!/bin/bash

LOG_DIR="/home/steam/logs"
CURRENT_LOG="$LOG_DIR/ets2_server.log"
CURRENT_LOG_AI="$LOG_DIR/ets2_server_ai.log"
CURRENT_LOG_PROMODS="$LOG_DIR/ets2_server_promods.log"

# 按天分割
# DATE=$(date +%Y%m%d)

# 按周分割,获取七天前和一天前的日期
DATE_SEVEN_DAYS_AGO=$(date -d '7 days ago' +%Y%m%d)
DATE_ONE_DAY_AGO=$(date -d '1 day ago' +%Y%m%d)
DATE=$DATE_SEVEN_DAYS_AGO~$DATE_ONE_DAY_AGO

ARCHIVE_LOG="$LOG_DIR/ets2_server_$DATE.log"
ARCHIVE_LOG_AI="$LOG_DIR/ets2_server_ai_$DATE.log"
ARCHIVE_LOG_PROMODS="$LOG_DIR/ets2_server_promods_$DATE.log"

# 将当前日志内容追加到带日期的日志文件中
cat $CURRENT_LOG >> $ARCHIVE_LOG
cat $CURRENT_LOG_AI >> $ARCHIVE_LOG_AI
cat $CURRENT_LOG_PROMODS >> $ARCHIVE_LOG_PROMODS

# 清空当前日志文件
: > $CURRENT_LOG
: > $CURRENT_LOG_AI
: > $CURRENT_LOG_PROMODS

# 可选:删除 30 天前的日志
# find $LOG_DIR -name "log-*.log" -mtime +30 -exec rm {} \;

然后将这个脚本设置为每日运行任务,可以使用 cron 实现:

  1. 编辑 cron 任务:

    bash 复制代码
    crontab -e
  2. 按下i键,添加以下行来设置脚本每日运行:

    bash 复制代码
    # 每分钟一次,可以用来测试是否生效
    # * * * * * /home/steam/bin/log_rotate.sh
    
    # 每天一次
    # 0 0 * * * /home/steam/bin/log_rotate.sh
    
    # 每周一次,周一执行
    0 0 * * 1 /home/steam/bin/log_rotate.sh
  3. 按下ESC,输入:wq保存并退出

  4. /home/steam/bin/log_rotate.sh 添加可执行权限

    bash 复制代码
    chmod +x /home/steam/bin/log_rotate.sh
  5. 如果不确定cron是否执行成功,可查看与cron相关的日志。

    如果 cron 未成功执行,以下命令可查看错误信息

    复制代码
    cat /var/spool/mail/steam

    查看 cron 日志,需要切换至root权限

    bash 复制代码
    cat /var/log/cron

这样,日志内容每天会被追加到带日期的日志文件中,同时 ets2_server.log 会被清空以便继续记录新的日志。这种方式避免了操作失误时使用 mvcp 命令在可能带来的大面积日志丢失,直接通过追加和清空的方式来实现日志的分割和存储。当然,你可以根据实际需要调整这些配置。如果你不是特别理解以上脚本是如何确定执行时间的,你可以在搜索引擎查询 crontab 的相关资料并尝试学习使用。

如果你遇到错误如:/bin/sh: /home/steam/bin/log_rotate.sh: /bin/bash^M: 坏的解释器: 没有那个文件或目录

请使用适当的工具将脚本文件的换行符格式从Windows的CRLF(\r\n)转换为Unix/Linux的LF(\n)格式。

例如,可以尝试使用sed命令进行替换:

复制代码
sed -i 's/\r$//' /root/t/log.sh

这将删除每行末尾的回车符(^M)。

直接执行./eurotrucks2_server而不是./server_launch.sh


如果你希望直接执行./eurotrucks2_server而不是./server_launch.sh,可能会收到以下错误:'[S_API FAIL] SteamAPI_Init() failed;无法找到正在运行的 Steam 实例或本地steamclient.dll。

要在 Linux 上启动服务器,需要“steamclient.so”库。您可以使用提供的server_launch.sh脚本(位于eurotrucks2_server可执行文件同级的文件夹中),或创建指向此库的链接。

创建目录

bash 复制代码
mkdir -p ~/.steam/sdk64

/home/steam/.steam/sdk64/创建指向steamclient.so库的链接

bash 复制代码
ln -s /home/steam/Steam/linux64/steamclient.so /home/steam/.steam/sdk64/steamclient.so

现在,你可以选择通过 ./eurotrucks2_server 启动你的服务器

服务器一:不带ai的服务器

bash 复制代码
nohup stdbuf -oL -eL /home/steam/Steam/ets2/bin/linux_x64/eurotrucks2_server 2>&1 | ts '[%Y-%m-%d %H:%M:%S]' >> /home/steam/logs/ets2_server.log & disown

服务器二:带ai的服务器

bash 复制代码
nohup stdbuf -oL -eL /home/steam/Steam/ets2/bin/linux_x64/eurotrucks2_server -nosingle -server "server_packages_ai.sii" -server_cfg "server_config_ai.sii" 2>&1 | ts '[%Y-%m-%d %H:%M:%S]' >> /home/steam/logs/ets2_server_ai.log & disown

服务器三:promods服务器

bash 复制代码
nohup stdbuf -oL -eL /home/steam/Steam/ets2/bin/linux_x64/eurotrucks2_server -nosingle -server "server_packages_promods.sii" -server_cfg "server_config_promods.sii" 2>&1 | ts '[%Y-%m-%d %H:%M:%S]' >> /home/steam/logs/ets2_server_promods.log & disown

运行多台不同设置的服务器


请在/home/steam/.local/share/Euro Truck Simulator 2 目录中,将server_config.siiserver_packages.dat 以及 server_packages.sii 三个文件复制一份并重命名。例如 server_config_ai.siiserver_packages_ai.dat 以及 server_packages_ai.sii

修改 server_packages_ai.sii 文件的road_data_file_name这一行与server_packages_ai.dat 文件关联

ini 复制代码
……
 roads_data_file_name: "/home/server_packages_ai.dat"
……

修改 server_config_ai.sii 文件的connection_dedicated_port这一行与query_dedicated_port端口参数,你可以尝试在不与第一台服务器重复的情况下在27015与27020之间修改。

ini 复制代码
……
 connection_dedicated_port: 27017
 query_dedicated_port: 27018
……

以上只做演示,具体的服务器配置文件,你可以沿用第一台服务器的配置文件,也可以在第一台服务器的配置文件上做修改,或者重新从游戏客户端生成。至于server_config_ai.sii文件中的其他游戏规则,请自行设置。

/home/steam/Steam/ets2/bin/linux_x64目录下,复制一份server_launch.sh并重命名。例如server_launch_ai.sh,修改其参数与/home/steam/.local/share/Euro Truck Simulator 2目录下的文件关联。

bash 复制代码
#! /bin/sh
# LD_LIBRARY_PATH='$ORIGIN/../../linux64' ./eurotrucks2_server
# 改为
LD_LIBRARY_PATH='$ORIGIN/../../linux64' ./eurotrucks2_server -nosingle -server "server_packages_ai.sii" -server_cfg "server_config_ai.sii"

启动第二台服务器请参考前文的服务器二启动命令。

如果你不想复制和修改server_launch_ai.sh文件,请参考前文的【直接执行eurotrucks2_server而不是server_launch.sh】。

server_config_ai.sii 配置文件的详细介绍


复制代码
SiiNunit
{
server_config : _nameless.777.7777 {
 lobby_name: "短途运输" -> 环节名称
 description: "运输1000km以下的货物" -> 环节描述
 welcome_message: "欢迎来到我的房间" -> 欢迎语
 password: "" -> 密码
 max_players: 8  -> 玩家人数上限
 max_vehicles_total: 100  -> 最大车辆总数
 max_ai_vehicles_player: 50  -> 单个玩家周围的AI车辆的最大数量
 max_ai_vehicles_player_spawn: 50  -> 玩家周围实际生成的AI车辆的最大数量
 connection_virtual_port: 100  -> 服务器虚拟端口,用于游戏客户端连接
 query_virtual_port: 101  -> 服务器虚拟端口,用于查询服务器状态信息
 connection_dedicated_port: 27015  -> 专用服务器的连接端口,客户端通过此端口连接到服务器
 query_dedicated_port: 27016  -> 定义专用服务器的查询端口,用于获取服务器状态和信息
 server_logon_token: "00000000AAAAAAAAFFFFFFFF99999999"  -> steam令牌,不使用的话,每次启动服务器都是不同的房间号
 player_damage: false  -> 启用玩家之间的损坏
 traffic: true  -> 启用AI交通
 hide_in_company: false  -> 隐藏位于车库的玩家
 hide_colliding: false  -> 隐藏位于无碰撞地区的玩家
 force_speed_limiter: false  -> 强制卡车限速器
 mods_optioning: false  -> 启用可选模组
 timezones: 0  -> 时区
 service_no_collision: true  -> 在服务区里容许碰撞
 in_menu_ghosting: true  -> 使用菜单时启用碰撞(这里是相反的意思)
 name_tags: true  -> 显示玩家昵称标签
 friends_only: false  -> 只允许Steam好友
 show_server: true  -> 在服务器列表展示房间
 moderator_list: 3 -> 房间管理员数量3位
 moderator_list[0]: 75767777777777777 -> 第一位管理员的id,计算机中数组从0开始
 moderator_list[1]: 75767777777777778 -> 第二位管理员的id
 moderator_list[2]: 75767777777777779 -> 第三位管理员的id
}
}

steam令牌申请:https://steamcommunity.com/dev/managegameservers。欧卡的App ID 227300,美卡的App ID为270880。

获取管理员id:在Steam应用右上角点击你的昵称,在下拉菜单中点击账户明细即可看到你的id。

查找用户id

开启飞行模式教程:

欧洲卡车模拟2飞行模式开启以及键位的修改 - 哔哩哔哩 (bilibili.com)

参考文档:

SteamCMD - Valve 开发者社区 (valvesoftware.com)

文档/工具/专用服务器 - SCS Modding Wiki (scssoft.com)

评论