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_token
和 storage_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 凭证。
- 如果使用此选项,请将其他字段留空。
- “false”
–swift-user
用于登录的用户名(OS_USERNAME)。
属性:
- 配置项:user
- 环境变量:RCLONE_SWIFT_USER
- 类型:字符串
- 是否必需:否
–swift-key
API 密钥或密码(OS_PASSWORD)。
属性:
- 配置项:key
- 环境变量:RCLONE_SWIFT_KEY
- 类型:字符串
- 是否必需:否
–swift-auth
服务器的认证 URL(OS_AUTH_URL)。
属性:
- 配置项:auth
- 环境变量:RCLONE_SWIFT_AUTH
- 类型:字符串
- 是否必需:否
- 示例:
- “https://auth.api.rackspacecloud.com/v1.0"
- Rackspace 美国
- “https://lon.auth.api.rackspacecloud.com/v1.0"
- Rackspace 英国
- “https://identity.api.rackspacecloud.com/v2.0"
- Rackspace v2
- “https://auth.storage.memset.com/v1.0"
- Memset 英国存储服务
- “https://auth.storage.memset.com/v2.0"
- Memset 英国存储服务 v2
- “https://auth.cloud.ovh.net/v3"
- OVH
- “https://authenticate.ain.net”
- Blomp 云存储
- “https://auth.api.rackspacecloud.com/v1.0"
–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”
- 管理
- “public”
–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
在流式上传期间不分块文件。
在进行流式上传时(例如使用 rcat
或 mount
并设置 --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 检测到任何需要将其设置为 true
的 auth_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 将等待指定的时间,然后重试复制操作。