从零开始部署求生之路2 (L4D2) 专属服务器,Linux端SteamCMD详细部署过程

1. 系统安装依赖

Ubuntu/Debian系统(推荐)

bash 复制代码
# 更新系统
sudo apt update

# 安装依赖
sudo apt install -y lib32gcc-s1 lib32stdc++6 libc6-i386 wget screen p7zip-full p7zip-rar git vim 

# 开放端口(没有则跳过)
iptables -A INPUT -p udp -m state --state NEW -m udp --dport 27015-j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 27015-j ACCEPT

CentOS/RHEL系统(不推荐)

bash 复制代码
# 更新系统
sudo yum update -y

# 安装依赖
sudo yum install -y glibc.i686 libstdc++.i686 wget screen p7zip p7zip-plugins git vim 

# 开放端口(没有则跳过)
sudo firewall-cmd --permanent --add-port=27015/udp
sudo firewall-cmd --permanent --add-port=27015/tcp
sudo firewall-cmd --reload

2. 创建用户和目录

bash 复制代码
# 创建专用用户
sudo useradd -m -s /bin/bash l4d2server
sudo passwd l4d2server

# 切换到新用户
su - l4d2server

# 创建工作目录
mkdir -p ~/steamcmd ~/l4d2

3. 开始部署

3.1 安装SteamCMD

bash 复制代码
# 进入SteamCMD目录
cd ~/steamcmd

# 下载SteamCMD
wget https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz

# 解压
tar -xvzf steamcmd_linux.tar.gz

# 删除压缩包
rm steamcmd_linux.tar.gz

3.2 下载L4D2服务器文件

bash 复制代码
# 开始部署
cd ~/steamcmd

# 部署方式二选一,匿名登录部署如果失败请登录账号部署
# 匿名 anonymous 登录部署(官方可能关闭了匿名访问)
./steamcmd.sh +force_install_dir ~/l4d2 +login anonymous +app_update 222860 validate +quit
# 使用已购买l4d2的steam账号登录部署,替换"账号" "密码"为你自己的账号密码。需要steamAPP端认证登录。
./steamcmd.sh +force_install_dir ~/l4d2 +login 账号 密码 +app_update 222860 validate +quit

4. 配置文件

bash 复制代码
# 创建使用官方默认值的配置文件
mkdir -p ~/l4d2/left4dead2/cfg/
cat > ~/l4d2/left4dead2/cfg/server.cfg << 'EOF'
// =============================================================================
// Left 4 Dead 2 服务器配置文件(官方默认值)
// 最后更新: $(date)
// =============================================================================

// -----------------------------------------------------------------------------
// 服务器基本信息设置
// -----------------------------------------------------------------------------
hostname "My L4D2 Server"                    // 服务器名称(请修改为您自己的服务器名)
rcon_password "your_rcon_password"          // RCON管理密码(请修改为强密码)
sv_password ""                              // 服务器加入密码(留空表示无密码)
sv_contact "admin@example.com"              // 管理员联系方式
sv_steamgroup ""                            // 关联的Steam组ID(留空表示不关联)
sv_steamgroup_exclusive 0                   // 0=公共游戏,1=仅限组成员,2=仅限好友
sv_region 4                                 // 地区代码: 0-美东,1-美西,2-南美,3-欧洲,4-亚洲,5-澳洲,6-中东,7-非洲,255-全球
sv_lan 0                                    // 0=互联网服务器,1=局域网服务器

// -----------------------------------------------------------------------------
// 游戏模式与难度设置
// -----------------------------------------------------------------------------
mp_gamemode "coop"                          // 游戏模式: coop(合作),versus(对抗),survival(生存)
z_difficulty "Normal"                       // 游戏难度: Easy, Normal, Hard, Impossible(专家)
director_no_human_zombies 1                  // 设为1可防止玩家加入感染者方,仅战役模式

// -----------------------------------------------------------------------------
// 玩家管理与安全设置
// -----------------------------------------------------------------------------
mp_disable_autokick 0                       // 禁用自动踢人(空闲玩家)- 默认: 0
sv_allow_lobby_connect_only 1               // 允许玩家直接连接服务器 - 默认: 1
sv_force_unreserved 0                       // 允许超过4名玩家加入服务器 - 默认: 0
sv_removehumanlimit 0                       // 移除人类玩家限制 - 默认: 0
sv_tags ""                                  // 服务器标签 - 默认: 空
sv_pure 0                                   // 允许玩家使用自定义文件 - 默认: 0
sv_consistency 1                           // 文件一致性检查 - 默认: 1
sv_cheats 0                                 // 禁用作弊(1=开启,0=关闭)- 默认: 0

