如何在Linux上创建基于云的加密文件系统
Amazon S3 和 Google Cloud Storage 等商业云存储服务以可承受的成本提供高度可用、可扩展、无限容量的对象存储。为了加速其云产品的广泛采用,这些提供商正在围绕其基于明确定义的 API 和 SDK 的产品培育丰富的开发人员生态系统。云支持的文件系统是这种活跃的开发人员社区的流行副产品之一,存在多种开源实现。
S3QL 是最流行的开源基于云的文件系统之一。它是一个基于 FUSE 的文件系统,由多个商业或开源云存储支持,例如 Amazon S3、Google Cloud Storage、Rackspace CloudFiles 或 OpenStack。作为一个全功能的文件系统,S3QL 拥有许多强大的功能,例如无限容量、高达 2TB 的文件大小、压缩、UNIX 属性、加密、写时复制快照、不可变树、重复数据删除、硬链接/符号链接支持等。写入 S3QL 文件系统的任何字节在传输到云后端之前都会在本地压缩/加密。当您尝试读取存储在 S3QL 文件系统中的内容时,将从云端下载相应的对象(如果不在本地缓存中),并即时解密/解压缩。
需要明确的是,S3QL 确实有局限性。例如,您不能同时在多台计算机上安装相同的 S3FS 文件系统,但一次只能安装一次。此外,不提供 ACL(访问控制列表)支持。
在本教程中,我将描述如何使用 S3QL 在 Amazon S3 上设置加密文件系统。作为示例用例,我还将演示如何在已安装的 S3QL 文件系统上运行 rsync 备份工具。
准备
要使用本教程,您需要创建一个 Amazon AWS 帐户(免费注册,但需要有效的信用卡)。
如果您尚未这样做,请首先创建一个 AWS 访问密钥(访问密钥 ID 和秘密访问密钥),需要该密钥来授权 S3QL 访问您的 AWS 账户。
现在,通过AWS管理控制台转到AWS S3,并为S3QL创建一个新的空存储桶。

为了获得最佳性能,请选择地理位置距离您最近的区域。
在 Linux 上安装 S3QL
S3QL 在大多数 Linux 发行版上作为预构建包提供。
在 Debian、Ubuntu 或 Linux Mint 上:
$ sudo apt-get install s3ql
在费多拉上:
$ sudo yum install s3ql
在 Arch Linux 上:
在 Arch Linux 上,使用 AUR。
首次配置S3QL
在~/.s3ql
目录下创建authinfo2
文件,该文件是默认的S3QL配置文件。此文件包含有关所需 AWS 访问密钥、S3 存储桶名称和加密密码的信息。加密密码用于加密随机生成的主加密密钥。然后使用该主密钥来加密实际的 S3QL 文件系统数据。
$ mkdir ~/.s3ql
$ vi ~/.s3ql/authinfo2
[s3]
storage-url: s3://[bucket-name]
backend-login: [your-access-key-id]
backend-password: [your-secret-access-key]
fs-passphrase: [your-encryption-passphrase]
您指定的 AWS S3 存储桶应事先通过 AWS 管理控制台创建。
仅出于安全考虑,将 authinfo2
文件设置为可供您读取。
$ chmod 600 ~/.s3ql/authinfo2
创建 S3QL 文件系统
您现在已准备好在 AWS S3 之上创建 S3QL 文件系统。
使用mkfs.s3ql
命令创建一个新的S3QL文件系统。您通过命令提供的存储桶名称应与 authinfo2 文件中的存储桶名称匹配。 --ssl
选项强制您使用 SSL 连接到后端存储服务器。默认情况下,mkfs.s3ql
命令将在 S3QL 文件系统中启用压缩和加密。
$ mkfs.s3ql s3://[bucket-name] --ssl
系统将要求您输入加密密码。输入您在 ~/.s3ql/autoinfo2
中定义的相同密码(在 fs-passphrase
下)。
如果成功创建新文件系统,您将看到以下输出。

挂载 S3QL 文件系统
创建 S3QL 文件系统后,下一步就是安装它。
首先,创建本地挂载点,然后使用 mount.s3ql 命令挂载 S3QL 文件系统。
$ mkdir ~/mnt_s3ql
$ mount.s3ql s3://[bucket-name] ~/mnt_s3ql
您不需要特权访问即可挂载 S3QL 文件系统。只需确保您对本地安装点具有写访问权限即可。
或者,您可以通过 --compress
选项指定要使用的压缩算法(例如,lzma
、bzip2
、zlib
)。如果没有它,默认使用lzma
算法。请注意,当您指定自定义压缩算法时,它将应用于新创建的数据对象,而不是现有的数据对象。
$ mount.s3ql --compress bzip2 s3://[bucket-name] ~/mnt_s3ql
出于性能原因,S3QL 文件系统维护本地文件缓存,用于存储最近访问的(部分或完整)文件。您可以使用 --cachesize
和 --max-cache-entries
选项自定义文件缓存大小。
要允许您以外的其他用户访问已安装的 S3QL 文件系统,请使用 --allow-other
选项。
如果您想通过 NFS 将已安装的 S3QL 文件系统导出到其他计算机,请使用 --nfs
选项。
运行mount.s3ql
后,检查S3QL文件系统是否挂载成功:
$ df ~/mnt_s3ql
$ mount | grep s3ql

卸载 S3QL 文件系统
要安全卸载 S3QL 文件系统(可能包含未提交的数据),请使用 umount.s3ql 命令。它将等待,直到所有数据(包括本地文件系统缓存中的数据)已成功传输并写入后端服务器。根据写入待处理数据的量,此过程可能需要一些时间。
$ umount.s3ql ~/mnt_s3ql
查看 S3QL 文件系统统计信息并修复 S3QL 文件系统
要查看S3QL文件系统统计信息,您可以使用s3qlstat
命令,该命令显示数据/元数据总大小、重复数据删除和压缩率等信息。
$ s3qlstat ~/mnt_s3ql

您可以使用 fsck.s3ql
命令检查和修复 S3QL 文件系统。与fsck
命令类似,需要先卸载正在检查的文件系统。
$ fsck.s3ql s3://[bucket-name]
S3QL 用例:rsync
备份
让我以 S3QL 的一个流行用例来结束本教程:本地文件系统备份。为此,我建议使用 rsync 增量备份工具,特别是因为 S3QL 附带了 rsync 包装脚本 (/usr/lib/s3ql/pcp.py
)。此脚本允许您使用多个 rsync 进程将源树递归复制到 S3QL 目标。
$ /usr/lib/s3ql/pcp.py -h

以下命令将通过四个并发 rsync
连接将 ~/Documents
中的所有内容备份到 S3QL 文件系统。
$ /usr/lib/s3ql/pcp.py -a --quiet --processes=4 ~/Documents ~/mnt_s3ql
文件将首先复制到本地文件缓存,然后在后台随着时间的推移逐渐刷新到后端服务器。
有关 S3QL 的更多信息,例如自动挂载、快照、不可变树,我强烈建议您查看官方用户指南。让我知道您对 S3QL 的看法。分享您使用任何其他工具的经验。