幻兽帕鲁服务器更新教程:版本不一致、更新后进不去与不掉存档的顺序
客户端会自动更新,专用服务器不会。这篇讲怎么确认官方发了新版本、公告 → 强制存档 → 停服 → 更新 → 启动的正确顺序,以及更新后世界打不开时怎么判断、怎么回退。
《幻兽帕鲁》的客户端由 Steam 自动更新,专用服务器不会有人替你更新。所以官方发版那天的画面永远一样:昨天还好好的服务器突然谁都进不去,连接转得比平常久,然后被丢回标题画面。这篇讲的是怎么用不掉存档的顺序更新帕鲁服务器。还没开服的话,先看开服教程。
版本不一致时玩家那边看到什么
版本不一致不会给你一句清楚的报错。所以开服的人第一个想到的通常是端口或防火墙,真正的原因却是版本号。
| 你看到的 | 实际发生的事 |
|---|---|
| 连接转很久,然后回到标题画面 | 客户端已经是新版,服务端还停在旧版本 |
| 弹出版本不同的提示 | 同一个原因。有些版本会弹,有些不会 |
| 服务器从社区列表里消失 | 列表本来就按版本过滤,旧版本不会出现 |
| 只有一两个人进不去 | 这不是版本问题,是专服连不上排查那一篇的事 |
最后一行是判别线:所有人同时进不去就是版本,只有一两个人进不去就是那个人自己的环境。官方发版后那几天,前者占压倒性多数。
确认只要比对两个地方:游戏主菜单角落的版本号,和服务端启动日志里打印的版本。如果你开了 REST 接口,GET /v1/api/info 会直接返回服务端版本(REST API 管理)。
怎么知道官方发了新版本
专用服务端的 App ID 是 2394010,和游戏本体(1623730)不是同一个号,发布也是分开的。你现在装的是哪个版本,写在安装目录的清单文件里:
grep buildid /home/palserver/palworld/steamapps/appmanifest_2394010.acf
Steam 目前在发的版本号,问 SteamCMD:
steamcmd +login anonymous +app_info_update 1 +app_info_print 2394010 +quit \
| grep -A 5 '"public"'
branches → public 下面的 buildid 是现在在发的号,timeupdated 是它发布的时间。两个数字不一样,就说明有东西要更新。
不过这个比对不用每次手动做。带 validate 的 app_update 在已经是最新版时基本什么都不做,所以「有没有新版」这个判断可以直接交给 SteamCMD。比对真正有用的情况只有一种:现在还有人在线,你想先知道值不值得为它停一次机。
正确顺序:公告 → 强制存档 → 停服 → 更新 → 启动
这几步的顺序就是这篇的重点,任意两步对调都会丢东西。
PW='一个足够长的密码'
API='http://127.0.0.1:8212/v1/api'
# 1. 公告:给在线的人反应时间
curl -s -u "admin:$PW" -X POST "$API/announce" \
-H 'Content-Type: application/json' \
-d '{"message":"Server updates in 5 minutes"}'
sleep 300
# 2. 强制存档:把内存里的世界写进磁盘
curl -s -u "admin:$PW" -X POST "$API/save"
sleep 10
# 3. 停服:等进程完全退出再做下一步
sudo systemctl stop palworld
# 4. 备份在这里做(下一节)
# 5. 更新
sudo -u palserver steamcmd +force_install_dir /home/palserver/palworld \
+login anonymous +app_update 2394010 validate +quit
# 6. 启动
sudo systemctl start palworld
还没开 REST 接口的话,先在 PalWorldSettings.ini 里加上 RESTAPIEnabled=True 和 AdminPassword。认证是 HTTP Basic、用户名固定是 admin,而且防火墙不要放行 8212,官方明确说过它不是设计来直接暴露公网的。
另外三件事要讲清楚:
- 不要在服务端还开着的时候跑
app_update。 Linux 不会阻止你覆盖一个正在运行的程序的文件,结果是进程还跑着旧的可执行文件、磁盘上的文件却换成了新的,这种半新半旧的状态要等下次启动才会暴露。 validate每次都要加。 它会多做一次文件完整性校验,代价是慢一点;但下载中断留下的坏文件,只有这个选项抓得到。- 更新期间谁都进不来。 大一点的版本要下载好几分钟,所以别挑大家都在等着开玩的时间点动手。
更新前那一次完整备份
存档格式偶尔会跟着版本变,而且一个世界一旦用新版本打开过,就回不去旧版本了。所以这次备份和「每天一次」是两回事:更新前手动再做一次。它平常一次都用不到,真要用到的那天就是全部。
要拷的是世界目录整包,而且要在服务端停掉之后再拷:
sudo systemctl stop palworld
sudo -u palserver cp -a \
/home/palserver/palworld/Pal/Saved/SaveGames/0/<WorldID> \
/home/palserver/backups/pre-update-$(date +%F)
<WorldID> 是服务器第一次启动时建的十六进制目录名。只拷里面那个 Level.sav 的备份,回档之后所有人都会变成新号:地图还在、据点还在,但主人不见了。为什么 Players/ 必须一起带走、回档要按什么顺序,写在存档在哪、怎么备份、怎么回档。
更新后世界打不开:怎么判断、怎么回退
先分清是下面哪一种,处理方式完全不同:
| 症状 | 怎么看 | 原因 |
|---|---|---|
| 服务端根本起不来 | journalctl -u palworld -n 100 | 文件损坏,或者配置文件读不进去 |
| 起来了,但是一个空的新世界 | 看 SaveGames/0/ 下面是不是多了一个目录 | 读不到原本那个目录,于是另开了一个 |
| 服务端正常,但全员进不去 | 比对版本 | 这次是客户端那边还没更新 |
中间那条最吓人,但其实什么都没少。原本的 <WorldID> 目录还在原地,只是服务端没读它。不要把原本那个目录删掉。
回退的做法不是「把版本降回去」,而是把更新前那份备份恢复到新版本上。两个理由:客户端已经升到新版,旧版本的服务端本来就没人连得进来;而世界打不开的事故,绝大多数不是格式变了,是停机不干净留下的半份存档。SteamCMD 确实有 download_depot 能抓指定版本,但你得自己去查 depot ID 和 manifest ID,而且基于上面两点,抓回来也几乎没用。
恢复的顺序是:停服 → 把现在这个 <WorldID> 目录改名挪开、不要删 → 把备份放回原本的名字 → 启动。世界能打开之后,挪开的那份再观察几天才清掉。
Windows 与 Linux 的差别
只有命令和工具不同,顺序完全一样。
| Linux | Windows | |
|---|---|---|
| 停服 | sudo systemctl stop palworld | 先用 REST 接口公告与存档,再 Stop-Process -Name PalServer-Win64-Shipping |
| 更新 | steamcmd +force_install_dir /home/palserver/palworld +login anonymous +app_update 2394010 validate +quit | C:\steamcmd\steamcmd.exe +force_install_dir C:\palworld-server +login anonymous +app_update 2394010 validate +quit |
| 存档位置 | /home/palserver/palworld/Pal/Saved/SaveGames/0/ | C:\palworld-server\Pal\Saved\SaveGames\0\ |
| 开着就更新会怎样 | 不会被拦,会半成功,所以危险的是这边 | 文件被锁住,SteamCMD 直接失败 |
| 定时任务 | systemd 加 cron | 任务计划程序 |
Windows 还有一个坑。如果你是从 Steam 客户端的工具列表里装的服务端,Steam 可能在服务器跑着的时候自己把它更新掉,那正好就是制造半份存档的标准做法。把那个条目的自动更新设置改掉,或者干脆只用 SteamCMD 管理。
把更新并进每日定时重启
反正服务器每天都得停一次。帕鲁服务端有一个至今没修掉的内存泄漏,定时重启不是选配而是前提(内存泄漏与定时重启)。既然都要停,让它每次启动前先对一次版本,额外代价基本是零:
# palworld.service 的 [Service] 段里加这两行
TimeoutStartSec=30min
ExecStartPre=/usr/games/steamcmd +force_install_dir /home/palserver/palworld +login anonymous +app_update 2394010 validate +quit
凌晨那次重启就顺便变成了版本检查。官方发版那天早上服务器已经是新版本;没发版的日子,validate 也要把文件整个校验一遍,启动会多花一两分钟。TimeoutStartSec 那一行不能省:Type=simple 下 systemd 默认的 90 秒启动超时同样管着 ExecStartPre,大版本下载超过 90 秒就会被中途杀掉,服务端根本起不来。至于「每天停一次」这件事本身怎么排——连同开机自启与崩溃自动拉起——写在24 小时不关机:开机自启、崩溃自动重启、定时重启。
但这一行少了一件事:它不会在更新前备份。 所以它必须和「重启前先跑一次备份」配成一组才算安全。没有备份的自动更新,是那种跑好几个月都没事、出事一次就全丢的做法。
常见问题
幻兽帕鲁服务器怎么更新?
顺序就是全部:先在游戏里发全服公告,用 REST 接口强制存档,停掉服务端进程,把世界目录整包备份起来,再跑 sudo -u palserver steamcmd +force_install_dir /home/palserver/palworld +login anonymous +app_update 2394010 validate +quit,最后重新启动。+force_install_dir 要指向安装目录,而且写在 +login 前面;漏了它,SteamCMD 会在别的地方另下一份,服务端还是旧版本。不要在跑着的服务端上直接覆盖,备份是在更新之前做而不是之后。
更新会不会弄丢存档?
按正确顺序做不会。更新只换服务端的程序文件,不会动 Pal/Saved/SaveGames/ 里的东西。真正危险的不是更新本身,是在存档写到一半时把进程杀掉。守住强制存档 → 停服 → 更新这个顺序,并且在那之前把世界目录整包拷一份。
更新后全员连不上是为什么?
如果是所有人同时进不去,几乎都是版本差。可能是服务端还停在旧版本,也可能反过来——服务端更新了,某个人的 Steam 还没把客户端更新上去。比对服务端启动日志里的版本和游戏主菜单角落的版本,先看清楚是哪一边落后。只有一两个人连不上的话,那是地址或端口的问题,不是版本。
帕鲁专用服务器会自动更新吗?
默认不会。Steam 只帮你更新客户端,服务端原封不动。你可以在 systemd 的 ExecStartPre 里加一行 SteamCMD,让它每次启动都检查一次(记得把 TimeoutStartSec 调长,免得大版本下载被杀掉);但光这样是「更新前没有备份」的自动更新。要让它长期没人盯着也不出事,备份必须在同一条流程里。
托管上,更新只要点一下
上面没有哪一步特别难。难的是每次官方发版都要有人正好注意到。《幻兽帕鲁》发版很勤,多半落在平常上班上课的时间,而开服的那个人通常正在上班上课。于是问题总是在晚上、大家准备一起开玩的那一刻才被发现,然后从备份到更新又要再花一段时间。
空岛灵境 的《幻兽帕鲁》专用服务器替你盯着版本。版本守卫会在官方发了新版本时自动检测,并在会员中心的服务器页面上提示;点一下「立即更新」,剩下的照顺序跑完:先备份存档,再更新、恢复运行。什么时候停机由你决定,不会在大家玩到一半时被切断。停机之前会先在游戏里发全服公告,走完倒计时、强制存档,再关服务器,所以在线的人不会丢进度。备份按时间点列在会员中心的我的服务器里,想回到哪个时间点就挑哪一个回档。