UE4SS 用于幻兽帕鲁 Linux 专用服务器 (GLIBC 2.28)

UE4SS 用于幻兽帕鲁 Linux 专用服务器 (GLIBC 2.28)

一个真正能在游戏服务器容器上加载的原生Linux UE4SS构建。基于RE-UE4SS-Linux源码重建,将GLIBC下限降至2.28,而官方版本需要2.39且拒绝加载。 libUE4SS.so正是生产环境中运行Palworld专用服务器的那个,外加启动器、设置和安装指南。

真正能在原生 Linux Palworld 专用服务器上加载的 UE4SS

这个社区的普遍回答是,模组无法在原生 Linux 专用服务器上运行,因为 UE4SS 仅支持 Windows。模组页面也直接说明了这一点:

原生 Linux 专用服务器不受支持,因为它们无法加载 UE4SS。

这对于官方发行版(提供的是 DLL)来说是正确的。但作为一个普遍说法,这是不正确的。原生 Linux 构建是存在的,并且可以正常工作。

本页面托管了确切用于在生产环境中运行公共 Palworld 服务器的 [b]libUE4SS.so[/b],以及其所需的启动器和设置文件。目前有 8 个服务端模组在它上面运行,其中包括两个作者自己声明与 Linux 不兼容的模组。


为什么用这个构建而不是上游发行版

官方 RE-UE4SS-Linux 0.1.1 包链接到了 [b]GLIBC_2.39[/b]。大多数游戏服务器容器(BisectHosting、Pterodactyl 镜像、Debian 10/11 基础镜像、CentOS/Alma 8)的最高版本远低于此,加载器直接拒绝加载——没有模组、没有日志、没有解释。

这个工件是从相同源码重建的,将要求降低到了 [b]GLIBC_2.28[/b],因此它可以在这些容器上加载。

sha256   0b96231d9ad00f9de7213dea945ccfc7b9128ee80389986581a3cd7e68c41ff4
size     23,002,053 bytes
glibc    GLIBC_2.28 ceiling
arch     x86_64
config   Game__Shipping__Linux

这个构建 [b]不是[/b] 字节可复现的(patternsleuth_bind 是 Rust + LTO),所以不要通过比较哈希来验证重建——而是验证 glibc 上限。构建配方、验证器和完整的来源信息都在 GitHub 上: github.com/prado1506/ue4ss-linux-oldglibc

血统

UE4SS-RE/RE-UE4SS              官方上游
  |- tc-imba/RE-UE4SS          Linux 移植(分支 linux-port)
    |- NullPrism/RE-UE4SS-Linux   非官方 Linux 下游(0.1.1)
      |- this artifact            相同源码,GLIBC_2.28 上限

这是一个 [b]非官方下游[/b]。它与官方 UE4SS 项目无关,也不受其支持。不要将问题提交给 UE4SS 维护者。


安装(Palworld 专用服务器)

将包放置在原生服务器可执行文件旁边:

Pal/Binaries/Linux/
|- libUE4SS.so
|- run_ue4ss.sh
|- UE4SS-settings.ini
|- Mods/
|- UE4SS-crashes/

通过提供的包装脚本启动,而不是直接调用服务器:

stage=/srv/palworld/Pal/Binaries/Linux

UE4SS_CRASH_LOG_DIR="$stage/UE4SS-crashes" \
  "$stage/run_ue4ss.sh" \
  --host-executable "$stage/PalServer-Linux-Shipping" \
  /srv/palworld/PalServer.sh \
  -useperfthreads -NoAsyncLoadingThread -UseMultithreadForDS

安装前验证归档文件:

sha256sum -c SHA256SUMS

完整说明(包括 SELinux 预检模式和每次游戏更新后需要重新运行的内容)在归档文件内的 [b]INSTALL.md[/b] 中。

一项必须的设置

[b]UE4SS-settings.ini[/b] 中:

[Hooks]
EngineTickResolveMethod = VTable

默认值是 [b]Scan[/b]。在这个构建中,两个地址会分叉,每次启动时日志都会发出警告:

GameEngine::Tick address (vtable: 0xa396170; scan: 0xa396840)
WARNING: VTable and scan addresses differ for UGameEngine::Tick
Using scan address for GameEngine::Tick

使用 [b]Scan[/b] 时,服务器会崩溃并显示:

