Swift

Swift

Swift 指的是 OpenStack 对象存储。其商业实现包括:

路径指定为 remote:container(对于 lsd 命令,可使用 remote:)。你也可以指定子目录,例如 remote:container/path/to/dir

配置

以下是一个配置 Swift 存储的示例。首先运行:

rclone config

这将引导你完成一个交互式的设置过程。

No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> remote
Type of storage to configure.
Choose a number from below, or type in your own value
[snip]
XX / OpenStack Swift (Rackspace Cloud Files, Blomp Cloud Storage, Memset Memstore, OVH)
   \ "swift"
[snip]
Storage> swift
Get swift credentials from environment variables in standard OpenStack form.
Choose a number from below, or type in your own value
 1 / Enter swift credentials in the next step
   \ "false"
 2 / Get swift credentials from environment vars. Leave other fields blank if using this.
   \ "true"
env_auth> true
User name to log in (OS_USERNAME).
user> 
API key or password (OS_PASSWORD).
key> 
Authentication URL for server (OS_AUTH_URL).
Choose a number from below, or type in your own value
 1 / Rackspace US
   \ "https://auth.api.rackspacecloud.com/v1.0"
 2 / Rackspace UK
   \ "https://lon.auth.api.rackspacecloud.com/v1.0"
 3 / Rackspace v2
   \ "https://identity.api.rackspacecloud.com/v2.0"
 4 / Memset Memstore UK
   \ "https://auth.storage.memset.com/v1.0"
 5 / Memset Memstore UK v2
   \ "https://auth.storage.memset.com/v2.0"
 6 / OVH
   \ "https://auth.cloud.ovh.net/v3"
 7  / Blomp Cloud Storage
   \ "https://authenticate.ain.net"
auth> 
User ID to log in - optional - most swift systems use user and leave this blank (v3 auth) (OS_USER_ID).
user_id> 
User domain - optional (v3 auth) (OS_USER_DOMAIN_NAME)
domain> 
Tenant name - optional for v1 auth, this or tenant_id required otherwise (OS_TENANT_NAME or OS_PROJECT_NAME)
tenant> 
Tenant ID - optional for v1 auth, this or tenant required otherwise (OS_TENANT_ID)
tenant_id> 
Tenant domain - optional (v3 auth) (OS_PROJECT_DOMAIN_NAME)
tenant_domain> 
Region name - optional (OS_REGION_NAME)
region> 
Storage URL - optional (OS_STORAGE_URL)
storage_url> 
Auth Token from alternate authentication - optional (OS_AUTH_TOKEN)
auth_token> 
AuthVersion - optional - set to (1,2,3) if your auth URL has no version (ST_AUTH_VERSION)
auth_version> 
Endpoint type to choose from the service catalogue (OS_ENDPOINT_TYPE)
Choose a number from below, or type in your own value
 1 / Public (default, choose this if not sure)
   \ "public"
 2 / Internal (use internal service net)
   \ "internal"
 3 / Admin
   \ "admin"
endpoint_type> 
Remote config
--------------------
[test]
env_auth = true
user = 
key = 
auth = 
user_id = 
domain = 
tenant = 
tenant_id = 
tenant_domain = 
region = 
storage_url = 
auth_token = 
auth_version = 
endpoint_type = 
--------------------
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y

这个远程存储名为 remote,现在可以按以下方式使用它:

查看所有容器

rclone lsd remote:

创建一个新容器

rclone mkdir remote:container

列出容器的内容

rclone ls remote:container

/home/local/directory 同步到远程容器,并删除容器中多余的文件。

rclone sync --interactive /home/local/directory remote:container

从 OpenStack 凭证文件进行配置

OpenStack 凭证文件通常看起来像这样(不包含注释)

export OS_AUTH_URL=https://a.provider.net/v2.0
export OS_TENANT_ID=ffffffffffffffffffffffffffffffff
export OS_TENANT_NAME="1234567890123456"
export OS_USERNAME="123abc567xy"
echo "Please enter your OpenStack Password: "
read -sr OS_PASSWORD_INPUT
export OS_PASSWORD=$OS_PASSWORD_INPUT
export OS_REGION_NAME="SBG1"
if [ -z "$OS_REGION_NAME" ]; then unset OS_REGION_NAME; fi

