问题背景
最近有用户在 Ubuntu 24.04 上升级 OpenClaw 至 2026.3.2 版本时遇到了阻碍。运行安装脚本或启动仪表盘时,终端会抛出类似这样的错误:
Error: systemctl is-enabled unavailable: Command failed: systemctl --user is-enabled openclaw-gateway.service
简单来说,就是程序在尝试检查用户级 systemd 服务(openclaw-gateway.service)是否启用时失败了。旧版本里这事儿能自动处理,但新版本逻辑变严了,一旦检查失败就直接中止流程。哪怕是在全新环境或者试过 loginctl enable-linger,问题还是会出现。
原因分析
这通常是因为 Ubuntu 24.04 在某些非登录会话(non-login session)下,默认没有正确初始化用户级的 systemd 环境(User Slice)。结果导致 systemctl --user 命令找不到正确的 D-Bus 会话总线或运行时目录,直接报'不可用'。
修复步骤
别急,我们可以通过手动配置环境变量和创建占位服务来绕过这个检查。跟着下面的步骤操作即可。
1. 指定运行时目录
首先,我们需要手动告诉系统用户服务的运行时路径在哪里。执行以下命令:
export XDG_RUNTIME_DIR=/run/user/1000
export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
这一步很关键。systemctl --user 依赖这两个变量来定位 socket。如果在自动化脚本或非交互式 Shell 里没设好,它就不知道去哪发指令。显式设置后,命令就能连上用户服务管理器了。
2. 创建占位服务文件
既然检查的是服务状态,那我们就先'骗'过它。创建一个临时的服务定义:
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,这样一旦运行就被视为'活跃'。这么做是为了满足安装脚本对文件存在性的隐式检查,避免它在真正服务生成前就报错退出。
3. 重载并启用服务
配置写好了,得让 systemd 知道:
systemctl --user daemon-reload
systemctl --user enable --now openclaw-gateway.service
systemctl --user is-enabled openclaw-gateway.service
这一步正式把服务注册进数据库。当后续安装命令再次调用 is-enabled 检查时,systemd 就能顺利找到它并确认已启用,从而通过原本导致崩溃的检查点。
4. 执行正式安装
环境准备好后,就可以跑官方安装命令了:
openclaw gateway install
systemctl --user daemon-reload
systemctl --user restart openclaw-gateway.service