// -----------------------------------------------------------------------------
// 性能与网络优化设置
// -----------------------------------------------------------------------------
sv_forcepreload 0                           // 强制预加载资源 - 默认: 0
fps_max 300                                 // 服务器FPS限制 - 默认: 300
sv_minrate 5000                             // 最小传输速率 - 默认: 5000
sv_maxrate 30000                            // 最大传输速率 - 默认: 30000
sv_mincmdrate 10                            // 最小命令速率 - 默认: 10
sv_maxcmdrate 30                            // 最大命令速率 - 默认: 30
sv_minupdaterate 10                         // 最小更新速率 - 默认: 10
sv_maxupdaterate 30                         // 最大更新速率 - 默认: 30
sv_client_cmdrate_difference 30              // 客户端命令速率差异 - 默认: 30
sv_client_predict 1                         // 客户端预测 - 默认: 1
sv_client_max_interp_ratio 2                // 客户端最大插值比率 - 默认: 2
net_splitpacket_max_rate 15000              // 分包最大速率 - 默认: 15000
net_maxroutable 1200                        // 最大路由包大小 - 默认: 1200
nb_update_frequency 0.1                     // AI更新频率 - 默认: 0.1
tick_door_speed 1.0                         // 修复高tick值下的开关门问题 - 默认: 1.0

// -----------------------------------------------------------------------------
// AI与游戏平衡设置
// -----------------------------------------------------------------------------
sb_all_bot_game 0                           // 允许全部为Bot的游戏 - 默认: 0
sb_open_fire 0                              // Bot开枪延迟(0=无延迟)- 默认: 0
director_molotov_density 30                 // AI随机放置汽油弹密度 - 默认: 30
director_pipe_bomb_density 30               // AI随机放置土制炸弹密度 - 默认: 30
director_pain_pill_density 15                // AI随机放置止痛药密度 - 默认: 15
z_non_head_damage_factor_expert 0.5          // 非头部伤害系数(专家难度)- 默认: 0.5
survivor_revive_duration 5                   // 拉人起来的时间(秒)- 默认: 5
survivor_revive_health 40                   // 被拉起来后的血量 - 默认: 40
rescue_min_dead_time 30                     // 玩家死亡后可被救援的时间 - 默认: 30

// -----------------------------------------------------------------------------
// 特感感染者设置
// -----------------------------------------------------------------------------
z_tank_health 4000                          // 坦克生命值 - 默认: 4000
z_tank_speed 210                            // 坦克移动速度 - 默认: 210
tank_burn_duration_expert 40                // 坦克燃烧死亡时间(专家难度)- 默认: 40
z_witch_health 1000                         // 女巫生命值 - 默认: 1000
z_witch_damage 100                          // 女巫伤害 - 默认: 100
z_hunter_health 250                         // 猎人生命值 - 默认: 250
z_hunter_speed 300                          // 猎人移动速度 - 默认: 300
hunter_pounce_air_speed 700                  // 猎人飞扑速度 - 默认: 700
z_gas_health 250                           // 烟鬼生命值 - 默认: 250
z_gas_speed 210                            // 烟鬼移动速度 - 默认: 210
tongue_range 750                           // 烟鬼舌头长度 - 默认: 750
z_jockey_health 325                         // Jockey生命值 - 默认: 325
z_jockey_speed 250                          // Jockey移动速度 - 默认: 250
z_charger_health 600                        // Charger生命值 - 默认: 600
z_spitter_health 100                        // Spitter生命值 - 默认: 100
z_exploding_health 50                       // Boomer生命值 - 默认: 50
z_exploding_speed 175                       // Boomer移动速度 - 默认: 175
z_exploding_splat_radius 200                // Boomer爆炸范围 - 默认: 200

// -----------------------------------------------------------------------------
// 物品与武器设置
// -----------------------------------------------------------------------------
first_aid_heal_percent 0.8                  // 医疗包恢复生命百分比 - 默认: 0.8
first_aid_kit_max_heal 80                   // 医疗包最大恢复生命数 - 默认: 80
first_aid_kit_use_duration 5                 // 使用医疗包所需时间(秒)- 默认: 5
pain_pills_health_value 50                   // 止痛药补血量 - 默认: 50
pain_pills_decay_rate 0.34                   // 止痛药损耗速度 - 默认: 0.34
ammo_smg_max 480                            // 冲锋枪子弹上限 - 默认: 480
ammo_buckshot_max 128                       // 散弹枪子弹上限 - 默认: 128
ammo_assaultrifle_max 360                   // 自动步枪子弹上限 - 默认: 360
ammo_huntingrifle_max 180                   // 狙击枪子弹上限 - 默认: 180

