上周接到一个部署任务:在一台移动云电脑上,给某机构的信创操作系统装OpenClaw 3.2。云电脑分配的资源是2核4G,没有独立GPU,系统还是基于麒麟的定制版本。接到任务的时候我就知道,这事没那么简单。OpenClaw这类智能体框架本身依赖一堆Python包,对系统库和编译工具链的要求不低,而信创系统在软件源、权限模型、默认工具链上和常见发行版都有差异,稍不注意就是装到一半连环报错。
这篇记录一下完整过程,给同样需要在麒麟/UOS这类信创系统、无GPU环境里部署OpenClaw 3.2的朋友做个参考。整个安装流程其实不复杂,但前置检查和运行模式的选择决定了后面顺不顺利,我会把这些关键点都拆开讲清楚。
1. 为什么偏要把OpenClaw塞进一台没GPU的云电脑
1.1 移动云电脑不等于一台普通电脑
先说说部署环境。移动云电脑本质上是一个跑在云端虚拟化平台上的虚拟机,你通过客户端远程连接,看到的是一个完整的桌面系统。它和物理机的区别在于:CPU、内存、磁盘都是分时共享的,性能天花板取决于平台给你分配的资源额度;更重要的是,绝大多数云电脑实例不会配GPU,显卡只是用于远程桌面显示输出的虚拟设备,对计算完全没帮助。
这意味着你在云电脑上跑AI类应用,能用的只有CPU。2核4G对编译软件来说属于“将将够用”,对跑大模型推理来说则是“痴心妄想”。所以接到这类需求时,第一个要想清楚的问题不是“怎么装”,而是“装完之后让它怎么跑”。这个取舍我在第3部分详细说,这里先记住一个结论:部署方案的骨架必须在动手前定好,否则装完发现跑不动,浪费时间。
1.2 OpenClaw在无GPU环境下的身份界定
OpenClaw 3.2是一套智能体编排框架,它的核心作用是把大模型、外部工具、记忆系统和业务接口串成一个可对话、可执行任务的闭环。说白了,它自身不是一个“大模型”,而是一个“调度器”——用户的请求进来,它决定调用什么模型、调用什么工具、组织什么样的回复。
明白这一点,无GPU部署的可行路径就清晰了:框架本身并不直接依赖GPU,真正吃显卡的是底层推理服务。所以你完全可以在一台无GPU的云电脑上把OpenClaw装好、跑起来,然后通过配置让它调用远端的大模型API来干活。代价是整体链路多了一层网络往返,但只要云电脑到API服务之间的带宽和延迟靠谱,实际体验不会差太多。
1.3 信创系统的三条隐藏规则
麒麟和UOS虽然都是Linux,但和熟悉的Ubuntu/CentOS有很多细节差异。我这次部署下来,体会最深的是三条:
第一,软件源里的包版本普遍偏旧,而且不是所有主流软件的编译版都有收录。遇到新版本依赖,基本只能走源码编译这条路。第二,系统默认Python解释器的站点包路径受管控,直接pip装东西经常报权限错误,所以必须学会用户级安装和虚拟环境。第三,同是“麒麟V10”,还分X86版、ARM版、还有面向不同CPU的定制版,你在网上搜到的二进制包很可能和当前架构对不上。
这三条规则决定了整个安装策略:先摸清楚系统的架构和基础软件状况,再决定怎么装。所以下面的第2部分,不是我啰嗦,而是这个过程中最省时间的一步。
2. 动手前先给机器做个全面体检
2.1 确认系统发行版与CPU架构
远程登录云电脑后,我做的第一件事是确认系统身份和架构。原因很简单:信创系统版本繁多,同一个发行版在不同CPU架构上的安装包完全是两套,用错直接就白折腾。
拿到机器后,先跑两条命令:
cat /etc/os-release uname -m第一次执行有个小插曲:直接输入cat /etc/os-release,显示的内容很完整,系统是麒麟V10,版本号SP1,但没写CPU架构。补一条uname -m才确认是x86_64。这台机器是X86架构,属于相对省心的情况,起码可以尝试使用通用编译工具链;如果输出是aarch64,很多第三方包的预编译轮子就装不了,源码编译再难过一遍,那不是多出半小时的问题,而是可能多出半天。
顺带也看了下内核版本和glibc版本,因为新版Python对glibc版本有最低要求,太老的话后面会出现解释器直接崩溃的情况。检查命令:
uname -r ldd --version确认系统基础没问题之后,才继续往下走。
2.2 补齐Python与基础编译工具
OpenClaw 3.2的正常安装需要Python 3.9以上的解释器。麒麟V10自带的Python一般有两个版本,系统目录下的/usr/bin/python3不一定指向你想要的那个。我先查了版本:
python3 --version pip3 --version这台机器默认Python是3.8,理论上也能跑,但很多依赖包在3.8上已经不愿意编译新版了,保险起见我决定不折腾系统Python,直接为OpenClaw独立准备一个环境。这一步可以通过python3 -m venv完成,venv模块在完整安装的系统上通常都有,如果没有,就先装python3-venv。
编译工具链是另一个容易翻车的点。OpenClaw依赖里有一些带C扩展的包,比如音频处理、加密、科学计算相关的库,它们在pip安装时会现场编译。如果没有gcc、g++、make和Python头文件,第一波装依赖就会报“缺少Python.h”之类的错误。
排查命令:
which gcc g++ make ls /usr/include/python3.8/Python.h建议缺什么事先补齐。麒麟和UOS都基于Debian系列,补包用apt-get:
sudo apt-get update sudo apt-get install -y build-essential python3-dev python3-venv git这里多说一句,如果你平时习惯CentOS,不要惯性用yum,信创桌面版和服务器版虽然也有yum系的产品线,但目前主流云电脑镜像更多是Debian系体系,先看/etc/os-release里的ID字段,再决定包管理命令,别想当然。
2.3 软件源与网络策略的一次性配置
装基础工具的时候可能已经感受到源的速度了。公网云电脑的网络策略相对开放,但默认软件源不一定在国内,更新非常慢。我直接换成了国内镜像源,具体用的是哪个镜像就不点名了,当前响应速度都差不多,选一个稳定的即可。
换源的步骤很简单,以Debian系为例,编辑/etc/apt/sources.list,把源地址替换成镜像地址,然后apt-get update。值得注意的是,尽量不要动系统在中科大或者公司内网搭建的私有源——有些单位会在内网维护一套软件仓库,这时候直接用内网源反而最快,没有必要强行换到公网源。
Python侧的pip源我也做了同样的配置,写入了/etc/pip.conf或者用户目录下的~/.pip/pip.conf,避免后面安装Python依赖时因为网络超时反复重试:
[global] index-url = https://mirrors.xxx.com/pypi/simple trusted-host = mirrors.xxx.com处理完这些,机器的网络与软件仓库才算达到“可以开工”的状态。这一步大概花掉20分钟,但省掉了后续安装过程中的大量等待和报错。
3. 无GPU部署的命题作文:推理链路怎么走
3.1 把大模型推理留给远端API
刚拿到需求时,我脑子里冒出的第一版方案是:在云电脑上装一个本地推理引擎,再接OpenClaw。但冷静算了笔账:2核4G的资源配置,要用CPU推理一个像样的对话模型,生成速度会慢到让人失去耐心,而且内存随时可能被撑爆。
所以最终方案是:OpenClaw本机运行,大模型推理全部走远端API服务。OpenClaw这边只需要负责对话逻辑、工具调度和外部接口对接,模型的响应交给云端的大模型API来处理。这样云电脑的2核4G只需承载框架本身的运行开销,完全够用。
在OpenClaw的配置文件里,需要指定模型接入方式为OpenAI兼容API,并填写对应的模型名称、API地址和密钥。注意,API地址不推荐使用局域网外网的远程调用方式——如果云电脑和API服务都在云上,尽量选择同一地域的节点,能够显著降低延迟和丢包。
3.2 本地CPU推理的兜底方案
肯定有人问:如果网络环境不允许调用外部API怎么办?那就得考虑本机CPU推理。这个兜底方案我拆出来单独说,因为它复杂度高很多,而且效果受硬件限制严重。
可行路线是用轻量级推理引擎加载量化的小参数模型,把模型压缩到2GB以内的内存占用,然后用CPU来完成推理。整个链路大概是这样:用推理引擎启动一个本地服务,暴露给OpenClaw调用。2核4G跑量化小模型,生成速度大概在每秒几个token到十几个token之间,取决于模型大小和CPU性能,适合演示环境或低频内部使用,谈不上生产可用。
这里有一个原则性建议:如果只是做功能验证,就把预算放在远端API方案上;如果一定要本地推理,先把机器的swap分区分够再说,否则模型加载阶段直接OOM,连日志都来不及看。我这次因为公网API连通性没问题,本地推理只是做了环境层面的预留,没有真的跑业务流量。
3.3 用环境变量和配置文件关掉CUDA执念
OpenClaw依赖的许多机器学习库,默认会在启动时探测CUDA。在没有GPU的机器上,这种行为不会报致命错误,但会产生一堆无意义的警告日志,个别版本还会因为加载CUDA运行库失败而退出。
为了干净利落,我做了三个操作。第一,在启动服务的脚本里明确声明不使用GPU:
export CUDA_VISIBLE_DEVICES=""第二,把OpenClaw配置里与推理后端相关的参数设置为CPU模式。不同版本的参数名可能有差异,安装完后查一下配置示例里的相关字段即可,关键词一般是device、backend或者compute_type,确认不指向cuda就行。第三,在装依赖的时候,如果某些包有CPU版本和GPU版本之分,只装CPU版本。
做完这三件事,启动日志干净了很多,内存占用也下降了将近300MB。别小看这点内存,4G内存的云电脑本来就紧巴巴,能省一点是一点。
4. 安装过程的典型翻车现场与拆除手法
4.1 编译依赖缺失:音频库和科学计算库的连击
OpenClaw 3.2的依赖列表里,有几类包最容易出问题:处理音频的、处理自然语言的、以及做向量索引的。这些包一旦没有对应的预编译轮子,就要现场编译,编译环境不干净就报错。
第一次尝试pip install的时候,报错定位在某个音频处理库上,错误提示是src/pyaudio/deviceapi.c:14:10: fatal error: portaudio.h: No such file or directory。这不是软件包本身的问题,而是系统缺少底层开发库。
解决办法是安装portaudio的开发包:
sudo apt-get install -y portaudio19-dev第二波报错来自tokenizers这个库。它在编译时会拉取Rust工具链,而这个系统上并没有预装Rust。报错信息很醒目:curl: (28) Connection timed out——下载Rust工具链超时。同一个错误可能由网络引起,也可能由工具链缺失引起。我在另一台机器上遇到过完全一样的提示,但原因是磁盘空间不足,临时下载的Cargo缓存写不进去。
排查思路是:先看错误堆栈的关键词,是“缺少头文件”就打系统包,是“下载失败”就先处理网络和磁盘,是“未找到命令”就补工具链。不要看到一个报错就急着改源或者重装,先分类,再对症下药。
4.2 pip下载超时:源和超时策略一起调
Retrying报错是第二个坑。由于OpenClaw依赖量不小,一次性安装几十个包,即使换过镜像源,个别大包下载时间也很长,默认的15秒超时根本不够。
我在pip层面解决了两个问题:一是超时时间拉长,二是失败后允许无限次重试。命令参考:
pip install --timeout 120 --retries 10 -r requirements.txt还有个小技巧:如果某一步总是失败,不要反复重试整个requirements.txt,改用pip download先把所有轮子拉到本地,再离线安装:
pip download -r requirements.txt -d ./wheelhouse pip install --no-index --find-links=./wheelhouse -r requirements.txt这样既能看到哪些包真正没有轮子,也能把网络问题一次性暴露完。信创环境网络策略多变,两步走比直接安装稳定得多。
4.3 权限与路径:云电脑里的“用户态安装”
云电脑默认登录的是普通用户,很多目录没有写权限。假如直接跑pip install,会得到一串关于“externally-managed-environment”的提示,这其实是现代Python的一种安全设计,防止pip把包装进系统Python全局目录,从而破坏系统包管理器的统一性。
我推荐的做法是在家目录创建虚拟环境,所有依赖都装在里面:
cd ~ python3 -m venv .openclaw-venv source .openclaw-venv/bin/activate pip install --upgrade pip pip install -r requirements.txt虚拟环境能隔离掉90%的权限问题。装好之后,启动OpenClaw也在这个虚拟环境里进行。这里还要提醒一点:信创系统对家目录的配额可能有限,装完OpenClaw及其依赖后,虚拟环境体积大概率超过1GB,记得提前看下df -h的磁盘余量。如果家目录挂在独立小分区,建议把虚拟环境建到数据盘目录,再通过软链接指回来。
4.4 进程在远程断线后被杀:用nohup和screen托管
云电脑的远程连接不像本地终端那么稳定。我在验证阶段遇到的一个实际问题是:SSH会话一断,正在前台运行的启动进程就收到了SIGHUP信号,直接退出。首次部署时,我跑完安装、配置好模型参数、启动OpenClaw、正准备测试,结果客户端网络闪断了一下,重新连上去发现进程已经没了。
解决办法很简单,核心是让服务进程脱离当前会话独立运行。推荐使用screen或者tmux,它们能在后台维持一个可重新连接的终端会话:
screen -dmS openclaw bash -c 'cd ~/openclaw && source ../.openclaw-venv/bin/activate && ./start.sh --daemon'之后任何时候都可以用screen -r openclaw重新进入会话看日志,用Ctrl+A+D暂时退出。如果不想装screen,nohup也够用,只要注意把输出重定向到日志文件,不要直接丢给黑洞:
nohup python app.py > openclaw.log 2>&1 &有了这个习惯,后面无论网络怎么抖动,服务都不会因为一次断连就悄悄退出。
5. 启动验证和资源占用实测
5.1 启动前的最后检查清单
进程托管和配置准备就绪后,不要急着点启动按钮。我先核对了一份检查清单,每项都是一票否决制的——任何一项不满足,启动都会失败或者运行后异常。
第一,配置文件里的API密钥不能明文出现奇怪的字符,某些密钥中带#或$时,在YAML里必须加引号,否则会被解析成注释或变量引用。第二,监听地址不要写成0.0.0.0,除非明确需要外网访问。云电脑本身有公网映射,监听所有网卡就等于把这台机器上的服务暴露给公网扫描器,安全风险很大。第三,确认虚拟环境激活状态,别在系统Python里执行启动脚本。第四,看一眼磁盘空间,OpenClaw运行过程中会产生会话记录、日志和临时文件,空间不足时它会静默失败。
检查完毕,我通过screen会话启动了服务,命令形式大致如下:
cd ~/openclaw source ../.openclaw-venv/bin/activate python3 -c "from openclaw.cli import main; main()" --daemon启动后没有任何报错输出,进程稳定驻留,第一阶段部署成功。
5.2 日志、健康检查与首次请求
部署完成只是开始,紧接着要验证系统是否真的能干活。我观察了日志的输出节奏,正常状态下,日志会定期输出心跳和任务执行记录,如果日志长时间静止,多半是内部任务队列或外部API连接出了问题。
更直接的验证方式是触发一次真实的请求。我通过OpenClaw提供管理接口或命令行工具发起了一次测试对话,然后重点观察三件事:请求是否被正确路由到远端API,API响应是否正常返回给框架,以及框架是否正确执行了工具调用。
第一次测试时,请求发出去等了将近40秒才返回结果。追查日志才发现,模型API的响应本身很快,但OpenClaw内部某个插件做了一次联网检索,那个检索请求在无网络代理环境下走了慢链路。把插件的超时时间改短之后,首字延迟降到了5秒以内。这个问题不实测根本发现不了——功能是通的,但体验不足以交付。
5.3 内存、CPU和swap的实际读数
验证通过后,我给这台云电脑做了个粗略的资源画像。用top观察了30分钟,OpenClaw主进程占用CPU在15%到40%之间波动,内存稳定在1.2GB左右。信号正常时,这个涨幅主要来自日志缓存和内部会话状态保存。对于一个2核4G的机器,1.2GB内存给了基础设施应用一份可接受的账单,剩下的空间还能让它维持系统远程桌面和临时任务运行。
磁盘上,OpenClaw安装目录加虚拟环境共约1.6GB,日志目录每天增长大约20MB,这个量级在数据盘上完全不是问题。整体结论是:无GPU机器跑OpenClaw完全可行,前提是推理不落在本机;资源瓶颈点不在部署,而在推理链路的外部依赖。
6. 让它长期稳定运行的收尾动作
6.1 把启动过程封装成systemd服务
screen托管适合调试期,长期运行总是依赖一个随时可能被清理的终端会话,不靠谱。我最后把启动过程写成了systemd服务,用systemd来保证开机自启和崩溃拉起。
普通用户模式下,先创建用户级systemd服务目录:
mkdir -p ~/.config/systemd/user然后编辑服务文件~/.config/systemd/user/openclaw.service,大致内容如下:
[Unit] Description=OpenClaw 3.2 Service After=network-online.target [Service] Type=simple WorkingDirectory=/home/xxx/openclaw Environment=CUDA_VISIBLE_DEVICES= ExecStart=/home/xxx/.openclaw-venv/bin/python3 /home/xxx/openclaw/app.py Restart=on-failure RestartSec=10 [Install] WantedBy=default.target启用服务:
systemctl --user daemon-reload systemctl --user enable --now openclaw注意,用户级systemd在某些云电脑的登录会话中不会自动启动,需要用loginctl enable-linger开启持久会话,否则只要用户一登出,服务照样停。这台机器是桌面环境常驻的,不涉及这个问题,但如果你操作的是纯SSH服务器版,一定要处理一下linger。
6.2 定时守望与异常自愈
systemd已经能覆盖崩溃自动拉起,但实际运行中还会有一些“假死”情况——进程在,端口在,就是不再处理任何请求。这种情况systemd检测不到,需要外部守望。
我在crontab里加了一个轻量健康检查:
*/5 * * * * curl -fsS http://127.0.0.1:8000/health || systemctl --user restart openclaw这个方案的逻辑是:每五分钟探测一次健康接口,连续失败就重启服务。注意curl的-fsS参数,-f是有错误即返回非零退出码,这样cron才会执行后面的重启命令。如果你用的健康检查地址返回JSON,可以再结合-o /dev/null把输出丢进黑洞,避免每分钟留日志。
6.3 安全基线:监听地址与密钥管理
云电脑被打公网扫描是家常便饭,服务只应该监听本机内部地址。我确认了OpenClaw配置里的监听参数是127.0.0.1,这样即便是云电脑主机的公网映射开着,外部也摸不到服务端口。
如果确实有远程访问需求,建议用系统自带的防火墙只放行特定来源网段,或者通过云电脑平台的网络安全组做访问控制,不要直接裸暴露端口。至于模型API密钥,尽量通过环境变量注入,而不是写死在配置文件里提交到任何代码仓库。我在启动脚本里用export注入了密钥,服务进程和脚本本身都归当前用户所有,权限设置为700,基本能堵住大部分低水平泄露风险。
7. 收尾:信创无GPU环境部署的几条心法
整套流程跑完之后,我复盘了一下这次部署里真正省时间、少掉坑的几条经验。
第一,前期架构决策比手速重要。先想清楚推理链路放哪,再去动安装命令,能避免装完发现方案不可行、推倒重来的窘境。第二,信创系统不是CentOS也不是Ubuntu,包管理器和软件源的配置都要按实际版本来,不要拿别的发行版经验硬套。第三,所有需要长期驻留的进程,不要依赖远程终端的活跃状态,尽早切到systemd或screen托管。第四,2核4G无GPU环境并不是不能用,关键是让AI框架专注做它擅长的编排调度,把计算密度最高的推理放在外部服务,这样各方都轻松。
如果你也卡在一个看似简单的依赖编译报错上,先看看是不是缺了某个名字里带dev的系统包,再检查一下源和超时,大概率是这两处的问题。希望这篇记录能让你少走几步弯路。