配置文件需要类似下面这样,其中 $OS_USERNAME 表示 OS_USERNAME 变量的值 —— 在上面的示例中为 123abc567xy。.

[remote]
type = swift
user = $OS_USERNAME
key = $OS_PASSWORD
auth = $OS_AUTH_URL
tenant = $OS_TENANT_NAME

请注意,你可能需要(也可能不需要)设置 region 参数 —— 可以先不设置进行尝试。

从环境变量进行配置

如果你愿意,可以使用一组标准的 OpenStack 环境变量来配置 rclone 使用 Swift 存储。

在运行配置过程时,请确保为 env_auth 选择 true,并将其他所有字段留空。

然后,rclone 将使用标准的 OpenStack 环境变量从环境中设置任何空的配置参数。在 Swift 库的文档中有 这些变量的列表

使用替代认证方法

如果你的 OpenStack 安装使用了一种非标准的认证方法,而 rclone 或底层的 Swift 库可能尚未支持该方法,你可以通过外部方式进行认证(例如,手动调用 openstack 命令来获取令牌)。然后,你只需传递两个配置变量 auth_tokenstorage_url。 如果这两个变量都已提供,其他变量将被忽略。rclone 将不会尝试进行认证,而是假设已经完成认证,并使用这两个变量来访问 OpenStack 安装。

不使用配置文件使用 rclone

如果需要,你可以在不使用配置文件的情况下使用 rclone 与 Swift 存储交互,示例如下:

source openstack-credentials-file
export RCLONE_CONFIG_MYREMOTE_TYPE=swift
export RCLONE_CONFIG_MYREMOTE_ENV_AUTH=true
rclone lsd myremote:

–fast-list

此远程存储支持 --fast-list,该选项允许你以消耗更多内存为代价,减少操作所需的事务数量。更多详细信息,请参阅 rclone 文档

–update 和 –use-server-modtime

如下所述,修改时间以元数据的形式存储在对象上。在所有需要检查文件最后更新时间的操作中,默认会使用这个修改时间。这使得 rclone 可以将远程存储更像一个真正的文件系统来处理,但效率较低,因为它需要额外的 API 调用来获取元数据。

对于许多操作而言,对象最后一次上传到远程存储的时间足以判断它是否为“脏数据”。通过同时使用 --update--use-server-modtime,你可以避免额外的 API 调用,只上传本地修改时间比最后上传时间更新的文件。

修改时间和哈希值

修改时间以 X-Object-Meta-Mtime 元数据的形式存储在对象上,以自纪元以来的浮点时间表示,精确到 1 纳秒。

这是一种事实上的标准(例如在官方的 python-swiftclient 中就有使用),用于存储对象的修改时间。

支持 MD5 哈希算法。

受限文件名字符

字符 编码值 替换字符
NUL 0x00
/ 0x2F

无效的 UTF-8 字节也会被 替换,因为它们不能用于 JSON 字符串。

标准选项

以下是 Swift(OpenStack Swift,如 Rackspace 云存储、Blomp 云存储、Memset 存储服务、OVH 对象存储等)特定的标准选项。

–swift-env-auth

以标准 OpenStack 格式从环境变量中获取 Swift 凭证。

属性:

  • 配置项:env_auth
  • 环境变量:RCLONE_SWIFT_ENV_AUTH
  • 类型:布尔值
  • 默认值:false
  • 示例:
    • “false”
      • 在下一个步骤中输入 Swift 凭证。
    • “true”
      • 从环境变量中获取 Swift 凭证。
      • 如果使用此选项,请将其他字段留空。

–swift-user

用于登录的用户名(OS_USERNAME)。

属性:

  • 配置项:user
  • 环境变量:RCLONE_SWIFT_USER
  • 类型:字符串
  • 是否必需:否

–swift-key

API 密钥或密码(OS_PASSWORD)。

