如何在FreeBSD上使用DigitalOcean块存储配置加密ZFS池

来自菜鸟教程
跳转至:导航、​搜索

ZFS 是一种文件系统和卷管理器,支持高存储容量、支持压缩并可以防止数据损坏。 ZFS 与 DigitalOcean 的 块存储 结合使用时,可提供易于设置和扩展的存储解决方案。

在本指南中,您将为 FreeBSD 上的 ZFS 配置块存储卷,这些卷已加密以确保您的数据安全。

先决条件

  • 数据中心中支持块存储的 FreeBSD Droplet,至少有 4GB 的 RAM,因为 ZFS 往往会占用大量内存,特别是如果您对块重复数据删除感兴趣。 我们将使用默认的 freebsd 帐户,该帐户在您创建 FreeBSD Droplet 时自动创建。 要了解有关登录 FreeBSD Droplet 及其基本管理的更多信息,请查看 FreeBSD 入门 教程系列。
  • 连接到您的 Droplet 的 100 GB 卷。 您可以在创建 Droplet 时创建此卷,也可以使用 this guide 创建和附加卷。

本教程还将使用第二个 100GB 卷来演示如何将卷添加到池中,但您无需事先进行设置; 这些说明将在第 5 步的上下文中介绍。

第 1 步 — 对卷进行分区

即使我们将整个卷用于单个文件系统,在卷上放置分区图通常也是一个好主意。 这让我们可以应用我们创建的有意义的标签分区。

首先,让我们确认该卷已附加且可用。 登录到您的液滴。

ssh freebsd@your_server_ip

登录后,通过查看 dmesg 命令的输出确认卷已附加。 FreeBSD Droplet 的本地 SSD 显示为 vtbd0,任何附加的卷都将显示为 da 设备。

使用 grep 过滤 dmesg 命令的结果,用于我们附加的卷 da0。 学习更多关于grep在我们的教程中在 Linux 中使用 Grep 和正则表达式搜索文本模式 .

dmesg | grep ^da0

您将看到类似于以下内容的输出:

Outputda0 at vtscsi0 bus 0 scbus2 target 0 lun 1
da0: <DO Volume 1.5.> Fixed Direct Access SPC-3 SCSI device
da0: 300.000MB/s transfers
da0: Command Queueing enabled
da0: 102400MB (209715200 512 byte sectors: 255H 63S/T 13054C)

验证卷可用后,使用 GPT 格式创建分区映射。 执行以下命令:

sudo gpart create -s gpt da0

接下来,为 ZFS 创建一个分区。

sudo gpart add -t freebsd-zfs -l volume-nyc1-01 da0

-t 标志让我们指定分区类型,-l 选项让我们为分区应用标签。 标签可以是我们喜欢的任何东西。 在这种情况下,我们将使它与卷的名称相匹配,以帮助保持直截了当。

现在让我们保护我们将放置在此分区上的数据不被窥探。

第 2 步 — 设置加密

加密数据有很多好处,而且很容易设置。 让我们激活 aesni 驱动程序,以便我们可以使用硬件加速 AES 加密:

sudo kldload aesni

现在我们可以在分区上配置geli加密。 我们将使用 geli 命令并指定密钥长度和要加密的分区:

sudo geli init -l 256 /dev/gpt/volume-nyc1-01

-l 选项指定密钥长度,对于 AES-XTS 算法,密钥长度必须是 128 位或 256 位。 我们使用之前指定的标签来引用分区。

执行命令时,系统会提示您输入密码:

OutputEnter new passphrase:
Reenter new passphrase:

Metadata backup can be found in /var/backups/gpt_volume-nyc1-01.eli and
can be restored with the following command:

    # geli restore /var/backups/gpt_volume-nyc1-01.eli /dev/gpt/volume-nyc1-01

每当您的 Droplet 重新启动时,您都需要输入此密码来重新附加加密分区。 这是为了换取更好的安全性而带来的轻微不便。

现在附加加密分区:

sudo geli attach /dev/gpt/volume-nyc1-01

初始化分区时,系统会提示您输入密码:

OutputEnter passphrase:

这将设置 /dev/gpt/volume-nyc1-01.eli,这是分区的解密版本。 写入该块设备的数据被加密并写出到底层设备。 这是我们将附加到存储池的路径,接下来我们将创建该路径。

第 3 步 — 设置 ZFS 池

ZFS 存储池或 zpool 是卷的集合,它是 ZFS 管理其文件系统的方式。 而且它们很容易创建。 由于 DigitalOcean 卷实现了自己的数据冗余,因此无需创建多个卷并对其进行镜像,或者在 RAID-Z 配置中运行它们; 我们可以直接在池中使用单个卷。

zpool create 命令创建一个新的 zpool。 它接受池的名称和要添加到池中的卷。

sudo zpool create tank /dev/gpt/volume-nyc1-01.eli

我们为我们的池使用通用名称 tank,但您可以使用任何您喜欢的名称。

由于卷是通过网络连接的,因此文件访问将比在本地 SSD 上慢。 为了尽量减少通过网络写入设备的数据量,让我们在 ZFS 文件系统层启用压缩。 这完全是可选的,可以在每个文件系统的基础上进行设置。

我们将使用 LZ4 压缩算法,该算法针对速度进行了优化,同时仍能提供不错的压缩。 有关其他选项,请参阅 zfs 手册页。

