在ARM设备上跑饥荒服务器?Box64转译遇到的坑与解法
最近折腾家庭服务器,手里正好有块闲置的ARM开发板,想着能不能把经典的《饥荒联机版》服务器架在上面。毕竟这种低功耗设备挂服最合适了,电费都不心疼。
按照常规思路,市面上那个开源的“饥荒服务器面板DMP”虽然好用,但它主要是针对AMD/x86架构编译的。要在ARM板子上跑,最直接的办法就是用转译工具。这里我选用了 box64,它能在ARM64环境下模拟x86环境,性能损耗相对其他方案要小不少。
遇到的棘手问题
环境搭好后,大部分功能出人意料地顺滑。不仅面板能正常启动,连自动下载游戏核心、拉取Mod这些重活都没报错。但是,当你满心欢喜打开管理界面查看服务器状态时,尴尬的事情发生了——
游戏的世界天数、季节状态等关键数据全都是空的。
服务器明明在跑,人也能进,但面板就像是瞎了一样,读取不到这些实时信息。这个问题不解决,实际上就失去了用面板管理的意义了。
问题分析与解决方案
经过一番摸索,这个问题的根源大概率出在 box64 对某些底层系统调用的转译差异上,或者是面板与游戏进程通信的某个协议细节在跨架构环境下出现了数据对齐错误。
如果你也遇到了同样的情况,可以尝试以下几个排查步骤(这也是我对这个Bug的修复思路):
-
开启调试日志 不要光猜,先看日志。在启动服务器和面板时,带上最高级别的日志参数(特别是Lua脚本日志),查看在查询状态时是否有具体的报错信息。很多时候,数据读不出来是因为抛出了异常被静默吞掉了。
-
检查网络通信端口 饥荒服务器的状态信息通常是通过特定的UDP/TCP端口向外广播的。在x86转译环境下,有时候绑定地址会莫名变成
127.0.0.1而非0.0.0.0。检查一下服务器的cluster.ini和server.ini配置,确认监听地址设置正确。 -
尝试纯源码重编译(终极方案) 如果转译实在搞不定,建议放弃
box64这种“曲线救国”的方法。虽然麻烦点,但如果你能拿到DMP面板的源代码,或者直接使用官方提供的Dedicated Server脚本,在ARM Linux环境下进行原生编译是最稳妥的。- 对于游戏核心,Klei官方并不提供Linux ARM版的二进制文件,这时候可能需要寻找社区移植版(如某些针对树莓派优化的分支)。
- 对于面板本身,如果没有ARM预编译包,尝试拉取源码,在本地修改Go或Python的依赖后重新编译。这能从根本上杜绝转译带来的奇奇怪怪的问题。
换个思路:容器化部署
现在Docker在ARM上的生态已经非常好了。其实不如直接去找找现有的ARM适配镜像。社区里有很多大佬已经做好了针对 aarch64 架构的饥荒服务镜像,直接 docker run 往往比自己魔改编译要省心得多。
如果你有服务器状态显示的更好解决方案,欢迎在评论区交流,毕竟这种小众坑,还得靠大家互相踩坑填平。

评论已关闭