Exception was "SIGSEGV: invalid attempt to read memory at address 0x00000000000000a0"
libUE4SS.so!TDetourInstance<...>::StaticHookFn(UEngine*, float, bool)

那个签名——[i]UEngine*, float, bool[/i]——就是 UGameEngine::Tick 钩子。使用 [b]VTable[/b] 后,最后一行变成“Using vtable address”,崩溃没有再出现。它看起来是随机失败,所以务必先设置正确。


在为其编写模组之前请阅读

Linux UE4SS 不是 Windows UE4SS 换了文件扩展名。这些差异是在 Palworld v1.0.2.101103 的生产环境中实测得出的:

RegisterHook                    工作
ExecuteInGameThread             工作
ExecuteInGameThreadWithDelay    工作,且准时
ExecuteWithDelay                永不触发
LoopAsync                       永不触发
RegisterKeyBind                 加载了但什么都不做(没有本地输入)
ForEachProperty/ForEachFunction 静默返回零
NotifyOnNewObject(PalHUDService) 永不触发(服务器上没有 HUD)

[b]ExecuteWithDelay 和 LoopAsync 是被故意禁用的[/b],在 UE4SS/include/Mod/LuaMod.hpp 中——每个模组的异步工作线程在 Linux 上被跳过,因为它的关闭路径可能间歇性地杀死宿主进程。计划被接受,队列在增长,但没有人消费它。一个模组可以加载、宣布自己就绪、列出所有功能,然后什么都不做。

不要重新启用那个线程。改为通过重新调度来构建定时器:

local function tick()
    pcall(doWork)
    pcall(function()
        ExecuteInGameThreadWithDelay(intervalMs, tick)
    end)
end

重新调度被特意放在自己的 pcall 中:如果工作抛出异常,定时器必须存活,否则一个孤立的错误就会让模组在整个会话中停止工作。

另外值得一提:这个构建运行的是 [b]Lua 5.4.7,不是 LuaJIT[/b]。在 5.1 中重新赋值 [i]for[/i] 控制变量是合法的,在 5.4 中则是编译错误,所以为 LuaJIT 编写的模组可能直接无法加载。而且没有 GUI,所以在无头服务器上无法使用 UE4SS 的对象/头文件/.usmap 转储器。

已知问题:Palworld 1.0.3 会破坏 HookEngineTick

1.0.2.100993   工作
1.0.2.101103   工作(已在生产环境验证)
1.0.3.101283   在“Event loop start”后约 2-3 秒出现信号 11

在 1.0.3 上,另外 13 个钩子保持稳定;只有 EngineTick 会失败。参见 issue #38。那边的解决方法是 HookEngineTick = 0——服务器保持在线,但所有需要定时器的模组都会停止工作。我们上面提到的地址分叉证据可能就是实际原因;值得先尝试 EngineTickResolveMethod = VTable。


已在此构建上验证运行的模组

全部都是服务端模组。任何人都无需在客户端安装任何东西,包括 Xbox 和 PlayStation 玩家。

  • [b]PalCaptureBosses[/b] - 塔楼/捕食者/突袭首领可以捕捉,带有真实的难度曲线
  • [b]PalDungeonCompass[/b] - 地牢传送门和遗物雕像显示在每个人的指南针上,无需侦察帕鲁
  • [b]PalLevelScaling[/b] - 野外帕鲁以附近玩家的等级生成
  • [b]PalLootScaling[/b] - 随着玩家接近满级,掉落率逐渐提高
  • [b]BreedHumans[/b] - 繁殖农场中的两个人类会生出一个人类
  • [b]HumansWithGender[/b] - 给帕鲁世界的人类赋予性别
  • [b]AdminCommands[/b] (dkoz) - 带有三个 Linux 兼容性修复
  • [b]AutoLootNearbyItems[/b] (YellowChick) - 带有六个 Linux 兼容性修复
  • [b]Jolthog Fishing Shadow Sync[/b] (mod 4817) - 未修改;尽管页面声明不支持 Linux 服务器,仍然运行良好

源码、问题、致谢

以 MIT 许可发布,与 UE4SS 相同。所有关于 UE4SS 本身的功劳归于 UE4SS 团队、tc-imba 的 Linux 移植和 NullPrism 的下游。这里唯一属于我的是降低的 glibc 下限和生产环境实测数据。