挂载 AgenticFS Volume

更新时间:
复制 MD 格式

创建 Sandbox 时,可通过volume_mounts将已有 AgenticFS Volume 挂载到指定目录。

功能介绍

挂载后,Sandbox 可以通过文件路径访问 AgenticFS,数据不随 Sandbox 释放而删除。

如需向运行中的 Sandbox 追加挂载,请参见追加挂载 Volume。

适用范围

  • 已为目标 Team 创建 AgenticFS Volume,并获取 Volume 名称。

  • 已准备绑定同一 Team 的智能体沙箱 API Key。Volume 和 API Key 不能跨 Team 使用。具体操作,请参见创建 API Key。

  • 已准备与 AgenticFS Access Point 网络连通的 VPC(Virtual Private Cloud,专有网络)、交换机和安全组。

  • 已准备 RAM(Resource Access Management,访问控制)角色。该角色具备 AgenticFS 挂载和读写权限,且信任策略允许函数计算服务扮演。具体操作,请参见配置 RAM 角色。

  • 已准备智能体沙箱 API URL、Domain 和可用模板。

注意:创建 Sandbox 前,必须确保对应的 AgenticFS Access Point 处于 active 状态,否则 createSandbox 调用可能超时或失败。可登录AgenticFS 控制台,找到对应的文件系统,进入详情页面,然后单击挂载使用查看 Access Point 状态。

创建 Sandbox 时使用的 VPC 配置必须包含 vpcId、securityGroupId 和非空的 vSwitchIds,且能够访问目标存储。模板中的 VPC 配置不能替代该挂载配置。

使用第二代运行时(MicroVM,微型虚拟机)自定义模板时,推荐在创建模板时设置 buildConfig.installStorageClients,由 Template Build 自动安装挂载所需的 AgenticFS 客户端。具体操作,请参见本文步骤一:在创建模板时预装存储客户端。

操作步骤

步骤一:在创建模板时预装存储客户端

本步骤仅适用于使用第二代运行时(MicroVM)自定义模板的场景。已有符合要求的模板时,跳过本步骤,直接进入步骤二:安装 SDK。

使用第二代运行时(MicroVM)创建自定义模板时,可通过 buildConfig.installStorageClients 自动安装持久化存储客户端。该参数仅支持第二代运行时,请在 runtimeConfig.sandboxConfig 中设置 generation: 2。

请求体示例和完整的限制条件,请参见使用代码构建和管理自定义模板中的“安装存储客户端”章节。

启用后,Template Build 会在模板镜像中预装本文所需的 aliyun-alinas-utils(mount.alinas)、nfs-common 及运行所需依赖。该参数不会创建存储资源、执行挂载或配置网络和访问凭证。创建 Sandbox 时,仍需按本文配置挂载参数、网络和访问凭证,并通过实际读写验证挂载可用。

步骤二:安装 SDK

本文使用 E2B Python SDK 演示。volume_mounts 需要 E2B Python SDK 2.31.0 版本。

python3 -m venv .venv
source .venv/bin/activate
pip install "e2b==2.31.0"

步骤三:挂载并验证

环境变量说明

环境变量

用途

取值来源或填写方式

E2B_API_KEY

访问智能体沙箱的 API Key。

从智能体沙箱控制台获取,必须绑定 Volume 所属的 Team。

E2B_API_URL

E2B API 请求地址。

填写 https://api.<REGION>.sandbox.aliyuncs.com,地域与目标 Volume 一致。

E2B_DOMAIN

SDK 使用的服务域名。

填写 <REGION>.sandbox.aliyuncs.com,与 API 地址使用同一地域,不带协议前缀。

E2B_TEMPLATE

创建 Sandbox 使用的模板。

填写满足本文适用范围要求的可用模板 ID 或别名;可从智能体沙箱控制台获取。

AGENTICFS_VOLUME_NAME

要挂载的 AgenticFS Volume 名称。

使用创建 AgenticFS Volume中设置的名称,或从 Volume 列表查询;不使用 Volume ID。

挂载示例

在终端中设置以下参数,将占位符和示例值替换为实际值。各变量的取值参见本文环境变量说明。

export E2B_API_KEY="<YOUR-E2B-API-KEY>"
export E2B_API_URL="https://api.<REGION>.sandbox.aliyuncs.com"
export E2B_DOMAIN="<REGION>.sandbox.aliyuncs.com"
export E2B_TEMPLATE="code-interpreter-v1"

export AGENTICFS_VOLUME_NAME="agent-workspace"

本地挂载目录位于 Sandbox 内,对应 volume_mounts 的键。建议使用 /home、/mnt、/tmp 或 /data 的子目录,本文使用 /mnt/agenticfs。

以下示例复用 Volume 的 mountConfig.role 和 mountConfig.vpcConfig,将 AgenticFS Volume 挂载到 /mnt/agenticfs。请确保 Volume 已保存 RAM 角色和完整的 VPC 配置。角色选择规则参见配置 RAM 角色。

示例会在挂载目录中创建带随机标识的独立测试文件,写入并读取校验后删除该文件,再释放本次创建的 Sandbox。请使用具备读写权限的挂载配置。

将以下代码保存为 02_mount_agenticfs_volume.py:

import os
from uuid import uuid4

from e2b import Sandbox


def require_env(name: str) -> str:
    value = os.environ.get(name, "").strip()
    if not value:
        raise RuntimeError(f"缺少环境变量: {name}")
    return value