// -----------------------------------------------------------------------------
// 僵尸潮设置
// -----------------------------------------------------------------------------
z_common_limit 30                          // 每次刷新的僵尸数量 - 默认: 30
z_mega_mob_size 30                         // 触发警钟时的僵尸数量 - 默认: 30
z_mob_spawn_max_size 30                     // 僵尸暴走时的最大数量 - 默认: 30
z_mob_spawn_min_size 30                     // 僵尸暴走时的最小数量 - 默认: 30
director_special_initial_spawn_delay_min 0  // 特感初始生成最小延迟 - 默认: 0
director_special_initial_spawn_delay_max 3  // 特感初始生成最大延迟 - 默认: 3
director_special_initial_spawn_delay_max_extra 2  // 特感初始生成额外延迟 - 默认: 2
director_build_up_min_interval 5            // 僵尸产出间隔 - 默认: 5

// -----------------------------------------------------------------------------
// 日志设置
// -----------------------------------------------------------------------------
log on                                      // 启用日志 - 默认: on
sv_log_onefile 0                            // 每个会话创建新日志文件 - 默认: 0
sv_logfile 1                               // 启用日志文件 - 默认: 1
sv_logbans 1                               // 记录封禁日志 - 默认: 1
sv_logecho 1                               // 在控制台显示日志 - 默认: 1

// -----------------------------------------------------------------------------
// 插件设置
// -----------------------------------------------------------------------------
sm_advertisements_enabled 1                 // 启用广告插件 - 默认: 1
EOF

5. 启动、停止、更新命令脚本

5.1 启动脚本

命令启动:

bash 复制代码
~/l4d2/srcds_run -game left4dead2 -insecure +hostport 27015 +maxplayers 8 +map c1m1_hotel +exec server.cfg -nomaster +sv_gametypes coop -condebug

脚本启动:

bash 复制代码
# 创建启动脚本
cat > ~/l4d2/start.sh << 'EOF'
#!/bin/bash

SCREEN_NAME="l4d2server"

# 检查游戏模式参数
case "$1" in
    "coop")
        MAP="c1m1_hotel"
        GAMETYPE="coop"
        ;;
    "versus")
        MAP="c1m1_hotel"
        GAMETYPE="versus"
        ;;
    "survival")
        MAP="l4d_airport01_greenhouse"
        GAMETYPE="survival"
        ;;
    *)
        MAP="c1m1_hotel"
        GAMETYPE="coop"
        ;;
esac

# 检查 screen 会话是否已经存在
# -Q windows 会查询会话的窗口列表,如果会话不存在则命令失败
if screen -S "$SCREEN_NAME" -Q windows > /dev/null 2>&1; then
    echo "========================================"
    echo "错误:名为 '$SCREEN_NAME' 的服务器会话已在运行。"
    echo "请勿重复启动。"
    echo "使用 'screen -r $SCREEN_NAME' 连接到服务器控制台。"
	echo "使用 '~/l4d2/update.sh' 更新游戏。"
	echo "使用 '~/l4d2/stop.sh' 停止服务器。"
	echo "使用 '~/l4d2/restart.sh' 重启服务器。"
    echo "========================================"
    exit 1
fi

# 启动服务器
echo "正在启动 L4D2 服务器..."
screen -dmS "$SCREEN_NAME" ~/l4d2/srcds_run \
    -game left4dead2 -insecure \
    +hostport 27015 \
    +maxplayers 8 \
    +map "$MAP" \
    +exec server.cfg -nomaster \
    +sv_gametypes "$GAMETYPE" \
    -condebug

echo "========================================"
echo "L4D2服务器已成功启动!"
echo "游戏模式: $GAMETYPE"
echo "地图: $MAP"
echo "使用 'screen -r $SCREEN_NAME' 查看控制台"
echo "使用 '~/l4d2/update.sh' 更新游戏。"
echo "使用 '~/l4d2/stop.sh' 停止服务器。"
echo "使用 '~/l4d2/restart.sh' 重启服务器。"
echo "========================================"
EOF