属性:

  • 配置项:key
  • 环境变量:RCLONE_SWIFT_KEY
  • 类型:字符串
  • 是否必需:否

–swift-auth

服务器的认证 URL(OS_AUTH_URL)。

属性:

–swift-user-id

用于登录的用户 ID - 可选 - 大多数 Swift 系统使用用户名并将此选项留空(v3 认证)(OS_USER_ID)。

属性:

  • 配置项:user_id
  • 环境变量:RCLONE_SWIFT_USER_ID
  • 类型:字符串
  • 是否必需:否

–swift-domain

用户域 - 可选(v3 认证)(OS_USER_DOMAIN_NAME)

属性:

  • 配置项:domain
  • 环境变量:RCLONE_SWIFT_DOMAIN
  • 类型:字符串
  • 是否必需:否

–swift-tenant

租户名称 - 对于 v1 认证可选,否则需要此选项或 tenant_id(OS_TENANT_NAME 或 OS_PROJECT_NAME)。

属性:

  • 配置项:tenant
  • 环境变量:RCLONE_SWIFT_TENANT
  • 类型:字符串
  • 是否必需:否

–swift-tenant-id

租户 ID - 对于 v1 认证可选,否则需要此选项或 tenant(OS_TENANT_ID)。

属性:

  • 配置项:tenant_id
  • 环境变量:RCLONE_SWIFT_TENANT_ID
  • 类型:字符串
  • 是否必需:否

–swift-tenant-domain

租户域 - 可选(v3 认证)(OS_PROJECT_DOMAIN_NAME)。

属性:

  • 配置项:tenant_domain
  • 环境变量:RCLONE_SWIFT_TENANT_DOMAIN
  • 类型:字符串
  • 是否必需:否

–swift-region

区域名称 - 可选(OS_REGION_NAME)。

属性:

  • 配置项:region
  • 环境变量:RCLONE_SWIFT_REGION
  • 类型:字符串
  • 是否必需:否

–swift-storage-url

存储 URL - 可选(OS_STORAGE_URL)。

属性:

  • 配置项:storage_url
  • 环境变量:RCLONE_SWIFT_STORAGE_URL
  • 类型:字符串
  • 是否必需:否

–swift-auth-token

来自替代认证方式的认证令牌 - 可选(OS_AUTH_TOKEN)。

属性:

  • 配置项:auth_token
  • 环境变量:RCLONE_SWIFT_AUTH_TOKEN
  • 类型:字符串
  • 是否必需:否

–swift-application-credential-id

应用程序凭证 ID(OS_APPLICATION_CREDENTIAL_ID)。

属性:

  • 配置项:application_credential_id
  • 环境变量:RCLONE_SWIFT_APPLICATION_CREDENTIAL_ID
  • 类型:字符串
  • 是否必需:否

–swift-application-credential-name

应用程序凭证名称(OS_APPLICATION_CREDENTIAL_NAME)。

属性:

  • 配置项:application_credential_name
  • 环境变量:RCLONE_SWIFT_APPLICATION_CREDENTIAL_NAME
  • 类型:字符串
  • 是否必需:否

–swift-application-credential-secret

应用程序凭证密钥(OS_APPLICATION_CREDENTIAL_SECRET)。

属性:

  • 配置项:application_credential_secret
  • 环境变量:RCLONE_SWIFT_APPLICATION_CREDENTIAL_SECRET
  • 类型:字符串
  • 是否必需:否

–swift-auth-version

认证版本 - 可选 - 如果你的认证 URL 没有版本信息,请设置为 (1,2,3)(ST_AUTH_VERSION)。

属性:

  • 配置项:auth_version
  • 环境变量:RCLONE_SWIFT_AUTH_VERSION
  • 类型:整数
  • 默认值:0

–swift-endpoint-type

从服务目录中选择的端点类型(OS_ENDPOINT_TYPE)。

属性:

  • 配置项:endpoint_type
  • 环境变量:RCLONE_SWIFT_ENDPOINT_TYPE
  • 类型:字符串
  • 默认值:“public”
  • 示例:
    • “public”
      • 公共(默认值,如果不确定请选择此项)
    • “internal”
      • 内部(使用内部服务网络)
    • “admin”
      • 管理

–swift-storage-policy

创建新容器时使用的存储策略。

在创建新容器时应用指定的存储策略。该策略之后无法更改。允许的配置值及其含义取决于你的 Swift 存储提供商。

属性:

  • 配置项:storage_policy
  • 环境变量:RCLONE_SWIFT_STORAGE_POLICY
  • 类型:字符串
  • 是否必需:否
  • 示例:
    • "”
      • 默认
    • “pcs”
      • OVH 公共云存储
    • “pca”
      • OVH 公共云存档

高级选项

以下是 Swift(OpenStack Swift,如 Rackspace 云存储、Blomp 云存储、Memset 存储服务、OVH 对象存储等)特定的高级选项。

–swift-leave-parts-on-error

如果设置为 true,则在上传失败时避免调用中止上传操作。

若要在不同会话间恢复上传,应将此选项设置为 true。

属性:

  • 配置项:leave_parts_on_error
  • 环境变量:RCLONE_SWIFT_LEAVE_PARTS_ON_ERROR
  • 类型:布尔值
  • 默认值:false

–swift-fetch-until-empty-page

在分页时,除非收到空页面,否则始终继续获取数据。

如果 rclone 列出的对象数量少于预期,或者重复同步时复制了未更改的对象,可以考虑使用此选项。

启用此选项是安全的,但 rclone 可能会进行比必要更多的 API 调用。

这是处理未按预期实现分页的 Swift API 实现的一对解决方法之一。另请参阅 “partial_page_fetch_threshold”。

属性:

  • 配置项:fetch_until_empty_page
  • 环境变量:RCLONE_SWIFT_FETCH_UNTIL_EMPTY_PAGE
  • 类型:布尔值
  • 默认值:false

–swift-partial-page-fetch-threshold

在分页时,如果当前页面的数量达到限制的此百分比,则继续获取数据。

如果 rclone 列出的对象数量少于预期,或者重复同步时复制了未更改的对象,可以考虑使用此选项。

启用此选项是安全的,但 rclone 可能会进行比必要更多的 API 调用。

这是处理未按预期实现分页的 Swift API 实现的一对解决方法之一。另请参阅 “fetch_until_empty_page”。

属性:

  • 配置项:partial_page_fetch_threshold
  • 环境变量:RCLONE_SWIFT_PARTIAL_PAGE_FETCH_THRESHOLD
  • 类型:整数
  • 默认值:0

–swift-chunk-size

超过此大小的文件将被分块。

超过此大小的文件将被分块到 _segments 容器或 .file-segments 目录中。(有关更多信息,请参阅 use_segments_container 选项)。默认值为 5 GiB,这也是其最大值,这意味着只有超过此大小的文件才会被分块。

Rclone 以动态大对象(DLO)的形式上传分块文件。

属性:

  • 配置项:chunk_size
  • 环境变量:RCLONE_SWIFT_CHUNK_SIZE
  • 类型:SizeSuffix
  • 默认值:5Gi

–swift-no-chunk

在流式上传期间不分块文件。

在进行流式上传时(例如使用 rcatmount 并设置 --vfs-cache-mode off),设置此标志将使 Swift 后端不上传分块文件。

这将流式上传的最大文件大小限制为 5 GiB。这很有用,因为非分块文件更容易处理,并且有 MD5SUM。

在进行正常复制操作时,Rclone 仍会对大于 chunk_size 的文件进行分块。

属性:

  • 配置项:no_chunk
  • 环境变量:RCLONE_SWIFT_NO_CHUNK
  • 类型:布尔值
  • 默认值:false

–swift-no-large-objects

禁用对静态和动态大对象的支持

Swift 无法透明地存储大于 5 GiB 的文件。有两种对大文件进行分块的方案,静态大对象(SLO)或动态大对象(DLO),并且 API 不允许 rclone 在不进行对象 HEAD 请求的情况下确定文件是静态还是动态大对象。由于这些需要不同的处理方式,这意味着 rclone 在读取校验和等操作时必须对对象发出 HEAD 请求。