mount_dir = "/mnt/agenticfs"
marker_path = f"{mount_dir}/hello-agenticfs-{uuid4().hex}.txt"
sandbox = None
marker_written = False

try:
    sandbox = Sandbox.create(
        template=require_env("E2B_TEMPLATE"),
        timeout=300,
        api_key=require_env("E2B_API_KEY"),
        api_url=require_env("E2B_API_URL"),
        domain=require_env("E2B_DOMAIN"),
        volume_mounts={mount_dir: require_env("AGENTICFS_VOLUME_NAME")},
    )

    info = sandbox.get_info()
    print(f"volume_mounts={info.volume_mounts}")

    sandbox.files.write(marker_path, "hello agenticfs\n")
    marker_written = True
    content = sandbox.files.read(marker_path)
    if content != "hello agenticfs\n":
        raise RuntimeError(f"文件内容不一致: {content!r}")
finally:
    try:
        if sandbox is not None and marker_written:
            sandbox.files.remove(marker_path)
    finally:
        if sandbox is not None:
            sandbox.kill()

print("AgenticFS Volume 挂载读写验证成功")

运行示例:

python 02_mount_agenticfs_volume.py

输出 AgenticFS Volume 挂载读写验证成功 表示本次读写、测试文件清理和 Sandbox 释放已完成。

行为说明

  • volume_mounts 使用 {挂载目录: Volume 名称} 格式,不使用 Volume ID。

  • Sandbox 暂停后再恢复时会恢复 Volume 挂载。

  • 释放 Sandbox 不会删除 AgenticFS 中的数据。测试文件由示例主动删除,其他数据的保留和清理需单独处理。

  • 本文复用 Volume 的 mountConfig.vpcConfig。需要覆盖时,可在创建 Sandbox 的 metadata 中通过 fc.sandbox.network.vpc 提供完整 VPC 配置;两处均配置时,以 metadata 为准。

使用限制

  • 同一 Sandbox 中最多支持 5 个 AgenticFS 挂载点。数量包含创建时和后续追加的挂载,也包含直接提供存储配置的挂载。

  • 挂载目录必须是规范化的绝对 Unix 路径,不能为 /,不能包含前后空格、重复分隔符、. 或 .. 路径段。

  • 挂载目录不能使用 /bin、/opt、/var、/dev 等系统目录及其子目录,也不能包含 .cache 等以 . 开头的隐藏目录。

  • 如需通过隐藏目录访问挂载内容,可先挂载到符合要求的目录,再使用 ln -s 创建指向该挂载目录的符号链接。

  • 同一 Sandbox 中的挂载目录不能重复。

  • 挂载目录最大长度为 128 个字符。

  • 创建 Sandbox 时,多个 AgenticFS Volume 的 userID 和 groupID 配置必须一致。追加挂载时,新增挂载的 UID(User ID,用户 ID)/GID(Group ID,用户组 ID)不得与当前 Sandbox 已有配置冲突。

常见问题

提示找不到 Volume

错误消息为 volume not found 时,核对请求中的 Volume 名称、API Key 所属 Team 和 API 地址的地域。按名称挂载需使用同一 Team 中已有的 Volume,不能填写 Volume ID。

Volume 已存在,为什么仍提示不可用

错误消息包含 is not available 时,表示 Volume 存在,但状态尚不满足挂载要求。通过 GetVolume 查询其状态和状态原因,确认处于可用状态后再挂载;存在失败原因时,应先处理该原因。重复提交挂载请求不会使 Volume 变为可用。

创建 Sandbox 提示缺少 RAM 角色

错误消息包含 AgenticFS mount requires Function role 时,表示本次创建未获得挂载所需的 RAM 角色。

本文示例从 Volume 的 mountConfig.role 获取角色;如果创建请求的 metadata 显式设置了 fc.sandbox.auth.role,则以该值为准。核对实际使用的角色配置,补齐有效的角色 ARN(Alibaba Cloud Resource Name,资源名称)后重新提交创建请求。角色配置方法参见配置 RAM 角色。

已配置 VPC,为什么仍提示配置不完整

错误消息包含 mount requires complete VPC config 时,表示本次创建使用的 VPC 配置缺少必填项。

未在 metadata 中指定 VPC 时,检查 Volume 的 mountConfig.vpcConfig;已指定时,检查 fc.sandbox.network.vpc。实际使用的配置必须包含 vpcId、securityGroupId 和非空的 vSwitchIds。metadata 配置优先,不会用 Volume 的字段补齐不完整的 metadata。

Sandbox 创建超时或挂载失败

如果错误消息未指出具体参数问题,可按以下顺序排查实际挂载条件:

  1. 确认 Access Point 处于 active 状态,地址和远端目录填写正确。

  2. 检查 Sandbox 所用 VPC 的路由、安全组及与 Access Point 的连通性。

  3. 检查实际使用的 RAM 角色,确认信任策略允许函数计算服务扮演,且具备目标存储所需的访问权限。

  4. 使用第二代运行时自定义模板时,按本文步骤一:在创建模板时预装存储客户端确认已安装 AgenticFS 客户端。

Volume 已挂载,但文件读写失败

先确认应用访问的是本次指定的本地挂载目录,再根据文件操作的错误检查目录权限、UID/GID 和实际使用的 RAM 角色是否具备相应的读写权限。Access Point 的访问状态也需正常。

如需进一步排查,请保留完整错误信息和请求 ID。