如何在CentOS7(Linux)安装一个或多个欧洲卡车模拟2(欧卡2)专用服务器
若条件允许,建议在对服务器操作前拍摄快照,以防误操作方便回滚。
此教程需要你对Linux的基础使用有一定了解。至少了解一种文本编辑器的基本使用,例如vim(如果你安装了图形界面可以忽略)。至少了解一种将文件上传至服务器的方法,例如ftp。
以root用户身份创建steam用户,并创建steam用户的主目录
useradd -m steam
设置steam用户密码
passwd steam
安装运行 SteamCMD 所需的依赖项
yum install glibc.i686 libstdc++.i686
切换到steam用户【!!!注意这里切换了用户】,为 SteamCMD 创建一个目录并切换到它
mkdir ~/Steam && cd ~/Steam
下载并解压适用于 Linux 的 SteamCMD
curl -sqL "https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz" | tar zxvf -
启动 SteamCMD
/home/steam/Steam/steamcmd.sh
在SteamCMD中设置欧卡2安装目录
force_install_dir ./ets2/
使用以下命令匿名登录,匿名登录后可以下载大部分游戏服务器
login anonymous
使用命令安装或更新欧卡2,欧卡2的Steam应用程序ID为1948160,美卡为2239530
app_update 1948160
等待安装完成,使用quit或者exit或者按下Ctrl+C退出steamCMD
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
,解决方案请往后看。
切换到服务器程序所在目录
cd /home/steam/Steam/ets2/bin/linux_x64
运行服务器,此种方式在关闭ssh会话时也会关闭服务器
./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.dat
和 server_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"】,你可以忽略此提示。
nohup ./server_launch.sh &
如有你的服务器具有公网ip请开放如下端口,以便其他玩家在服务器列表检索
如果你未曾开放以下端口,其他玩家只能搜索数字id找到你的房间
请在先在本机防火墙开放以下端口,如果你使用云服务器请在服务商网站控制台安全组内再次开放端口
来自官网文档的解释:
connection_virtual_port
和 query_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
vi /home/steam/Steam/ets2/bin/linux_x64/server_launch.sh
2.按下i键,编辑文档如下
#! /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回车保存并退出即可
现在可以通过绝对路径运行程序了,无需在运行前切换目录
nohup /home/steam/Steam/ets2/bin/linux_x64/server_launch.sh &
为服务器创建一个存储日志的目录
mkdir ~/logs
方式一【使用while+do添加时间戳】:
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行日志
tail -100 /home/steam/logs/ets2_server.log
实时查看日志
tail -f /home/steam/logs/ets2_server.log
方式二【使用ts添加时间戳】:
在 CentOS 上安装 ts
工具,首先需要安装 moreutils
包,因为 ts
是 moreutils
工具包的一部分。以下是详细的步骤(此操作需切换至root权限,验证安装完成之后请切换回steam用户):
moreutils
包不在默认的 CentOS 仓库中,而是在 EPEL(Extra Packages for Enterprise Linux)仓库中。因此,首先需要安装 EPEL 仓库。
yum install epel-release
moreutils
包:yum install moreutils
ts
是否成功安装:echo "Test" | ts
如果 “Test” 文本前面打印了时间,说明安装成功。
安装完成后,你可以按照以下命令使用 ts
为日志添加时间戳:
服务器一:不带ai的服务器
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的服务器【关于如何运行多台服务器,请往后看】
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
命令只在启动时执行一次,导致日志文件名不会每天自动更新。如果你希望他能够正常运行,那么你大概需要添加一个定时器,每天重启一次服务器。如果此时有人在服务器中?所以不建议。
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.创建目录。
mkdir /home/steam/bin
2.在该目录下创建脚本文件。
touch /home/steam/bin/log_rotate.sh
3.编辑 /home/steam/bin/log_rotate.sh
文件
#!/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
实现:
编辑 cron
任务:
crontab -e
按下i键,添加以下行来设置脚本每日运行:
# 每分钟一次,可以用来测试是否生效
# * * * * * /home/steam/bin/log_rotate.sh
# 每天一次
# 0 0 * * * /home/steam/bin/log_rotate.sh
# 每周一次,周一执行
0 0 * * 1 /home/steam/bin/log_rotate.sh
按下ESC,输入:wq保存并退出
给 /home/steam/bin/log_rotate.sh
添加可执行权限
chmod +x /home/steam/bin/log_rotate.sh
如果不确定cron是否执行成功,可查看与cron
相关的日志。
如果 cron
未成功执行,以下命令可查看错误信息
cat /var/spool/mail/steam
查看 cron
日志,需要切换至root权限
cat /var/log/cron
这样,日志内容每天会被追加到带日期的日志文件中,同时 ets2_server.log
会被清空以便继续记录新的日志。这种方式避免了操作失误时使用 mv
和 cp
命令在可能带来的大面积日志丢失,直接通过追加和清空的方式来实现日志的分割和存储。当然,你可以根据实际需要调整这些配置。如果你不是特别理解以上脚本是如何确定执行时间的,你可以在搜索引擎查询 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
可执行文件同级的文件夹中),或创建指向此库的链接。
创建目录
mkdir -p ~/.steam/sdk64
在/home/steam/.steam/sdk64/
创建指向steamclient.so
库的链接
ln -s /home/steam/Steam/linux64/steamclient.so /home/steam/.steam/sdk64/steamclient.so
现在,你可以选择通过 ./eurotrucks2_server
启动你的服务器
服务器一:不带ai的服务器
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的服务器
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服务器
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.sii
和 server_packages.dat
以及 server_packages.sii
三个文件复制一份并重命名。例如 server_config_ai.sii
和 server_packages_ai.dat
以及 server_packages_ai.sii
。
修改 server_packages_ai.sii
文件的road_data_file_name这一行与server_packages_ai.dat
文件关联
……
roads_data_file_name: "/home/server_packages_ai.dat"
……
修改 server_config_ai.sii
文件的connection_dedicated_port这一行与query_dedicated_port端口参数,你可以尝试在不与第一台服务器重复的情况下在27015与27020之间修改。
……
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
目录下的文件关联。
#! /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。
开启飞行模式教程:
欧洲卡车模拟2飞行模式开启以及键位的修改 - 哔哩哔哩 (bilibili.com)
参考文档: