问题描述:
用户在将 OpenClaw 升级到版本 2026.3.2 后,在 Ubuntu 24.04 系统上运行安装脚本或启动仪表盘时遇到了错误。
具体错误信息为:Error: systemctl is-enabled unavailable: Command failed: systemctl --user is-enabled openclaw-gateway.service。
这意味着程序试图检查用户级 systemd 服务(openclaw-gateway.service)是否启用时失败了。在旧版本中正常工作,但在新版本中失效了。即使在全新的 Ubuntu 24.04 环境中或者尝试了 loginctl enable-linger 命令,问题依然存在。
根本原因推断:
Ubuntu 24.04 及某些 Linux 发行版在非登录会话(non-login session)或特定环境下,默认可能没有正确初始化用户级的 systemd 环境(User Slice)。这导致 systemctl --user 命令无法连接到正确的 D-Bus 会话总线或找不到运行时目录,从而报错"unavailable"。
OpenClaw 的新版本可能增加了对服务状态的严格检查,如果检查失败则直接中止流程,而不再像以前那样忽略或尝试自动修复。
临时解决方案
第一步:设置环境变量
export XDG_RUNTIME_DIR=/run/user/1000
export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
作用: 手动指定用户运行时目录和 D-Bus 会话地址。
为什么有效:systemctl --user 依赖这两个环境变量来找到 systemd 用户实例的套接字。在某些自动化脚本或非交互式 shell 中,这些变量可能未设置,导致 systemd 客户端不知道去哪里发送命令。显式设置它们可以让 systemctl 命令成功连接到用户服务管理器。
第二步:创建配置目录和服务文件
mkdir -p ~/.config/systemd/user
cat > ~/.config/systemd/user/openclaw-gateway.service <<'EOF'
[Unit]
Description=OpenClaw Gateway (bootstrap placeholder)
[Service]
Type=oneshot
ExecStart=/bin/true
RemainAfterExit=yes
[Install]
WantedBy=default.target
EOF
作用:手动创建一个名为 openclaw-gateway.service 的"占位符"服务文件。这个服务什么都不做(执行 /bin/true),但标记为 RemainAfterExit=yes,意味着它一旦运行就会被视为"活跃"状态。
为什么有效:
满足文件存在性检查:OpenClaw 的安装脚本可能在运行 is-enabled 之前,隐式地期望该服务文件已经存在于用户配置目录中。如果文件不存在,某些 systemd 版本或封装逻辑可能会直接报错。
通过状态检查:脚本随后会运行 systemctl --user is-enabled。由于我们手动创建了这个文件并将在下一步启用它,这个检查就会返回成功(enabled),从而让安装脚本继续执行,而不是抛出异常退出。
第三步:重载并启用占位服务
systemctl --user daemon-reload
systemctl --user enable --now openclaw-gateway.service
systemctl --user is-enabled openclaw-gateway.service
作用:通知 systemd 重新加载配置,然后启用并立即启动刚才创建的占位服务,最后再次确认其状态。
为什么有效:这一步正式在 systemd 数据库中注册了该服务。当后续的 openclaw gateway install 命令运行时,它再次调用 is-enabled 检查时,systemd 能够顺利找到该服务并确认其已启用,从而通过了原本导致崩溃的检查点。
第四步:运行正式安装并重启
openclaw gateway install
systemctl --user daemon-reload
systemctl --user restart openclaw-gateway.service
作用:现在环境已准备好,运行官方安装命令。安装程序可能会覆盖刚才创建的占位符服务文件,将其替换为真正的网关服务配置。最后重启服务以应用真实配置。
为什么有效:之前的步骤只是"骗"过了安装前的检查机制,让安装程序得以运行。一旦安装程序运行,它会写入正确的服务定义。最后的 restart 确保运行的是真正的 OpenClaw 网关,而不是那个只返回 true 的占位符。