当设置 no_large_objects 时,rclone 将假设没有存储静态或动态大对象。这意味着它可以停止进行额外的 HEAD 调用,从而大大提高性能,特别是在使用 --checksum 进行 Swift 到 Swift 的传输时。

设置此选项意味着 no_chunk,并且不会上传分块文件,因此大于 5 GiB 的文件在上传时会失败。

如果你设置了此选项,但实际上存在静态或动态大对象,那么这些对象的哈希值将不正确。下载操作将成功,但其他操作(如删除和复制)将失败。

属性:

  • 配置项:no_large_objects
  • 环境变量:RCLONE_SWIFT_NO_LARGE_OBJECTS
  • 类型:布尔值
  • 默认值:false

–swift-use-segments-container

选择大对象分块的存储位置

Swift 无法透明地存储大于 5 GiB 的文件,rclone 会对大于 chunk_size(默认 5 GiB)的文件进行分块以进行上传。

如果此值为 true,分块将存储在一个额外的容器中,该容器的名称与目标容器相同,但附加了 _segments。这意味着原始容器中不会有重复的数据,但可能不允许使用另一个容器。

如果此值为 false,分块将存储在容器根目录下的 .file-segments 目录中。在列出容器时,此目录将被省略。一些提供商(如 Blomp)要求使用此模式,因为不允许创建额外的容器。如果希望在根目录中看到 .file-segments 目录,则必须将此标志设置为 true

如果此值未设置(默认情况),则 rclone 将选择使用的值。除非 rclone 检测到任何需要将其设置为 trueauth_url,否则将为 false。在这种情况下,你会在 DEBUG 日志中看到一条消息。

属性:

  • 配置项:use_segments_container
  • 环境变量:RCLONE_SWIFT_USE_SEGMENTS_CONTAINER
  • 类型:三态
  • 默认值:未设置

–swift-encoding

后端的编码方式。

有关更多信息,请参阅 概述中的编码部分

属性:

  • 配置项:encoding
  • 环境变量:RCLONE_SWIFT_ENCODING
  • 类型:编码
  • 默认值:斜杠,无效的 UTF-8

–swift-description

远程存储的描述。

属性:

  • 配置项:description
  • 环境变量:RCLONE_SWIFT_DESCRIPTION
  • 类型:字符串
  • 是否必需:否

限制

Swift API 不会为分段文件(动态或静态大对象)返回正确的 MD5SUM,因此 rclone 不会检查或使用这些文件的 MD5SUM。

故障排除

Rclone 提示 “Failed to create file system for "remote:": Bad Request”

由于底层 Swift 库的一个特性,当 Swift 认证失败时,它会给出一个 “Bad Request” 错误,而不是更合理的错误信息。

因此,这很可能意味着你的用户名或密码错误。你可以使用 --dump-bodies 标志进一步调查。

这也可能是由于在不应该指定区域的情况下指定了区域(例如 OVH)导致的。

Rclone 提示 “Failed to create file system: Response didn’t have storage url and auth token”

这很可能是因为在设置 Swift 远程存储时忘记指定租户。

OVH 云存档

要使用 rclone 与 OVH 云存档配合使用,首先使用 rclone config 设置一个与 OVH 相关的 swift 后端,并选择 pca 作为 storage_policy

上传对象

将对象上传到 OVH 云存档与对象存储没有区别,你只需运行你喜欢的命令(移动、复制或同步)来上传对象。上传后,对象将在 OVH 控制面板中显示为“冻结”状态。

检索对象

要检索对象,像往常一样使用 rclone copy。如果对象处于冻结状态,rclone 将请求解冻所有对象,并在输出末尾等待,显示类似以下的消息:

2019/03/23 13:06:33 NOTICE: Received retry after error - sleeping until 2019-03-23T13:16:33.481657164+01:00 (9m59.99985121s)

Rclone 将等待指定的时间,然后重试复制操作。