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

介绍

<$>[warning] ** 警告:** 截至 2022 年 7 月 1 日,DigitalOcean 不再支持通过控制面板或 API 创建新的 FreeBSD Droplets。

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

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

前提条件

  • 支持区块存储的数据中心中的 FreeBSD Droplet,至少有4GB的RAM,因为ZFS往往具有非常密集的内存,特别是如果你有兴趣进行区块解 Duplication,我们将使用默认的 freebsd 帐户,当你创建一个 FreeBSD Droplet时自动创建。 要了解有关登录到您的 FreeBSD Droplet及其基本管理的更多信息,请参阅 Getting Started with FreeBSD]教程系列。
  • 附加到您的 Droplet 的 100 GB 卷。

本教程还将使用第二个100GB的体积来演示如何将体积添加到池中,但您不需要提前设置它;在步骤5中,指示将被涵盖在背景中。

步骤 1 - 分割卷

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

首先,让我们确认卷是附加和可用. 登录您的Droplet。

1ssh freebsd@your_server_ip

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

使用grep来过滤da0dmesg命令结果,这是我们附加的卷。 在我们的教程中了解更多关于grep的信息 使用grep & Regular Expressions to Search for Text Patterns in Linux

1dmesg | grep ^da0

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

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

一旦您验证了卷可用性,请使用 GPT 格式创建分区地图。

1sudo gpart create -s gpt da0

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

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

t旗允许我们指定分区类型,而l选项允许我们为分区应用标签。

现在,让我们保护我们将放置在这个分区上的数据免受困扰。

步骤二:设置加密

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

1sudo kldload aesni

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

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

-l选项指定了密钥长度,该长度必须为 128 位或 256 位 AES-XTS 算法。

当您执行命令时,您将被提示使用一个passsphrase:

1[secondary_label Output]
2Enter new passphrase:
3Reenter new passphrase:
4
5Metadata backup can be found in /var/backups/gpt_volume-nyc1-01.eli and
6can be restored with the following command:
7
8    # geli restore /var/backups/gpt_volume-nyc1-01.eli /dev/gpt/volume-nyc1-01

每当您的 Droplet 重新启动时,您将需要输入此密码,以重新连接加密分区,这是一个小小的不便,以换取更好的安全性。

现在添加加加密分区:

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

将提示您在初始化分区时输入的密码短语:

1[secondary_label Output]
2Enter passphrase:

这设置了 /dev/gpt/volume-nyc1-01.eli,这是分区的解密版本. 写在该区块设备上的数据被加密并写到底层设备上。

步骤 3 – 设置 ZFS 池

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

zpool 创建命令创建一个新的 zpool. 它包含了池的名称和您想要添加到池的音量。

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

我们正在为我们的池子使用坦克的通用名称,但您可以使用您想要的任何名称。

由于音量被连接到网络上,文件访问速度将比本地SSD慢。为了最大限度地减少通过网络写入设备的数据量,让我们在ZFS文件系统层启用压缩。

我们将使用 LZ4 压缩算法,该算法对速度进行了优化,同时仍能提供适当的压缩。

1sudo zfs set compression=lz4 tank

现在让我们看看我们的池,我们可以使用zpool列表命令获得一些详细的信息:

1zpool list
1[secondary_label Output]
2NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
3tank 99.5G 98.5K 99.5G         -     0%     0%  1.00x ONLINE  -

池的总大小略小于总体体量大小,由于分区和格式化。

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

1zfs list
1[secondary_label Output]
2NAME USED AVAIL REFER MOUNTPOINT
3tank 61K 96.4G 19K  /tank

或者用DF命令:

1df -h
1[secondary_label Output]
2Filesystem Size Used Avail Capacity Mounted on
3/dev/gpt/rootfs 57G 2.2G 50G 4%    /
4devfs 1.0K 1.0K 0B 100%    /dev
5tank 96G 19K 96G 0%    /tank

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

在我们继续之前,让我们确保ZFS内核模块在我们启动操作系统时启动。

要做到这一点,请编辑文件 /etc/rc.conf:

1sudo vi /etc/rc.conf

将此行添加到文件中的任何现有行后:

1[label /etc/rc.conf]
2zfs_enable="YES"

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

ZFS的优点之一是,随着我们的需求的增加,可以将更多的存储空间添加到池中。

步骤 4 – 向池添加额外的卷

如果我们需要更多的空间,我们可以用额外的体积来扩展池。

首先,我们需要另一个设备. 将新的 100GB 音量附加到您的 Droplet. 请参阅 此指南 有关如何做到这一点的详细信息。

一旦音量准备好了,回到服务器的终端,并验证新音量是否存在并已连接。

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

接下来,使用您在第一个卷中使用的相同过程分区并标记新卷,首先创建分区:

1sudo gpart create -s gpt da1

然后创建体积:

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

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

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

再次,您将被提示使用密码,以便可以解密和附加音量。

1[secondary_label Output]
2Enter new passphrase:
3Reenter new passphrase:
4
5Metadata backup can be found in /var/backups/gpt_volume-nyc1-02.eli and
6can be restored with the following command:
7
8    # geli restore /var/backups/gpt_volume-nyc1-02.eli /dev/gpt/volume-nyc1-02

然后添加这个新卷,在提示时提供passsphrase:

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

最后,添加到ZFS池:

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

文件系统自动扩展到池的大小,您可以通过以下命令验证:

1zpool list
1[secondary_label Output]
2NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
3tank 199G 140K 199G         -     0%     0%  1.00x ONLINE  -

我们可以用zfs列表命令进行双重检查:

1zfs list

输出显示坦克的体积和正确的空间量:

1[secondary_label Output]
2NAME USED AVAIL REFER MOUNTPOINT
3tank 62.5K 193G 19K  /tank

当您需要更多的空间时,只需重复这个过程来添加更多的体积到池中。

我们已将加密分区添加到我们的池,所以让我们看看在服务器重新启动后如何重新连接它们。

步骤5 - 处理一个重新启动

当您重新启动服务器时,加密分区将不再附加。您将需要手动连接它们。

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

1sudo shutdown -r now

您的系统可能需要大约一分钟才能重新启动. 一旦机器重新在线,请重新登录到您的Droplet。

1ssh freebsd@your_server_ip

然后连接加密分区。

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

当您附加每个分区时,将提示您在初始化该分区时输入的密码短语。

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

1sudo zpool list

一旦分区被附加,ZFS会自动看到池,并安装文件系统。

1[secondary_label Output]
2NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
3tank 199G 95.5K 199G         -     0%     0%  1.00x ONLINE  -

如果我们没有加密卷,我们不必在重新启动过程中担心这些额外的步骤。

结论

正如您所看到的,ZFS和DigitalOcean的区块存储使您可以轻松地创建可扩展的加密文件系统,以满足您的需求。

Published At
Categories with 技术
comments powered by Disqus