sudo zfs set compression=lz4 tank

现在让我们看看我们的游泳池。 我们可以使用 zpool list 命令获取一些详细信息:

zpool list
OutputNAME   SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
tank  99.5G  98.5K  99.5G         -     0%     0%  1.00x  ONLINE  -

由于分区和格式化开销,池的总大小略小于总卷大小。

我们还可以使用 zfs list 命令查看该池中的 ZFS 文件系统:

zfs list
OutputNAME   USED  AVAIL  REFER  MOUNTPOINT
tank    61K  96.4G    19K  /tank

或使用 df 命令:

df -h
OutputFilesystem         Size    Used   Avail Capacity  Mounted on
/dev/gpt/rootfs     57G    2.2G     50G     4%    /
devfs              1.0K    1.0K      0B   100%    /dev
tank                96G     19K     96G     0%    /tank

您将经常使用这些命令来检查新文件系统的运行状况。

在我们继续之前,让我们确保 ZFS 内核模块在我们引导操作系统时启动。 当我们使用 sudo 运行 zpool create 命令时,模块会自动为我们加载,但如果模块自动加载会更好。

为此,请编辑文件 /etc/rc.conf

sudo vi /etc/rc.conf

在文件中任何现有行之后添加此行:

/etc/rc.conf

zfs_enable="YES"

然后将更改保存到文件中。 当服务器重新启动时,将加载 ZFS 内核模块。

ZFS 的好处之一是能够随着我们需求的增加向池中添加更多存储。 让我们探索它是如何工作的。

第 4 步 — 向池中添加额外的卷

如果我们需要更多空间,我们可以使用额外的卷来扩展池。 使用 ZFS,只需向池中添加一个额外的设备即可。

首先,我们需要另一个设备。 将一个新的 100GB 卷附加到您的 Droplet。 有关如何执行此操作的详细信息,请参阅 本指南

卷准备好后,返回服务器终端并验证新卷是否存在并已连接。 新卷将被标识为 da1

dmesg | grep ^da1
Outputda1 at vtscsi0 bus 0 scbus2 target 0 lun 2
da1: <DO Volume 1.5.> Fixed Direct Access SPC-3 SCSI device
da1: 300.000MB/s transfers
da1: Command Queueing enabled
da1: 102400MB (209715200 512 byte sectors: 255H 63S/T 13054C)

接下来,使用与第一个卷相同的过程对新卷进行分区和标记。 首先创建分区:

sudo gpart create -s gpt da1

然后创建卷:

sudo gpart add -t freebsd-zfs -l volume-nyc1-02 da1

由于您现有的卷已加密,因此请在此新卷上启用加密:

sudo geli init -l 256 /dev/gpt/volume-nyc1-02

系统将再次提示您输入密码,以便可以解密和附加卷。

OutputEnter new passphrase:
Reenter new passphrase:

Metadata backup can be found in /var/backups/gpt_volume-nyc1-02.eli and
can be restored with the following command:

    # geli restore /var/backups/gpt_volume-nyc1-02.eli /dev/gpt/volume-nyc1-02

然后附加这个新卷,并在提示时提供密码:

sudo geli attach /dev/gpt/volume-nyc1-02

最后将其添加到 ZFS 池中:

sudo zpool add tank /dev/gpt/volume-nyc1-02.eli

文件系统会自动扩展到池的大小,您可以使用以下命令进行验证:

zpool list
OutputNAME   SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
tank   199G   140K   199G         -     0%     0%  1.00x  ONLINE  -

我们可以使用 zfs list 命令仔细检查:

zfs list

输出显示 tank 卷和正确的空间量:

OutputNAME   USED  AVAIL  REFER  MOUNTPOINT
tank  62.5K   193G    19K  /tank

当您需要更多空间时,只需重复此过程即可将更多卷添加到池中。

我们已将加密分区添加到我们的池中,因此让我们看看如何在服务器重新启动后重新附加它们。

第 5 步 — 处理重启

当您重新启动服务器时,将不再附加加密分区。 您必须手动附加它们。 为了练习,让我们重新启动,以便您可以看到该过程。

使用 shutdown 命令重新启动服务器,这将断开您的 SSH 会话。

sudo shutdown -r now

您的系统可能需要大约一分钟才能重新启动。 机器重新联机后,重新登录到您的 Droplet。

ssh freebsd@your_server_ip

然后附加加密的分区。

sudo geli attach /dev/gpt/volume-nyc1-01
sudo geli attach /dev/gpt/volume-nyc1-02

附加每个分区时,系统会提示您输入在初始化该分区时输入的密码。

现在使用 zpool 查看池的结果:

sudo zpool list

附加分区后,ZFS 会自动查看池并挂载文件系统。

OutputNAME   SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
tank   199G  95.5K   199G         -     0%     0%  1.00x  ONLINE  -

如果我们没有加密卷,我们就不必担心重启期间的这些额外步骤。 我们用便利换取更高的安全性; 没有密码,没有人可以附加卷并查看内容。

结论

如您所见,ZFS 和 DigitalOcean 的块存储可以轻松创建一个可扩展的加密文件系统以满足您的需求。 您可以在 FreeBSD 手册 中了解有关 FreeBSD 上 ZFS 的更多信息。