# 添加执行权限
chmod +x ~/l4d2/start.sh

5.2 停止脚本

bash 复制代码
# 创建停止脚本
cat > ~/l4d2/stop.sh << 'EOF'
#!/bin/bash

SCREEN_NAME="l4d2server"

# 检查 screen 会话是否正在运行
# -Q windows 如果会话不存在则命令失败,我们用 ! 来取反
if ! screen -S "$SCREEN_NAME" -Q windows > /dev/null 2>&1; then
    echo "========================================"
    echo "错误:名为 '$SCREEN_NAME' 的服务器会话未运行。"
	echo "使用 '~/l4d2/update.sh' 更新游戏。"
	echo "使用 '~/l4d2/start.sh' 启动服务器。"
    echo "========================================"
    exit 1
fi

# 停止服务器
screen -S "$SCREEN_NAME" -X quit
echo "========================================"
echo "L4D2服务器已停止!"
echo "使用 '~/l4d2/update.sh' 更新游戏。"
echo "使用 '~/l4d2/start.sh' 启动服务器。"
echo "========================================"
EOF

# 添加执行权限
chmod +x ~/l4d2/stop.sh

5.3 重启脚本

bash 复制代码
# 创建重启脚本
cat > ~/l4d2/restart.sh << 'EOF'
#!/bin/bash

# 先停止服务器
~/l4d2/stop.sh

# 等待几秒
sleep 5

# 再启动服务器
~/l4d2/start.sh $1

echo "L4D2服务器已重启"
EOF

# 添加执行权限
chmod +x ~/l4d2/restart.sh

5.4 更新游戏并启动脚本

命令更新:

bash 复制代码
~/steamcmd/steamcmd.sh +force_install_dir ~/l4d2 +login anonymous +app_update 222860 +quit

脚本更新:

bash 复制代码
# 创建更新脚本
cat > ~/l4d2/update.sh << 'EOF'
#!/bin/bash

echo "正在停止L4D2服务器..."
~/l4d2/stop.sh

echo "正在更新L4D2服务器文件..."
~/steamcmd/steamcmd.sh +force_install_dir ~/l4d2 +login anonymous +app_update 222860 +quit

echo "正在重新启动L4D2服务器..."
~/l4d2/start.sh $1

echo "更新完成!"
EOF

# 添加执行权限
chmod +x ~/l4d2/update.sh

5.5 定时任务设置

bash 复制代码
# 创建定时任务脚本
cat > ~/l4d2/cron-update.sh << 'EOF'
#!/bin/bash
echo "$(date): 开始自动更新L4D2服务器" >> /home/l4d2server/l4d2/cron.log
~/l4d2/update.sh >> /home/l4d2server/l4d2/cron.log 2>&1
echo "$(date): L4D2服务器自动更新完成" >> /home/l4d2server/l4d2/cron.log
EOF

# 设置执行权限
chmod +x ~/l4d2/cron-*.sh

# 设置定时任务
(crontab -l 2>/dev/null; echo "0 3 * * * /home/l4d2server/l4d2/cron-update.sh") | crontab -

6. 管理员权限

依赖第三方插件

bash 复制代码
# 下载SourceMod、MetaMod、L4DToolz解压至此目录下
cd ~/l4d2/left4dead2/
bash 复制代码
# 添加管理员权限
vim ~/l4d2/left4dead2/addons/sourcemod/configs/admins_simple.ini
# 添加管理员,格式为:"SteamID" "权限"
# "STEAM_x:x:xxxxxx" "99:z" 
"STEAM_0:0:123456789" "99:z" 

7. 使用方法

7.1 启动服务器

bash 复制代码
# 启动服务器(默认合作模式)
~/l4d2/start.sh

# 启动指定游戏模式
~/l4d2/start.sh coop      # 合作模式
~/l4d2/start.sh versus    # 对抗模式
~/l4d2/start.sh survival   # 生存模式

7.2 管理服务器

bash 复制代码
# 停止服务器
~/l4d2/stop.sh

# 重启服务器
~/l4d2/restart.sh

# 重启指定游戏模式
~/l4d2/restart.sh coop
~/l4d2/restart.sh versus
~/l4d2/restart.sh survival

# 更新服务器
~/l4d2/update.sh

# 查看服务器控制台
screen -r l4d2server

# 从控制台断开(Ctrl+A,然后按D)

7.3 连接服务器

