阿里云OSS深度冷归档功能目前已经完全开放使用,有这个低成本方案我的异地备份大计终于能得以完成。但因为TrueNAS系统原生并不支持国内的云提供商,需要做出一些调整才完成这个数据加密上云的动作。

让 TrueNAS 支持 Aliyun OSS

我们知道 TrueNAS 的云同步任务实际是使用内置的 Rclone 工具完成,而 Rclone 本身是支持 Aliyun OSS 使用方式的,所以目标就是找到一个使用 OSS 方式调用 Rclone 的方法;通常的做法是使用定时任务来执行自定义脚本完成调用,但在作者Reficul的文章中找到了注入参数的方式,形式上更为优雅;这种方式需要修改内置的Python脚本,如果你对终端使用或Python的基础语法不大了解,那会存在一定的风险,推荐进行一定的知识补充再进行以下的操作。并且请记住在系统更新后会覆盖被修改过的脚本,需要重新执行以下操作。

查询指定脚本位置

在写这篇文章时我的系统版本是 TrueNAS SCALE 25.04,如果与我相同可以跳过本步骤直接修改相同文件,如果不同则使用 find 命令搜索目标脚本 cloud_sync.py ,在搜索到的文件中找出目标文件。

admin@truenas[~]$ sudo find / -name "cloud_sync.py"
/usr/lib/python3/dist-packages/middlewared/api/v25_04_1/cloud_sync.py
/usr/lib/python3/dist-packages/middlewared/plugins/cloud_sync.py
/usr/lib/python3/dist-packages/ixdiagnose/plugins/cloud_sync.py

参考下图,在 /usr/lib/python3/dist-packages/middlewared/plugins/cloud_sync.py 文件的大概100行位置找到可以注入参数的目标方法 __aenter__,以此确定要修改的文件。

truenas_cloudsync1.png

解除系统只读保护

定位到需要修改的目标脚本后,发现其存在于系统的只读区域 /usr 目录下,因此需要先解除只读保护后再编辑文件,以下提供两种方式

  1. 启用官方提供的开发者模式

在系统的终端内执行:sudo install-dev-tools
这种方式会解除 /usr 的只读挂载,并安装常用开发工具如 apt、make、python3-pip 等。

  1. 命令方式

在系统的终端内执行:sudo /usr/local/libexec/disable-rootfs-protection
直接将根文件系统切换为可写,并在内部设置更改标记;这种方式更为便捷,我在实际操作时间选择了它。

修改任务脚本支持 OSS

解除只读挂载后编辑脚本 sudo vim /usr/lib/python3/dist-packages/middlewared/plugins/cloud_sync.py,在下图位置添加注入参数的代码,注意Py需要严格保持缩进以判断代码块。

if "aliyuncs.com" in config.get("endpoint", ""):
    logger.warning(f"set provider for {config['endpoint']} as Alibaba")
    config["provider"] = "Alibaba"

truenas_cloudsync2.png

修改保存之后,执行 sudo service middlewared restart 重启 Web 服务,修改操作至此完成。

配置 TrueNAS 云同步任务

接下来的任务就比较简单了,使用类似亚马逊 S3 的方式来配置一个数据的云同步任务就好。

云上操作

  1. 登录阿里云,根据需求创建一个存储桶,仅作为备份平时没有读取需求这里推荐使用 [深度冷存档] 类型可以大幅降低存储成本。
  2. 创建一个 AccessKey 后续用于给 TrueNAS 系统作为操作凭证,创建的密钥妥善保管请勿泄露。

truenas_cloudsync3.png

配置凭证

在TrueNAS系统的 用户凭证 -> 备份凭据 中创建一个 Amazon S3类型的凭据。

truenas_cloudsync4.png

认证方式填写上一步中创建的 AccessKey;
端点 URL 填写存储桶对应的地域节点地址,在存储桶概述页面查看到,带上https协议头,图中以深圳为例;
区域为端点 URL 的二级域名部分,参考图片中填写;
完成后验证并保存即可。

truenas_cloudsync5.png

配置同步任务

数据保护 -> 云同步任务 中添加一个任务,选择上一步中创建的凭证,如果先前的脚本修改正确就可以正常看到自己的权限下存在的存储桶和其内部文件,按照自己的需求配置任务即可。

truenas_cloudsync6.png

一些其他注意事项:

  1. 使用 --fast-list 可以减少一些 API 调用产生的费用;
  2. 使用「深度冷存档」时保持存储类别为空,否则会上传失败;
  3. 推荐使用远程加密来保护文件,防止云上数据意外泄漏导致的风险;

总结

我上云的数据量大概在 100G 左右,首月有大量的数据上传请求费用,成本是5元;之后的每个月的存储和增量成本大概是2元,总体是非常可以接受了。自动化之后可用性也比较高,但一定注意系统更新后脚本被覆盖导致的备份失败问题,届时需再次修改脚本。

部分参考:
备份 TrueNAS 数据至阿里云 OSS 深度冷归档存储踩坑 -- Reficul