借助 OpenShell 在 DGX Spark 上安全托管长时运行的 AI 智能体
在 DGX Spark 上通过 NVIDIA OpenShell 沙盒使用本地模型运行 OpenClaw
基本思路
OpenClaw 是一款本地优先的 AI 智能体,它运行在您的计算机上,将内存、文件访问、工具使用和社区技能整合到一个持久的助手之中。由于它直接运行在您的系统上,因此该智能体可以访问您的文件、凭据和网络——这会带来真正的安全风险。
NVIDIA OpenShell 解决了这个问题。它是一个开源的沙盒运行时环境,通过声明式的 YAML 策略将智能体程序封装在内核级隔离环境中。OpenShell 控制智能体程序可以读取哪些磁盘数据、可以访问哪些网络端点以及拥有哪些权限——同时不会禁用智能体程序所需的关键功能。
通过将 OpenClaw 与 DGX Spark 上的 OpenShell 结合使用,您可以获得本地 AI 智能体的全部功能,并由 128GB 的统一内存支持大型模型,同时对文件系统访问、网络出口和凭证处理进行显式控制。
通知与免责声明
快速启动安全检查
请务必使用干净的环境。在全新的设备或虚拟机上运行此剧本,其中不应包含任何个人数据、机密信息或敏感凭证。将其视为沙盒——保持隔离。
安装此操作手册即表示您已承担所有第三方组件的责任,包括审查其许可协议、条款和安全措施。请在安装或使用前阅读并接受相关条款。
您将获得什么
该操作手册展示了实验性人工智能智能体的功能。即使您的工具包中包含 OpenShell 等先进的开源工具,您仍然需要针对特定的威胁模型添加适当的安全措施。
AI 智能体的主要风险
使用人工智能智能体时请注意以下风险:
数据泄露 – 该特工访问的任何资料都可能被曝光、泄露或窃取。
恶意代码执行 – 该智能体或其连接的工具可能会使您的系统面临恶意代码或网络攻击的风险。
非预期行为 – 智能体可能会在未经明确批准的情况下修改或删除文件、发送消息或访问服务。
提示词注入和操纵 – 外部输入或连接的内容可能会以意想不到的方式劫持智能体的行为。
安全最佳实践
没有哪个系统是完美的,但这些做法有助于保护您的信息和系统安全。
隔离环境 – 在干净的 PC 或独立的虚拟机上运行。仅配置您希望智能体访问的特定数据。
切勿使用真实账户 – 不要关联个人账户、机密账户或生产账户。创建权限最低的专用测试账户。
审核您的技能/插件 – 仅启用来自可信来源且经过社区审核的技能。
锁定访问权限 – 确保您的 OpenClaw UI 或消息通道未经适当身份验证无法通过网络访问。
限制网络访问 – 在可行的情况下,限制智能体的互联网连接。
完成后请清理 – 删除 OpenClaw 并撤销您授予的所有凭据、API 密钥和帐户访问权限。
您将完成
您将安装 OpenShell CLI (openshell) 在您的 DGX Spark 上部署网关,并使用预构建的 OpenClaw 社区沙盒在沙盒环境中启动 OpenClaw。该沙盒默认强制执行文件系统、网络和进程隔离。您还需要配置本地推理路由,以便 OpenClaw 使用在您的 Spark 上运行的模型,而无需外部 API 密钥。
常见用例
安全智能体实验:在不向智能体暴露您的主文件系统或凭据的情况下测试 OpenClaw 技能和集成。
企业私有环境开发:将所有推理路由到 DGX Spark 上的本地模型。除非您在策略中明确允许,否则任何数据都不会离开机器。
可审计智能体访问权限:对策略 YAML 文件进行版本控制,使其与项目保持一致。在授予访问权限之前,务必仔细审查智能体可以访问的具体内容。
迭代策略调整:使用 openshell term 实时监控被拒绝的连接,然后热加载更新后的策略,而无需重新创建沙盒。
前置知识
熟练使用 Linux 终端和 SSH
对 Docker 有基本了解(OpenShell 在 Docker 容器内运行 k3s 集群)
熟悉 Ollama 本地模型服务
了解安全模型:OpenShell 通过隔离降低风险,但无法消除所有风险。请审查 OpenShell 文档 和 OpenClaw 安全指南。
先决条件
硬件要求:
NVIDIA DGX Spark,配备 128GB 统一显存
对于大语言模型(例如,Qwen3.5-35B-A3B ),需要 24GB 以上可用内存。
软件要求:
NVIDIA DGX 操作系统(Ubuntu 24.04 Base)
Docker Desktop 或 Docker Engine 正在运行: docker info
Python 3.12 或更高版本: python3 --version
uv 软件包管理器: uv --version(使用以下方式安装 curl -LsSf https://astral.sh/uv/install.sh | sh )
Ollama 0.17.0 或更高版本: ollama --version
通过网络从 PyPI 下载 Python 包,并从 Ollama 下载模型权重
NVIDIA Sync 已安装并配置好,适用于您的 DGX Spark
【建议】由于 Openshell 部署涉及写入本地 IP 地址,建议所有部署均在一个稳定的网络环境下进行, 改变 IP 地址将会造成 Service 报错
时间和风险
预计时间:30-40 分钟(加上模型下载时间,这取决于模型大小和网络速度)
注意:
风险等级: 中等
- OpenShell 沙盒强制执行内核级隔离,与直接在主机上运行 OpenClaw 相比,显著降低了风险。
- 沙盒默认策略会拒绝所有未明确允许的出站流量。配置错误的策略可能会阻止合法的智能体流量;请使用 openshell logs 进行诊断。
- 在不稳定的网络环境下,大型模型下载可能会失败。
- 回滚:使用以下命令删除沙盒:openshell sandbox delete 停止网关:openshell gateway stop 并可选择用以下命令将其销毁 openshell gateway destroy。Ollama 模型移除:ollama rm。
- 最后更新时间:2026 年 3 月 13 日
第 1 步 – 确认您的环境
在安装任何软件之前,请确认操作系统、GPU、Docker 和 Python 都已安装。
head -n 2 /etc/os-release
nvidia-smi
docker info --format '{{.ServerVersion}}'
python3 --version确保 NVIDIA Sync 配置了自定义端口:名称使用 “OpenClaw”,端口使用“18789”。
预期输出应显示 Ubuntu 24.04 (DGX OS)、检测到的 GPU、Docker 服务器版本和 Python 3.12+。
第 2 步 – Docker 配置
请按以下步骤完成提示项:
docker ps
如果收到权限被拒绝的错误(尝试连接到 unix:///var/run/docker.sock 的 Docker API 时,权限被拒绝。),将您的用户添加到系统的 Docker 用户组。这将使您能够运行 Docker 命令而无需 sudo 执行此操作的命令如下:
sudo usermod -aG docker $USER newgrp docker
请注意,将用户添加到组后,您应该重启 Spark,以使此更改在所有终端会话中持久生效。
现在我们已经验证了用户的 Docker 权限,接下来必须配置 Docker,使其能够使用 NVIDIA 容器运行时。
sudo nvidia-ctk runtime configure --runtime=docker sudo systemctl restart docker
运行示例工作负载以验证设置
docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi
第 3 步 - 安装 OpenShell 命令行界面
创建虚拟环境并安装 openshell 命令行界面 (CLI)。
cd ~ uv venv openshell-env && source openshell-env/bin/activate uv pip install openshell openshell --help
如果您没有安装 uv 环境:
curl -LsSf https://astral.sh/uv/install.sh | sh export PATH="$HOME/.local/bin:$PATH"
预期输出应显示 openshell 带有子命令的命令树,例如 gateway, sandbox, provider 和 inference。
第 4 步 - 在 DGX Spark 上部署 OpenShell 网关
网关是管理沙盒的控制平面。由于您直接在 Spark 上运行,它会在本地 Docker 容器中部署。
openshell gateway start openshell status
openshell status 应反馈 gateway 状态为 “connected” 。首次运行由于 Docker 需要拉取所需的镜像,可能需要一分钟时间。
注意:
远程网关部署需要无密码 SSH 访问。请确保在使用参数 --remote 前已将您的 SSH 公钥添加到您 DGX SPARK 的 SSH 密钥列表中: ~/.ssh/authorized_keys 。
提示:
如果您想从单独的工作站管理 Spark 网关,请从工作站运行 openshell gateway start --remote @.local 所有后续命令都将通过 SSH 通道执行。
第 5 步 - 安装 Ollama 并拉取模型
安装 Ollama(如果尚未安装)并下载用于本地推理的模型。
curl -fsSL https://ollama.com/install.sh | sh ollama --version
DGX Spark 的 128GB 内存可以运行大型模型:
可用 GPU 显存 | 建议模型 | 模特尺寸 | 备注 |
|---|---|---|---|
16–18 GB | Qwen3.5-27b | 约17 GB | |
20-22 GB | GLM-4.7-Flash | 约19 GB | |
20-24 GB | Qwen3.5-35B-A3B | 约 24 GB |
请确认 Ollama 是否正在运行(安装后会自动作为服务启动)。如果未运行,请手动启动:
ollama serve &
把 Ollama 配置为监听所有接口,这样 OpenShell 网关容器才能访问它。创建一个 systemd 的覆盖配置:
mkdir -p /etc/systemd/system/ollama.service.d/ sudo nano /etc/systemd/system/ollama.service.d/override.conf
把下面代码写入文件中(如果文件不存在,新建一个):
[Service] Environment="OLLAMA_HOST=0.0.0.0"
保存并退出文件编辑,并重启 Ollama :
sudo systemctl daemon-reload sudo systemctl restart ollama
确认 Ollama 正在监听所有端口:
ss -tlnp | grep 11434
您应该从输出中看到 “*:11434” ;如果输出中仅包含 “127.0.0.1:11434” 请检查在执行 systemctl daemon-reload 并重启服务前创建的覆盖配置的内容
接下来,运行 Ollama 中的模型(从 Ollama 模型库中调整模型名称以匹配您的选择)。 指令 ollama run 如果模型尚未存在,该命令会自动拉取模型。在此处运行模型可确保在使用 OpenClaw 时模型已加载并准备就绪,从而降低后续超时的可能性。例如 Qwen3.5-35B-A3B :
ollama pull qwen3.5:35b-a3b ollama run qwen3.5:35b-a3b
确认模型是否可用:
ollama list
第 6 步 - 创建推理提供程序
我们将创建一个指向本地 Ollama 服务器的 OpenShell Provider 。这样,OpenShell 就可以将推理请求路由到托管在 Spark 上的模型。要为集群创建提供程序,请替换 {Machine_IP} 为您的 DGX Spark 的 IP 地址。
openshell provider create \
--name local-ollama \
--type openai \
--credential OPENAI_API_KEY=not-needed \
--config OPENAI_BASE_URL=http://{Machine_IP}:11434/v1注意:
在 Docker 容器内部, host.docker.internal 这个主机名会被解析成宿主机的地址。如果您的 Ollama 监听的是不同的端口或主机,请相应地调整 URL 。
第 7 步 - 配置推理路由
将 host.docker.internal endpoint 指向 Ollama 中的模型(在每个沙盒中都可用):
openshell inference set \ --provider local-ollama \ --model qwen3.5:35b-a3b
请验证配置:
openshell inference get
预期输出应显示 “Provider: local-ollama” 和 “Model: qwen3.5:35b-a3b” (或者您选择的其他模型)。
第 8 步 - 部署 OpenShell 沙盒
使用预构建的 OpenClaw 社区沙盒创建沙盒。这将从 OpenShell 社区目录中拉取 OpenClaw Dockerfile、默认配置和初始化脚本:
openshell sandbox create \ --keep \ --forward 18789 \ --name dgx-demo \ --from openclaw \ -- openclaw-start
注意:
当使用参数 --from openclaw 时,请勿通过参数 --policy 使用本地文件路径(例如 openclaw-policy.yaml )。 该策略与沙盒捆绑在一起;使用本地文件路径可能会导致“ file not found. ”错误。
参数 --keep 会在初始进程退出后保持沙盒运行,以便您稍后重新连接。这是默认设置。要在初始进程退出时终止沙盒,请使用参数:--no-keep 。
注意:
沙盒名称会显示在创建输出中。您也可以使用以下命令显式设置它:--name <你的名字> 。稍后要查找沙盒,请运行 openshell sandbox list 。
CLI 将执行以下操作:
将 openclaw 与社区目录进行对照解析
拉取并构建容器镜像
应用捆绑沙盒策略
在沙盒内启动 OpenClaw
要验证沙盒中启用的默认策略,请运行以下命令:
openshell sandbox get <sandbox_name>
第 9 步 - 在 OpenShell 沙盒中配置 OpenClaw
沙盒容器将启动,您将在引导下完成 OpenClaw 安装过程。请按照以下提示操作。
使用方向键和回车键与安装程序进行交互。
如果您理解并同意,请使用键盘上的箭头键选择“是”,然后按 Enter 键。
Quickstart vs Manual :选择 Quickstart ,然后按 Enter 键。
Model/auth Provider :选择 Custom Provider ,为倒数第二个选项。
How do you want to provide this API key? :请粘贴 API 密钥。
API key :请输入“ ollama ”。
Endpoint compatibility :选择 OpenAI-compatible 然后按 Enter 键。
- Model ID :qwen3.5:35b-a3b
由于 Ollama 模型需要在后台启动,这可能需要 1-2 分钟。
Endpoint ID :保留默认值。
Alias :gpt-oss:120b(这一步是可选项)。
Channel :选择 Skip for now 。
Search provider :选择 Skip for now 。
Skills :选择 No 。
Enable hooks :选择 Skip for now ,然后按 Enter 键。
完成最后几个步骤可能需要 1-2 分钟。之后,您应该会看到一个包含 token 的 URL,您可以使用该 token 连接到网关。
预期输出结果应与以下内容类似,具体 token 是不同的。
OpenClaw gateway starting in background. Logs: /tmp/gateway.log UI: http://127.0.0.1:18789/?token=9b4c9a9c9f6905131327ce55b6d044bd53e0ec423dd6189e
如果您使用 Spark 作为主要设备,请在 UI 部分右键单击 URL,然后选择“打开链接”。
**第一次在网页端打开 Dashboard 会出现 “Gateway Token Mismatch” 或类似 Token 报错,可在 Dashboard-> Overview -> Gateway Token 中手动填入之前获得的 Token ,Refresh 后可解决问题。**从主机或远程系统访问 Dashboard:** Dashboard URL(例如: http://127.0.0.1:18789/?token=... 由于该服务器位于沙盒内,因此主机默认情况下不会转发 18789 端口。要从您的主机或其他机器访问它,请使用 SSH 本地端口转发。从可以访问 OpenShell 网关的机器上运行以下命令(将 gateway URL, sandbox-id, token 和 gateway-name 替换为您环境中的值):
ssh -o ProxyCommand='/usr/local/bin/openshell ssh-proxy --gateway https://127.0.0.1:8080/connect/ssh --sandbox-id <sandbox-id> --token <token> --gateway-name openshell' -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=ERROR -N -L 18789:127.0.0.1:18789 sandbox
然后在本地浏览器中打开 http://127.0.0.1:18789/?token=
如果您使用的是 NVIDIA Sync ,请右键单击用户界面中列出的 URL,然后选择“复制链接”。接下来,连接到您的 Spark 并选择 OpenClaw 条目。当您的 Web 浏览器打开 OpenClaw 标签页时,将 URL 粘贴到导航栏中,然后按 Enter 键。
在这个页面中,您现在可以在 OpenShell 所提供的受保护运行环境内,与自己的 OpenClaw 智能体进行对话。
第 10 步 - 在沙盒中进行推理
连接到沙盒(终端)
现在 OpenClaw 已在 OpenShell 受保护的运行时环境中配置完成,您可以通过以下方式直接连接到沙盒环境:
openshell sandbox connect dgx-demo
将 Ollama 模型加载到沙盒终端后,您可以使用以下命令测试与 Ollama 模型的连接:
curl https://inference.local/v1/responses \
-H "Content-Type: application/json" \
-d '{
"instructions": "You are a helpful assistant.",
"input": "Hello!"
}'第 11 步 - 验证沙盒隔离
打开第二个终端,检查沙盒状态和实时日志:
source ~/openshell-env/bin/activate openshell term
终端 Dashboard 显示:
沙盒状态 — name, phase, image, providers 和 port forwards
实时日志流 — 出站连接、决策(允许,否定,检查推理),以及推理拦截
验证 OpenClaw 智能体是否对于模型请求可以访问 inference.local ,未经授权的操作将被禁止。
提示:
按 f 观看实时输出,s 按来源筛选,以及 q 退出终端 Dashboard 。
第 12 步 - 重新连接到沙盒
如果您退出了沙盒会话,可以随时重新连接:
openshell sandbox connect
导入或导出文件(替换 为您创建输出的沙盒名称或从 openshell sandbox list 中得到的沙盒名称):
openshell sandbox upload <sandbox-name> ./local-file /sandbox/destination openshell sandbox download <sandbox-name> /sandbox/file ./local-destination
第 13 步 - 清理
停止并移除沙盒:
openshell sandbox delete <sandbox-name>
停止网关(保留状态以供后续使用):
openshell gateway stop
注意:
以下命令将永久删除网关集群及其所有数据。
openshell gateway destroy
同时移除 Ollama 模型:
ollama rm qwen3.5:35b-a3b
第 14 步 - 后续步骤
添加更多提供商:将 GitHub Tokens 、GitLab Tokens 或 Cloud API keys 作为提供程序附加: openshell provider create 。当创建沙盒时,请使用参数 --provider (例如: --provider my-github )安全地将这些凭证注入沙盒。
尝试其他社区沙盒:运行 openshell sandbox create --from base 或者 ——from sdg 适用于其他预构建环境。
连接 VS Code :使用 openshell sandbox ssh-config 并将输出附加到 ~/.ssh/config 可以将 VS Code Remote-SSH 直接连接到沙盒。
监控和审计: 使用 openshell logs --tail 或者 openshell term 持续监控智能体活动和政策决策。
错误 | 原因 | 修复 |
|---|---|---|
openshell gateway start fails with "connection refused" or Docker errors | Docker 未运行 | 使用以下命令启动 Dockersudo systemctl start docker,或者启动 Docker Desktop,然后重试 openshell gateway start |
openshell status shows gateway as unhealthy | 网关容器崩溃或初始化失败 | 运行 openshell gateway destroy 并 openshell gateway start 重新创建。使用 docker ps -a 和 docker logs 查看详情 |
openshell sandbox create --from openclaw fails to build | 网络问题导致无法拉取社区沙箱或 Dockerfile 构建失败 | 检查网络连接。重试命令。如果构建在特定软件包上失败,请检查基础镜像是否与您的 Docker 版本兼容。 |
Sandbox is in Error phase after creation | 策略验证失败或容器启动崩溃。 | 运行 openshell logs 查看错误详情。常见原因:无效的策略 YAML 文件、缺少提供程序凭据或端口冲突。 |
Agent cannot reach inference.local inside the sandbox | 推理路由未配置或 provider 不可达 | 运行 openshell inference get 验证提供者和模型是否已设置。测试 Ollama 可从主机访问:curl http://localhost:11434/api/tags 。确保 provider URL 使用host.docker.internal 而不是 localhost |
503 verification failed or timeout when gateway/sandbox accesses Ollama on the host | Ollama 只能连接到 localhost,或者host防火墙阻止了端口 11434 | 让 Ollama 监听所有端口,以便网关容器(例如,位于 Docker 网络 172.17.x.x 上的容器)可以访问它:OLLAMA_HOST=0.0.0.0 ollama serve & 。 允许端口 11434 通过主机防火墙:sudo ufw allow 11434/tcp comment 'Ollama for OpenShell Gateway' (进一步如有需要: sudo ufw reload)。 |
Agent's outbound connections are all denied | 默认策略不包含所需的端点。 | 使用 openshell logs --tail --source sandbox 监控被拒绝的请求. 使用 openshell policy get --full 拉取当前策略。 在network_policies 中添加所需的主机和端口,并用 openshell policy set --policy --wait 推送更新后的策略。 |
"Permission denied" or Landlock errors inside the sandbox | 智能体尝试访问未包含在 read_only 或 read_write 文件系统策略中的路径 | 拉取当前策略,将对应路径加入 read_write(如果只需要读权限,也可加入 read_only),然后推送更新后的策略。注意:文件系统策略是静态的,修改后通常需要重建沙盒。 |
Ollama OOM or very slow inference | 模型过大超出GPU内存范围,或GPU资源竞争。 | 释放 GPU 内存(关闭其他 GPU 工作负载),尝试使用小尺寸模型(例如,gpt-oss:20b),或缩短上下文长度。使用 nvidia-smi 监控。 |
openshell sandbox connect hangs or times out | 沙盒不在 Ready 阶段 | 运行 openshell sandbox get 检查状态。如果卡在 Provisioning, 等待或检查日志。如果在 Error, 删除并重新创建沙盒 |
Policy push returns exit code 1 (validation failed) | YAML 格式错误或策略字段无效 | 检查 YAML 语法。常见问题:路径未以 / 开头,路径包含 .. 跳转,将 root 作为 run_as_user, 或者 endpoint 缺少必要的端点 host/port 字段。修复后重新推送 |
openshell gateway start fails with "K8s namespace not ready" / timed out waiting for namespace | Docker 容器内的 k3s 集群启动时间超过了 CLI 超时时间。内部组件(TLS 密钥、Helm Chart、命名空间创建)可能需要额外时间,尤其在首次运行需要在容器内拉取镜像时。 | 首先检查容器是否仍在运行并正常进行:docker ps --filter name=openshell(查看 health: starting)。检查容器内的 k3s 状态:docker exec sh -c "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl get ns" 和 kubectl get pods -A。如果Pod处于 ContainerCreating ,且缺少TLS密钥(navigator-server-tls, openshell-server-tls),说明集群仍在启动中——等待几分钟后再执行 openshell status。如果仍然无法恢复,则使用 openshell gateway destroy 销毁(如有需要,使用 docker rm -f ),并重试 openshell gateway start 确保 Docker 有足够的资源(内存和磁盘)供 k3s 集群使用。 |
openshell status says "No gateway configured" even though the Docker container is running | 容器可能仍然完好——请使用docker ps --filter name=openshell 确认。如果容器正在运行且状态良好,请尝试 openshell gateway start 再次运行(它应该能检测到现有容器)。如果容器不正常或卡住,请使用以下命令将其删除:ocker rm -f ,再执行 openshell gateway destroy ,最后 openshell gateway start。 |
注意:
DGX Spark 使用统一内存架构 (UMA),支持 GPU 和 CPU 之间的动态内存共享。由于许多应用程序仍在更新以利用 UMA,即使在 DGX Spark 的内存容量范围内,您也可能会遇到内存问题。如果发生这种情况,请手动刷新缓冲区缓存:
sudo sh -c 'sync; echo 3 > /proc/sys/vm/drop_caches'
有关最新已知问题,请查看 DGX Spark 用户指南。