在游戏中按 ~ 键打开控制台,输入:

复制代码
connect your_server_ip:27015

8. 懒人包:预配置L4D2服务器文件下载

为了方便快速部署L4D2服务器,我已经将完整配置好的服务器文件打包上传到云盘,可以直接下载使用,无需手动配置。

懒人包使用方法一:脚本自动执行步骤

bash 复制代码
# 将压缩包和setup_l4d2.sh放在同一个目录中
# 在root账户下执行脚本
sudo bash setup_l4d2.sh

启动前修改配置:

bash 复制代码
# 添加管理员权限
vim ~/l4d2/left4dead2/addons/sourcemod/configs/admins_simple.ini
# 添加管理员,格式为:"SteamID" "权限"
# "STEAM_x:x:xxxxxx" "99:z" 
"STEAM_0:0:123456789" "99:z" 

设置定时任务(可选):

bash 复制代码
# 设置定时任务"在每天的凌晨3点0分"更新游戏并启动
(crontab -l 2>/dev/null; echo "0 3 * * * /home/l4d2server/l4d2/cron-update.sh") | crontab -

懒人包使用方法二:手动执行步骤

下载并解压文件:

注意:l4d2server不能使用root用户启动,必须先创建用户

bash 复制代码
#1.根据您的操作系统,安装必要的依赖库:
#Ubuntu/Debian系统:
sudo apt update
sudo apt install -y lib32gcc-s1 lib32stdc++6 libc6-i386

#CentOS/RHEL系统:
sudo yum update -y
sudo yum install -y glibc.i686 libstdc++.i686

#2.创建用户
adduser l4d2server

#3.根据提示输入秘密(任意密码即可),两次一样
passwd l4d2server

#4.切换到l4d2server用户
su - l4d2server
cd


# 下载并解压
7z x l4d2server_Linux版.7z
# 或者
7z x l4d2server_Linux插件版.7z

# 示例:将解压后的文件放在l4d2server用户根目录下
cd l4d2server_Linux版
mv */ ~/

# ls 看到这些目录 l4d2  Steam  steamcmd

注意:如果使用root用户解压必须修改文件所属用户、所属组

bash 复制代码
# 使用root账户执行下面命令
cd /home/l4d2server/
chown -R l4d2server:l4d2server *
chmod -R 755 /home/l4d2server/

启动前修改配置:

bash 复制代码
# 添加管理员权限
vim ~/l4d2/left4dead2/addons/sourcemod/configs/admins_simple.ini
# 添加管理员,格式为:"SteamID" "权限"
# "STEAM_x:x:xxxxxx" "99:z" 
"STEAM_0:0:123456789" "99:z" 

设置定时任务(可选):

bash 复制代码
# 设置定时任务"在每天的凌晨3点0分"更新游戏并启动
(crontab -l 2>/dev/null; echo "0 3 * * * /home/l4d2server/l4d2/cron-update.sh") | crontab -

首次启动服务器:

bash 复制代码
# 更新游戏并启动
~/l4d2/update.sh

连接服务器:

在游戏中按 ~ 键打开控制台,输入:

复制代码
connect your_server_ip:27015

通过懒人包,可以快速部署一个功能完善、性能优化的L4D2服务器,无需手动安装和配置。祝游戏愉快!

相关推荐
她说彩礼65万20 小时前
C# Activator详解
java·服务器·c#
九河云20 小时前
华为云 IoT 边缘 IoTEdge 实战:工业设备数采与云边协同部署全指南
服务器·物联网·华为云·智能家居
wusam20 小时前
计算机网络传输层应用层综合实验5:DHCP服务
linux·服务器·计算机网络·应用层服务
hnlq20 小时前
高性能异步io机制io_uring(二) ——io_uring的简单实现
linux·服务器·网络
wusam20 小时前
计算机网络传输层应用层综合实验7:Web网站架设
运维·服务器·计算机网络·应用层服务
tianyuanwo20 小时前
服务器操作系统SBOM实践:基于RPM生态的大规模组件透明化管理
运维·服务器·rpm·sbom
wusam20 小时前
计算机网络传输层应用层综合实验6:DNS服务部署
服务器·网络·计算机网络·应用层服务
不会书20 小时前
Linux字符设备驱动的演进:从传统框架到现代实践
linux·运维·服务器·c语言·驱动开发
潇I洒20 小时前
Ubuntu Linux 24.04 安装JAVA环境openjdk-21.0.2
java·linux·ubuntu